转发请在文章中提供本文的链接,谢谢!
一、 继承
1.1 继承的优缺点
*继承使得类与类之间产生了关系,即父-子类的关系。从而有效地提高了代码的复用性和可维护性,并为多态性提供了基础。
*不过,继承也带来了耦合性增强等弊端。
1.2 java的继承特点
*与C++不同,java并不支持多继承,以防止语义上出现混乱。因此,对于一个java类而言,它只能有一个直接父类。
*子类只能继承父类所有非私有(private)的成员方法和成员变量。
*子类不能继承父类的构造方法,但是可以通过super去访问父类构造方法。(注意,调用super应位于子类构造方法的最开始位置!)
1.3 super关键字
super代表了当前对象的父类的引用,在以下场景中有使用:
*①调用父类成员方法,用法:super.superMethod();
*②调用父类构造方法,用法:super();
*③调用父类成员变量,用法:……super.superField;
注意:子类中所有的构造方法默认都会访问父类中空参数的构造方法,因此如果我们只需要对父类成员进行默认初始化的话,无需显示调用super();但是,如果我们需要对父类成员执行有参初始化,或者父类本身没有无参构造方法的话,就应该显式地调用super(para……);
1.4 方法重写
*方法重写:子父类出现了一模一样的方法,此时子类就重写了父类对应的方法。
特点:
*父类中私有方法不能被重写。
*子类重写父类方法时,访问权限不能更低,最好一致。(public→public)
*父类静态方法,子类也必须通过静态方法进行重写。(static→staitc)
*子类重写父类方法的时候,最好声明一模一样。
*Q:方法重载(overload)和方法重写(override)的区别?
A: 方法重写指的是子类中出现了和父类中方法声明一模一样的方法,此时子类该方法就替代了父类对应方法的功能。这里的“一模一样”指的是返回值和参数列表完全相同;
方法重载则指的是同类中出现了方法名一样,参数列表不同的方法(同返回值没有关系)。
1.5 final关键字
* 修饰类时,类不可被继承;
* 修饰变量时,变量就变成了常量,只能被赋值一次,此后不可被修改。需要注意的是,当final修饰基本数据类型时,该变量的“值”将不可被修改;而当final修饰引用数据类型时,其引用值(地址)将不可被修改,但是该引用所指向对象的属性仍然可以修改;
* 修饰方法时,该方法不能被重写。
二、多态
2.1 什么是多态
*多态:事物存在多种形态。当父类引用指向子类对象时,会根据其实际类的不同,动态地决定调用哪个方法。
*多态的前提:①发生了继承(出现了父子类);②发生了方法重写;③父类引用指向子类对象。
2.2 多态中的成员访问特点
*成员变量:编译看左边(父类),执行看左边(父类);
*成员方法:编译看左边(父类),执行看右边(子类);
*静态方法:编译看左边(父类),执行看左边(父类);(静态与类相关,本身就没有发生重写)
2.3 多态的好处和弊端
*好处:提高了代码的维护性(由继承来保证)和扩展性(由多态来保证,比如方法接口调用时,形参为父类,实参为子类)。
*弊端:不能使用子类特有的属性和方法。
三、 抽象类和接口
3.1 抽象类的特点
*abstract来修饰类名或者方法名:
abstract class MyClass{} //抽象类
puclic abstract void myMethod();//抽象方法
*抽象类不一定有抽象方法;有抽象方法的类必定是抽象类或者接口。
*抽象类不可实例化,而是应该由其非抽象的子类来完成实例化。
*抽象类的子类,要么继续作为抽象类,要么成为非抽象类,但此时必须将父类所有的抽象方法进行了重写。
3.2 接口的特点
*这里的接口指的是java中的interface,声明方法: interface MyInterface{}
*类实现接口的办法:class MyClass inplements MyInterface{}
*接口的子类既可以是抽象类,也可以是具体类。
*一个接口可以继承多个接口;一个类可以实现多个接口;(想想原因)
3.3 接口的成员特点
*接口的成员变量:必须是常量、staitc静态的、public公共的。
*接口的构造方法:接口没有构造方法。
*接口的成员方法:必须是抽象方法。
四、 修饰符总结
4.1 四种权限修饰符
本类 | 同一个包下(子类和无关类) | 不同包下(子类) | 不同包下(子无关类) | |
---|---|---|---|---|
private | √ | |||
(默认) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
4.2 常见修饰符
* ①:修饰符主要有:
* 权限修饰符:private,默认的,protected,public
* 状态修饰符:static,final
* 抽象修饰符:abstract
* ②:类可用的修饰符:
* 权限修饰符:默认修饰符,public
* 状态修饰符:final
* 抽象修饰符:abstract
* ③:成员变量可用的修饰符:
* 权限修饰符:private,默认的,protected,public
* 状态修饰符:static,final
* ④:构造方法可用的修饰符:
* 权限修饰符:private,默认的,protected,public
* ⑤:成员方法可用的修饰符:
* 权限修饰符:private,默认的,protected,public
* 状态修饰符:static,final
* 抽象修饰符:abstract
* ⑥:常见的组合规则:
* 成员变量:public static final
* 成员方法:
* public static
* public abstract
* public final