super关键字
1.super可以调用父类的属性,但是不能访问私有属性
2.super可以调用父类的方法,但是不能访问私有方法
3.对于任何子类构造器,如果没有用this()本类构造器会默认引用无参构造器super(),如果想调用父类的其他构造器则需要传入相应的参数
4.调用父类构造器的好处(分工明确,父类属性由父类初始化,子类属性由子类初始化)
5.如果调用super.方法名(),则是直接向上查找,不去查找本类的这个方法。
6.多个上级类则遵循就近原则
继承的原理
1.如果子类中没有这个属性或者方法会依次向上寻找,如果上级有则访问,如果是私有的或者不存在这个属性或者方法会接着向上查找,直到找到object类
2.当子类的方法属性和父类的属性方法重名的时候,为了访问父类的成员,可以通过super
方法的重写(override)
1.子类有一个方法和父类的某个方法名称,返回类型,参数一样,那么我们则说这个子类的方法覆盖了父类的方法
2.子类如果返回的参数是父类返回参数的子类,那么也构成重写
public Object fuMethod{
return null;
}
public String ziMethod{
return null;
}
这样可以(๑•̀ㅂ•́)و✧
3.子类不能缩小父类方法的访问权限,重写的时候,如果父类是public,子类不能写protected,但是子类可以扩大父类的访问权限
多态
1.方法或者对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承之上的。通过不同的参数调用不同的重载的方法。
2.多态的规则
- 一个对象的编译运行和运行类型可以不一样,也可以一致
Animal animal =new dog();
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看=号左边,运行看=号的右边
- 运行时执行的是运行类型而不是编译类型
动态绑定机制
- Java的动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性的时候,没有动态绑定机制,哪里申明,哪里使用
- 在向上引用的情况,如果调用方法,则是调用子类的方法,但是调用属性则是父类的属性
- 如果子类没有那个方法就去父类方法里面查找,这时候当调用对象属性的时候则是调用父类的属性
多态数组
- 数组的定义类型为父类类型,里面保存的实际元素为子类类型
public class PolyArray {
public static void main(String[] args) {
//要求现在有一个继承结构,要求创建一个Person对象,
//两个Student对象,两个Teacher对象,统一放到一个数组里面
//并调用每个对象的say方法
Person[] personArray =new Person[5];
personArray[0]=new Person("jack",20);
personArray[1]=new Student("jack",20,100);
personArray[2]=new Student("smith",19,60);
personArray[3]=new Teacher("scott",30,5000);
personArray[4]=new Teacher("king",30,65000);
for (int i = 0; i < personArray.length; i++) {
System.out.println(personArray[i].say());
//这个时候是根据运行类型调用相应的方法
}
}
}
2.如果想要调用子类对象的特有方法,必须使用向下转型,转换成子类的类型
package poly_.polyarr;
public class PolyArray {
public static void main(String[] args) {
//要求现在有一个继承结构,要求创建一个Person对象,两个Student对象,两个Teacher对象,统一放到一个数组里面
//并调用每个对象的say方法
Person[] personArray =new Person[5];
personArray[0]=new Person("jack",20);
personArray[1]=new Student("jack",20,100);
personArray[2]=new Student("smith",19,60);
personArray[3]=new Teacher("scott",30,5000);
personArray[4]=new Teacher("king",30,65000);
for (int i = 0; i < personArray.length; i++) {
//这个时候是根据运行类型调用相应的方法
System.out.println(personArray[i].say());
//如果想要调用子类的特有的方法 ,判断运行类型如果是Student
if(personArray[i] instanceof Student){
//向下转型,转完之后就可以调用方法
((Student) personArray[i]).study();
}
if(personArray[i] instanceof Teacher){
((Teacher) personArray[i]).teach();
}
}
}
}
多态参数
- 方法定义的形参类型为父类类型,实参类型允许为子类类型
package polyparameter;
import javafx.concurrent.Worker;
public class PolyParameter {
public static void main(String[] args) {
worker tom =new worker("tom",2500);
manager milan = new manager("milan", 5000, 20000);
PolyParameter a=new PolyParameter();
a.showEmpAnnual(tom);
a.showEmpAnnual(milan);
a.testWork(tom);
a.testWork(milan);
}
public void showEmpAnnual(Employee e){
System.out.println(e.getAnnualSalary());
}
//添加一个testwork方法,如果是普通员工调用work方法,如果是经理调用manage方法
public void testWork(Employee e){
if(e instanceof worker){
((worker) e).work();
}
else if(e instanceof manager){
((manager) e).manage();
}else {
System.out.println("不处理");
}
}
}
Object类详解
equals
- equals方法:
- ==是一个比较运算符
- 既可以判断基本类型是否相等,去判断值是否相等
- 也可以判断引用类型是否相等,去判断是否指向了同一个对象
- equals是object类的一个方法,只能去判断引用类型,判断两个对象是否是同一个对象。子类中往往重写了该方法, Integer和String都重写了equals方法,用于判断内容是否相等
- 查看源码的方法ctrl+b
hashcode
- 返回该对象的哈希码值
- 提高具有哈希结构的容器的效率,两个引用如果指向了同一个对象,那么哈希值肯定一样,如果两个引用指向了不同的对象,则哈希值是不一样的,哈希值主要是根据地址来计算,但是不能将哈希值等价为地址
- 实际上,hashcode方法是将该对象的内部地址转化成一个整数来实现的
toSring
- 返回该对象的字符串表示,默认返回包名加类名加哈希值的十六进制
- toString方法一般会被重写
- 当直接sout(对象名),默认调用对象.toString方法
断点调试
- 整个断点调试状态中,是运行状态,是以对象的运行类型来执行的
- 断点调试的快捷键
- F7 跳入方法内
- F8 跳过
- shift+F8 跳出方法
- F9 执行到下一个断点