子类 extends 父类 所属关系 is a
提高代码复用性;让类与类之间产生关系,多态特性; 一般只支持单继承,Java支持多层继承;
具体调用时要创建最子类的对象,因为父类可能不能创建对象,子类对象可以使用更多的功能。查阅父类功能,创建子类对象使用功能
super超,指超类,相对于this,对父类的引用。
原理:方法区里子类内存除了this 引用,还有super引用。
父类子类同名函数:也叫重写,子类对象调用函数时,会运行子类函数的内容,父类函数被覆盖,但是还在方法区。重写是面向对象的
原则:不要修改以前继承的源码,可以新建类继承并升级代码
**注意:子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译失败;静态不能覆盖非静态(存在加载先后问题,因为静态在栈内存加载前就被加载了)。如果父类是private,就不能说是重写了,因为子类都无法知道父类的函数。
重载不同重写,重写父子类方法要一模一样(多态中参数类型有关系)。不允许继承中有同名但不同的方法。
子父类中的构造函数:子类对象初始化时,父类的构造函数也会运行,会访问父类空参数的构造函数。
子类构造函数(所有构造函数)有一条隐式的在第一行的语句:super();调用父类(无参数的)构造函数。所以第一行必须是super或者this。
如果父类中定义了特定的构造函数(不是空参数),那么子类的构造函数中必须要显式地添加父类的构造函数。
父类调用完的内容,子类可以直接用,不用重写例如:super(name)
*为什么子类一定要访问父类的构造函数?
子类可以直接获取父类数据,并且需要知道父类对数据进行初始化的动作(在构造函数中),所以子类要先访问一下父类的构造函数。
结论(子类的实例化过程):
1.子类中所有的构造函数默认都会访问父类中空参数的构造函数(super();)
2.如果父类中没有空参数的构造函数时,子类必须手动通过super语句访问指定的父类构造函数
3.也可以通过手动指定this语句访问本诶构造函数(因此子类中至少会有一个构造函数访问父类中的构造函数)
this、super两者语句都必须在第一行
final 可以修饰类、函数、变量。
1.被final修饰的类不可以被继承,弊端:打破了封装性。
2.被final修饰的方法不可以被复写。
3.被final修饰的变量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量(常量)。
为了避免某些调用底层的方法被继承,被子类复写功能。
后面会讲:内部类定义在类中的局部位置时,只能访问该局部final修饰的成员变量。
目前类修饰的关键字有 public、final
抽象类
当多个类中出现相同功能,但功能主体不同。这时可以向上抽取,只抽取功能定义,不抽取功能主体:abstract void study();(这个方法没有方法体)这个类必须存放在抽象类中:abstract class ***,不可以在这个类上建立对象。
特点:
1.抽象方法一定在抽象类中;
2.抽象方法和类都必须被abstract修饰
3.抽象类 不可以用new创建对象,因为调用的方法没有方法体,如果是void study (){}就可以(类和方法无abstract修饰)
4.抽象类的方法要使用,必须要由子类复写其功能并建立对象调用。**如果子类继承了父类但只是重写了父类的部分抽象方法,那么子类还是一个抽象类,子类需要加上abstract修饰符。
抽象父类强制子类复写抽象方法。
抽象类中可以没有抽象方法,但这样仅仅是不让这个类建立对象。
抽象类和一般类的不同:
1.描述事物相同,只不过事物中出现抽象方法,无法定义主题,需要在子类主体重明确出现。功能不确定的放到子类去做;
2.抽象类不可以实例化;*********!!!
获取时间:System.currentTimeMillis();API中查找。
把程序代码单独放在一个方法中进行封装(或者在不确定的时候抽象),建立子类对象,但是在子类中对不同的程序代码进行复写.直接调用子类方法即可。
为了不让获取时间的方法被复写,所以对方法用final复写。
模板方法:有一部分是确定的,一部分的不确定的。不确定的部分暴露出去(不一定抽象),由子类去完成。
接口interface:抽象类中都是抽象方法。该类可以通过接口的形式表示,不可创建对象。扩展功能。
class 是定义类 interface是定义接口
格式:interface 接口名{}
常见定义:常量,抽象方法。
接口中的成员都有固定修饰符:
常量:public static final(会在interface中自动加上)
方法:public abstract
class 类名 implements 接口(子类要将接口的全部抽象方法都实现才能实例化,否则这个类就是abstract。并且权限都要是public)
接口可以被类多实现,也是对多继承不支持的转换形式。Java支持多实现。因为接口中的方法么有方法体。
一个类继承了父类之后还能多实现接口。
接口与接口之间的关系:继承 extends。接口之间支持多继承,但是不能有返回不同类型的同名方法。
结论:将共性定义在类中,扩展功能(体系外)定义在接口中