文章目录
- 一、关于面向对象
- 二、类定义和使用
- 三、类的实例化
- 四、this引用
- 1.为什么要有this引用
- 2.什么是this引用
- 3.this引用的特性
- 4.this引用有没有可能为空
一、关于面向对象
1.概念
Java是一门纯面向对象的语言,在面向对象世界里,一切皆为对象。面向对象时解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
2.面向对象与面向过程
以传统和现代洗衣服的差别相比来举例:
传统洗衣:
注重过程,少了一个环节可能都不行,而且不同衣服洗的方式可能都不同,就会比较麻烦,按照这种方法来写代码,将来扩展或维护起来会比较麻烦。
现代洗衣服:
总共有四个对象:人、衣服、洗衣粉、洗衣机。
整个过程主要是人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机是如何具体洗衣服,如何甩干的。
以面向对象方式来进行处理,就不关注洗衣服的过程,只需要将衣服放进洗衣机,导入洗衣粉,启动开关即可,是通过对象之间的交互来完成的。
二、类定义和使用
类是用来对一个实体(对象)进行描述的。如果想要让计算机认识洗衣机,就需要将纸上的描述(头脑中的想法)采用某种计算机编程语言来给计算机进行描述。
1.类的定义格式
在Java中定义类时需要用到class关键字,具体如下:
class ClassName {field; method;
}
class为定义类的关键字,ClassName为类的名字,{}为类的主体。
类中包含的内容成为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,成为类的成员方法。
示例:
class WashMachine {public String brand;public String type;public String color;public double weight;public double length;public double width;public double height;public void WashClothes(){ System.out.println("洗衣功能");}public void dryClothes(){ System.out.println("脱水功能");}public void SetTime(){ System.out.println("定时功能");}
}
采用Java将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM基础上计算机就可以识别了。
注意事项:
1.类名注意采用大驼峰定义(这点最开始学习Java就已经说明)
2.成员前写法统一为public
3.此处写的方法不带static关键字
2.练习
1.定义一个狗类:
首先进行分析,狗的名字、毛发颜色是用来描述狗的,因此是这个类的成员变量,狗具有汪汪叫和摇尾巴的功能,所以类中包含这两个成员方法。
代码如下(示例):
class PetDog {public String name;public String color;public void barks(){System.out.println(name+": 汪汪汪~~~");}public void wag(){System.out.println(name+": 摇尾巴~~~");}
}
2.定义一个学生类:
属性:姓名、性别、年龄、成绩
方法:来上课、写作业、要考试
public class Student {public String name;public String gender;public short age;public double score;public void DoClass();public void DoHomework();public void Exam();
}
注意事项:
1.一般一个文件夹中只定义一个类
2.main方法所在的类必须要使用public修饰
3.public修饰的类必须要和文件名相同
4.不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改。
三、类的实例化
1.什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类,他们都是类(用户自定义的一种新的类型——引用类型),有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
实际上类实例化对象就类似于利用图纸建造房子,类就相当于图纸,经过工人师傅的建造,就能建造出房子(对象)。
格式:
类名 对象名称 = new 类名();
下面以PetDog类作为一个例子进行实例化:来实例化两个对象分别为阿黄和赛虎。
public class Main {public static void main(String[] args){PetDog dogh=new PetDog();dogh.name="阿黄";dogh.color="黑黄";dogh.barks();dogh.wag();PetDog dogs=new PetDog();dogs.name="赛虎";dogs.color="棕色";dogs.barks();dogs.wag();}
}
对于dogh和dogs:我们不将其称为变量,更习惯将其称为对象。
运行结果:
注意事项:
1.new关键字用于创建一个对象的实例。
2.使用 . 来访问对象中的属性和方法。
3.同一个类可以创建多个实例。
2.类和对象的说明
1.类实际上就是用来对一个实体(对象)来进行描述的,限定了类有哪些成员,比如说明书、填表格。
2.类是一种自定义的类型,可以用来定义变量,但是在java中用类定义出来的变量我们称为对象。
3.一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,储存类成员变量。
4。打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
问题:·是先有类,还是先有对象呢?(类似于先有鸡还是先有蛋)
有说法是:先要有类,因为有了类之后才可以new对象,也有说法:先要有对象,然后才有类(一般出现在类抽象的阶段)。还是要看它的场景,都可以。
四、this引用
1.为什么要有this引用
先看一个日期类的例子:
public class Date {public int year;public int month;public int day;public void setDay(int y,int m,int d){year=y;month=m;day=d;}public void printDate(){System.out.println(year+"-"+month+"-"+day);}public static void main(String[] args){Date d1=new Date();Date d2=new Date();Date d3=new Date();d1.setDay(2021,9,11);d2.setDay(2021,9,12);d3.setDay(2021,9,13);d1.printDate();d2.printDate();d3.printDate();}
}
以上代码中Main中我们创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印。
但是也会有疑问:
1.加入形参名不小心与成员变量名相同怎么办:那么函数体到底是谁给谁赋值,就会有四种情况:成员变量给成员变量,参数给参数,参数给成员变量,还是成员变量给参数。示例如下:
public void setDay(int year ,int month,int day){year=year;month=month;day=day;}
2.三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,那这两个函数是怎样知道打印的是那个对象的数据呢?
2.什么是this引用
所以this引用存在的意义就是要让成员方法知道在操作哪个对象
java编译器给每个“成员方法”增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过这些所有的操作用户是看不到的,由编译器自动完成,用户在实现代码时一般不需要显示给出。
实际程序(不需要我们自动添加):
public class Date {public int year;public int month;public int day;public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"-"+this.month+"-"+this.day);}
}
注意:this引用的是调用成员方法的对象。
3.this引用的特性
1.this的类型:对应类类型引用,即那个对象引用就是那个对象的引用类型。
2.this只能在成员方法中使用。
3.在“成员方法”中,this只能引用当前对象,不能再引用其他对象,具有final属性。
4.this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。
从字节码层面来简单证明(利用IDEA中的jclasslib查看字节码):
4.this引用有没有可能为空
Date d2=new null;
d2.printDate();
1.代码能否通过编译?
2.程序能否正常执行?
调试中出现问题:空指针异常
注意:在java当中,this引用一定不能为空。