1.继承
1.特点
子类会自动拥有父类所有非private修饰的属性和方法
2.好处和关键字
1.继承的出现提高了代码的复用性,提高软件开发效率。
2.继承的出现让类与类之间产生了关系,提供了多态的前提。
关键字:extends
3.注意
1.类只支持单继承,不允许多继承(内部类实现多继承)
2.子类的对象调用方法和属性,子类自己有,使用子类,子类自己没有调用的父类,一直找到object
3.同名时遵循就近查找原则
2.final 关键字
1.类
final修饰的类不能有子类
2.成员变量
变量是一个终值,不能再被改变.所以在定义时必须先手动给一个值,或者是在构造函数赋值.
3.局部变量
1.被final修饰的局部变量是一个终值,不能再被改变,并且放入常量池,增加局部变量寿命
2.定义final局部变量时,不赋值使用会编译不通过。
4.方法
final修饰的方法不允许重写
3.static 关键字
被static修饰的成员变量属于类,不属于这个类的某个对象。
1.static方法
特点:只能访问静态属性和方法
使用:想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。
2.static变量
注意:static是不允许用来修饰局部变量
3.注意
对象可以使用static,但是不推荐
问题:
-
在类方法中优先使用静态的成员方法?
调用静态的成员方法比非静态的更加节省内存,因为调用非静态还需要创建对象。 -
为什么非静态可以调用静态,反之则不可以?
静态方法是属于类的,即静态方法是随着类的加载而加载的加载字节码文件时,在静态方法区创建静态的属性和方法。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,而静态方法自然不能调用一个不存在的方法。
4.抽象类
1.抽象类
- 抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类。
- 抽象类不能被实例化,也就是说我们没法直接new 一个抽象类。但是可以多态调用。
- 抽象类虽然不能被实例化,但有自己的构造方法。
- 抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承。
- 抽象类的父类可以是非抽象类
注意:一个类继承了一个抽象类,必须实现抽象类里面所有的抽象方法,否则,此类也是抽象类
2.抽象方法
-
抽象方法没有自己的主体
-
抽象方法不能用private修饰,因为抽象方法必须被子类重写。
-
抽象方法也不能用static修饰,抽象类必须通过子类实现。
-
抽象类中的非statci(静态)和非abstract(抽象)方法中的this关键字代表的是它的继承类
问题:为什么abstract不能修饰属性?
被abstract修饰的内容都是暂未被实现的,比如类、方法。
属性之所以不能被abstract修饰,是因为属性不存在"尚未被实现"的状态。
在申明变量时,int会默认给age赋予初始值0,
String会默认给name赋予初始值""。
因此属性达不到"尚未被实现的状态",
从而不能被abstract修饰。
问题:为什么抽象类不能实例化却有构造方法呢?
子类创建对象时必然要优先初始化父类的属性变量和实例方法,然后子类继承和调用。如果我们不写,编译器会自动默认一个无参构造方法。