1 继承
共性抽取,多态的前提。
1.1 格式:
public class Fu{ ... }
public class Zi extends Fu{... }
1.2 继承后的成员变量
1.2.1 成员变量不重名
无任何影响,正常使用。
1.2.2 成员变量重名
如果父类和子类的成员变量重名,则在子类方法中访问子类的变量可直接访问,如需访问父类中的重名变量,则需使用super关键字,使用方式类似于this。(PS:子类不能访问父类的私有成员变量。)
1.3继承后的成员方法
1.3.1 成员方法不重名
正常使用,先在子类中查找,没有则向父类查找。
1.3.2 成员方法重名
此时的访问叫做方法重写。
方法重写:子类中出现与父类中的方法一样(三要素相同),子类的方法会覆盖父类的方法。声明不变,重新定义。
重写的注意事项:子类的方法权限必须大于等于父类,方法三要素相同。
1.4 继承中的构造方法
1.子类无法继承父类的构造方法。
2.子类的构造方法中默认有super();调用父类的构造方法。
3.父类先构造,子类后构造;子类先析构,父类后析构。
class Fu{ ... }
class Zi extends Fu{
//super(),调用父类构造方法
super();
System.out.println("Zi()");
}
1.5 继承的特点
1.Java中不能多继承。
2.Java中可以多级继承。
2 super 和 this
2.1 父类空间优先于子类对象产生
父类空间先产生,子类对象空间包含父类空间,即拥自己的空间和可以访问父类的空间。如果有了private,则不能访问父类的这些私有成员。在代码中的体现为子类构造方法第一行super();优先构造父类。
2.2 super 和 this含义及用法
含义:
1.super:代表父类,可以当成父类的引用。
2.this:代表调用的对象,为调用对象的引用。
用法:
1.访问成员:
this.成员变量‐‐本类的
super.成员变量‐‐父类的
this.成员方法名()‐‐本类的
super.成员方法名()‐‐父类的
2.访问方法:
this(...)‐‐本类的构造方法
super(...)‐‐父类的构造方法
3 抽象类
抽象类是包含抽象方法的类,而抽象方法是没有方法体的方法。
3.1 抽象方法和抽象类的格式
抽象方法:
修饰符 abstract 返回值类型 方法名(参数列表);
抽象类:
public abstract class 类名字{}
3.2 抽象的使用
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
3.3 注意事项
1.抽象类不能创建对象。
2.抽象类可以有构造方法。(供子类继承时构造父类使用,子类构造方法中有默认的super();)
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
4.抽象类的子类,必须重写抽象父类中所有的抽象方法。除非子类也为抽象类。
4 接口
4.1 概述
接口是Java中的另一个引用类型,它不是类。内部主要封装了方法,包括抽象方法,默认方法,静态方法,私有方法。
4.2 接口的格式
定义接口:
public interface 接口名称{
//抽象方法
//默认方法
//静态方法
//私有方法
}
定义其中的方法和常量:
public interface InterFace Name{
public abstract void method1();//抽象方法
public default void method2(){
//执行语句
} //默认方法
public static void method3(){
//执行语句
} //静态方法
private void method4(){
//执行语句
} //私有方法
private static void method()5{
//执行语句
} //私有静态方法
public static final NUM = 10; //定义常量
}
注意事项:
1.抽象方法的abstract关键字可省略。
2.默认方法的default关键字不可省略,供子类调用或重写。
3.静态方法供接口直接调用。
4.私有方法供接口中的默认方法调用。
5.私有静态方法供接口中的静态方法调用。
4.3 实现
非抽象类实现(类似继承)接口:
public interface InterFace Name{
public abstract void method();//抽象方法
public default void method(){
//执行语句
} //默认方法
public static void method2(){
//执行语句
} //静态方法
private void method(){
//执行语句
} //私有方法
class 类名 implements 接口名{
//重写接口中抽象方法【必须】
//重写接口中默认方法【可选】
}
可直接通过实现类的对象调用方法使用抽象方法和默认方法。
静态方法只能通过接口调用。
私有方法供接口中的默认方法调用。
私有静态方法供接口中的静态方法调用
4.4 接口的多实现
4.4.1 格式
继承不能多实现,但是接口的实现却可以多实现,即一个实现类可以实现多个接口。
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3...{
//重写接口中抽象方法【必须】
//重写接口中默认方法【不重名时可选】
}
4.4.2 抽象方法重名
如果多个接口有重名的抽象方法,则实现类必须重写该抽象方法。
4.4.3 默认方法重名
如果多个接口有重名的默认方法,则实现类必须重写该默认函数。
4.4.4 静态方法重名
如果多个接口有重名的静态方法,不必重写该静态方法,因为静态方法只能通过接口调用。
4.4.5 优先级问题(父类和接口的默认方法重名)
如果多个接口的默认方法和实现类的父类中的成员方法重名,则优先调用父类的成员方法
。
PS:接口没有构造方法,不能创建对象,并且没有代码块。
5 多态
5.1 多态的格式
父类类型 变量名 = new 子类对象;
变量名.方法名();
5.2 引用类型转换
5.2.1 向上转型
父类引用指向子类对象,默认的。(类似于基本数据类型的自动转化)
父类类型 变量名 = new 子类类型();
5.2.2 向下转型
父类类型向子类转换的过程,强制的。(类似于基本数据类型的强制转换)
子类类型 变量名 = (子类类型) 父类变量名;
5.3 instanceof
在向下转型中会出现错误。(例如Cat向上转型为Animal,那这个Animal不能向下转型为Dog)
instanceof关键字就是用来判断该对象属不属于该数据类型。
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true
如果变量不属于该数据类型,返回false。
PS:
Fu fu = new Zi();
fu.成员变量;
fu.成员方法;
编译看左(Fu fu),运行看右(Zi())。