一、类的继承
1、继承:从已有类派生出新类。子类继承父类的非私有的成员变量和成员方法。
2、类继承的实现:使用extends 关键字
[public] class 子类 extends 父类{}
3、方法覆盖
概念:子类可以定义与父类中的名字、参数列表、返回值类型都相同的方法,即覆盖或重写了父类的方法。(可以理解成形式一样,但实现不同内容)
注意点:
①子类不能覆盖超类的private方法。
②父类中static方法可以被继承,但不能被覆盖。
4、防止类扩展和方法覆盖-----final关键字
1、final 修饰类
final class AA{} //final类,不能被继承
2、final 修饰方法
public final void M(){} //final修饰的方法不能被子类覆盖
3、final 修饰变量
public static final int size=10; //常量,只能使用,不能修改
final int j = i+1; //只能给final变量赋一次值,之后不能修改
super关键字
1、super:引用当前对象的父类对象
super用于三种情况:
1、在子类中调用父类中被覆盖的方法:super.父类方法([参数])
2、在子类中调用父类的构造方法,super([参数])
3、在子类中访问父类中被隐藏的成员变量,super.被隐藏的成员变量
第2点强调:
子类不能继承父类的构造方法,但必须 保证子类能调用父类的构造方法 (即在创建子类对象时,要先创建父类所有的对象)。
1)子类构造方法中可以自己写 super([参数]) 来调用父类的构造方法;
2)如果没有写,编译器也会自动在子类构造方法的第一句 加上super(),表示调用super()父类默认的构造方法 。
3)this()可以调用本类的其他构造方法,也放在构造方法的第一句,不能和super()同时存在
二、类的封装性
1、封装性的理解:调用者不用知道类或对象是怎么实现的,只需知道怎么使用就可以了。
访问修饰符----->类和类成员访问权限----->封装性
2、类的访问权限
1)默认的(即不使用修饰符):被 同一个包中的类使用
2)用public,表示公共类:可被任何其他类使用
3、类成员的访问权限
1)private:只能由类本身访问
2)默认:同一包中的类可访问
3)protected:同一包和不同包的子类访问
4)public:任何类可访问
三、抽象类★
1、抽象类:使用abstract修饰,包含抽象方法,作用是相当于给子类提供公共接口
抽象方法:只有声明,没有实现,使用abstract修饰
//eg:
public abstract class Shape{ //抽象类Shape
public Shape(){} //默认构造方法。抽象类不能被实例化,不能用new创建抽象类的对象
public abstract double getArea(); //定义抽象方法,以分号结尾
}
public class Circle extends Shape{ //定义具体的类继承抽象类
private double radius;
...
@Override
public double getArea(){
return Math.PI*radius*radius; //实现抽象类的抽象方法
}
}
由于方法覆盖要求格式严格一致,可以在子类的方法之前加上 @Override注解,表示下面声明的方法是对父类中方法的覆盖,如果格式错了,编译器会给出错误提示。
要点总结:
1、抽象类不能用new实例化;
2、抽象类只能定义抽象方法,具体的实现在子类中;定义了多少个抽象方法,子类就要实现多少个。
四、类的多态
1、对象转换:子类对象和父类对象在一定条件下可以相互转换。
分为自动转换(向上转换)和强制转换(向下转换)
重点关注向上转换:父类 父类对象 = new 子类()
强制转换要求:自动转换过一次了,才能强制转换回来;不能直接转换
补充:
instanceof运算符:测试一个实例是否是某种类型(类、接口等)的实例
用法:对象 instanceof 类。判断对象是不是类的实例,结合自动转换和继承关系判断
2、多态:Java程序中一个类或多个类中可以定义多个同名方法,完成不同的操作
(静态多态:方法重载;动态多态:方法覆盖)
方法绑定:将方法调用与方法体关联起来
后期绑定或动态绑定:在程序运行时根据对象的类型进行绑定,Java中除static方法和final方法外都是后期绑定。
//eg:前面的抽象类 + 多态和动态绑定
public abstract class Shape{ //抽象类Shape
public Shape(){}
public abstract double getArea(); //定义抽象方法
}
public class Circle extends Shape{ //定义Circle类继承抽象类
private double radius;
...
@Override
public double getArea(){
return Math.PI*radius*radius; //实现抽象类的抽象方法
}
}
public class Square extends Shape{ //定义Square类继承抽象类
private double length;
...
@Override
public double getArea(){
return length*length; //实现抽象类的抽象方法
}
}
public class Demo{
public static void main(String[] args){
Shape shapes[] = new Shape[2];
double sumArea = 0;
shapes[0] = new Circle(10); //子类对象给父类对象赋值,向上转换
shapes[1] = new Square(10);
for(Shape shape :shapes){
System.out.println(shape.gatArea());
//根据对象类型调用不同的getArea()方法,即不同的对象的getArea()覆盖了父类的方法
//体现了多态和动态绑定
}
}
}