1、为什么使用继承
-
两个类之间有很多共同点,代码冗余较多,可以使用继承减少代码冗余
2、如何使用继承
-
编写父类,父类中有子类所共有的属性和方法
-
编写子类,子类继承父类的属性和方法,可以添加子类独有的属性和方法
-
使用extends关键字建立继承关系
-
public class Student extends People { }
-
-
注意:
-
父类也可以称之为超类,子类可以叫做派生类
-
一个子类只能有一个父类,一个父类可以有很多子类
-
父类和子类是相对来说的,只有父与子之间才叫继承,爷爷和孙子没有继承
-
符合is-a的关系的类可以使用继承优化
-
3、子类不能继承父类的构造方法
-
子类不能继承父类的构造方法
-
子类的构造方法中默认调用父类无参的构造方法
-
如果给父类添加了带参构造方法后不添加无参构造方法,子类可能会报错,因为调用不到父类的构造方法了
-
-
继承后初始化顺序
-
父类属性--->父类构造方法--->子类属性--->子类构造方法
-
4、super关键字
-
类似this关键字,但是this指向的是“这个对象”,super指向的是“父类”
-
可以使用super关键字访问父类的属性和方法及构造方法
-
主要用于区分该成员是父类提供的还是子类自己定义的(方法重写)
-
如果成员变量和局部变量没有重名就不需要使用this
-
如果子类没有重写父类方法,就不需要使用super关键字
-
-
super和this一样都要写在方法的第一句话
-
子类的所有构造方法中,都默认添加了super();
5、子类不能继承的东西
-
构造方法
-
父类的私有成员(private修饰)
-
子类与父类不同包,父类中使用默认访问权限的成员
6、方法重写
-
什么时候使用重写
-
父类中的方法不能满足子类的需要,子类重写父类方法
-
-
重写的要求
-
必须具有相同的方法名
-
必须有相同的参数列表
-
必须有相同返回值类型
-
子类中方法的访问权限不可以比父类更严格
-
-
重写的优点
-
可以保证代码的一致性,方便我们查找及维护
-
-
不能被继承的部分不会被重写(构造方法、不可访问成员)
-
子类对象在调用方法时,优先调用自身重写过的方法,而非父类的同名方法
7、抽象类
-
//某些类不应该被实例化,可以将其设置为抽象类,抽象类不能被实例化 public abstract class Pet { }
-
可以将父类定义为抽象类,目的是限制实例化。
-
抽象类不能被实例化,即不能用new生成实例
-
-
abstract关键字可以修饰类、方法
-
abstract修饰的类是抽象类,抽象类不能被实例化
-
abstract修饰的方法是抽象方法,抽象方法没有方法体,在子类中必须被重写,除非子类也是抽象类
-
-——————————————标记 网络断开 笔记已记全
-
-
抽象类中可以有普通类的成员(属性、普通方法、构造方法等)
-
如果父类是抽象类,它的构造方法虽然无法通过new调用,但是可以在子类中使用super调用
-
-
抽象方法只能放在抽象类中,不能放在普通类中【也就是说抽象类中可以有普通方法,抽象方法必须在抽象类里】
8、final关键字
-
final修饰的变量变常量
-
final修饰的类不可被继承(例如:String类)
-
public final class Pet { }
-
-
final修饰的方法不能被重写
-
public final void eat(){ }
-
9、父类子类类型转换
-
类是对象的类型
-
基本数据类型存在类型转换
-
//基本数据类型的类型转换:1.数据类型互相兼容 2.大类型转小类型(强制)/小类型转大类型 int a = 1; double b = 2.0; a = (int)b; b = a;
-
-
引用数据类型也存在相似的转换,仍然需要满足”数据类型互相兼容“这一条件,比如父类和子类
-
父类是大类型
-
子类是小类型
-
Pet pet = new Pet();//范围大 Dog dog = new Dog();//范围小 pet = dog; dog = (Dog)pet;
-
//父类引用指向子类对象 Pet pet = new Dog();//自动类型转换 //pet.lookDoor();//虽然new的是一个Dog,但是装进了Pet中就只能Pet的方法,不能使用Dog独有的方法 pet.eat();//调用是Dog的eat方法
-
-
当父类引用指向子类对象时
-
只能调用父类中定义的方法
-
如果调用的方法被子类重写了,本质上是调用子类的方法
-
-
如果要从父类转换成子类,必须保证父类中真正存储的是一个子类对象
-
Student stu = (Student) (new People);//错误
-
People people = new Student();//真正存的是student Student student = (Student) (people);//把people中真正存储的student转换成student
-