2020-03-06继承

子类 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。接口之间支持多继承,但是不能有返回不同类型的同名方法。

结论:将共性定义在类中,扩展功能(体系外)定义在接口中

你可能感兴趣的:(2020-03-06继承)