面向对象-day02
10.2.2. this关键字
局部变量和成员变量同名,此时在方法中调用变量时根据就近原则,优先使用局部变量,示意图如下。
可以看出setName方法中两次使用的name,都是直接寻找距离自己最近的形参name,就相当于把参数name的值设置给参数name,根本就没有把参数值设置给成员变量。
使用 this.变量名 的语法,此时访问的就是成员变量,this的其他操作,后面再讲。
11.1.继承语法
public class 子类名 extends 父类名{
}
注意:Java中类只支持单继承,但是支持多重继承。也就是说一个子类只能有一个直接的父类,父类也可以再有父类。
11.2. 方法覆盖
11.2.1. 方法覆盖操作
当子类存在一个和父类一模一样的方法时,我们就称之为子类覆盖了父类的方法,也称之为重写。那么我们就可以在子类方法体中,重写编写逻辑代码。
方法的调用顺序:
精华:直接拷贝父类中方法的定义粘贴到子类中,再重新编写子类方法体,打完收工!
11.2.2. super关键字
在子类中的某一个方法中需要去调用父类中被覆盖的方法,此时得使用super关键字。
public class Ostrich extends Bird{
public void fly() {
System.out.println("扑扑翅膀,快速奔跑...");
}
public void say() {
super.fly();//调用父类被覆盖的方法
fly();//调用本类中的方法
}
}
11.3.2. 抽象方法和抽象类
使用abstract修饰的方法,称为抽象方法。
public abstract 返回类型 方法名(参数);
特点:
-
使用abstract修饰,没有方法体,留给子类去覆盖
-
抽象方法必须定义在抽象类或接口中
使用abstract修饰的类,成为抽象类。
public abstract class 类名{
}
特点:
-
抽象类不能创建对象,调用没有方法体的抽象方法没有任何意义
-
抽象类中可以同时拥有抽象方法和普通方法
-
抽象类要有子类才有意义,子类必须覆盖父类的抽象方法,否则子类也得作为抽象类
11.4. Object类和常用方法
Object本身表示对象的意思,是Java中的根类,要么是一个类的直接父类,要么就是一个类的间接父类。
boolean equals(Object obj):拿当前调用该方法的对象和参数obj做比较
基本数据类型没法调用equals,只能引用类型用
在实际开发中,我们通常是通过比较两个对象中的成员变量舸值是否相等,来判断两个对象是否相同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abVZLA1I-1597223798579)(E:\内网通下载\笔记\img\image-20200812161646555.png)]
官方建议:每个类都应该覆盖equals方法去比较我们关心的数据,而不是内存地址。
- String toString():表示把对象中的字段信息转换为字符串格式
打印对象时其实打印的就是对象的toString方法
Person p = new Person();
p.setName("will");
p.setAge(17);
System.out.println(p);
System.out.println(p.toString());
其中:
System.out.println(p); 等价于 System.out.println(p.toString());
打印格式如:
com.JA.Person@15db9742
官方建议:应该每个类都应该覆盖toString返回我们关心的数据,如:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
此时打印对象,看到的是该对象的字段信息。
Person [name=will, age=17]
== 符号到底比较的是什么:
-
比较基本数据类型:比较两个值是否相等
-
比较对象数据类型:比较两个对象是否是同一块内存空间