【第7章】继承和多态


一、类的继承

1、继承:从已有类派生出新类。子类继承父类的非私有的成员变量和成员方法。
2、类继承的实现:使用extends 关键字

[public] class 子类 extends 父类{}

3、方法覆盖
概念:子类可以定义与父类中的名字、参数列表、返回值类型都相同的方法,即覆盖或重写了父类的方法。(可以理解成形式一样,但实现不同内容)
注意点:
①子类不能覆盖超类的private方法。
②父类中static方法可以被继承,但不能被覆盖。
4、防止类扩展和方法覆盖-----final关键字

1final 修饰类
	final class AA{}	//final类,不能被继承
2final 修饰方法
	public final void M(){}		//final修饰的方法不能被子类覆盖
3final 修饰变量
	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()覆盖了父类的方法
			//体现了多态和动态绑定
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值