iwehdio的博客园:https://www.cnblogs.com/iwehdio/
1、继承
多个类有共同的成员变量和成员方法(行为和属性),将其共性抽取到另外一个类(父类)中,再让多个类去继承这个父类,这样多个类就可以获取到父类的成员。
-
所使用的关键字:
extends
。 -
格式:
class LOL extends Game{}
。 -
Java中继承的特点:
- 只支持单一继承,只能继承一个父类。
- 支持多层继承,即可以继承父类的父类。
-
继承中成员变量的特点:
-
子类可以获取父类的非私有成员,无法获取私有成员。
-
子类和父类的成员变量名字不同,可以直接获取父类的成员变量。
-
父类和子类中出现同名成员变量,按就近原则使用子类中的成员变量。
-
super
关键字,可以代表父类对象,获取父类的成员变量和成员方法。例:public class Demo { public static void main(String[] args){ Kid k = new Kid(); k.getName(); } } class Dad { String name = "A"; } class Kid extends Dad { String name = "B"; public void getName() { String name = "C"; System.out.println(super.name); System.out.println(this.name); System.out.println(name); } } /*输出为 A B C */
输出顺序按照就近原则为:局部变量 > 子类成员变量 > 父类成员变量。
-
-
继承中成员方法的特点:
- 方法的重写:在子父类中,子类的方法和父类的方法完全不同,子类重写(覆盖)了父类的方法。此时子类对象调用的是子类的方法。
- 重写后想调用父类方法同样可以用
super
关键字。 - 子类没有重写,则调用父类的方法。
-
方法重写的应用场景:
- 父类方法不能完全满足子类的使用。这个时候重写并用
super
关键字调用父类的功能。这样既保有父类的功能,也拥有子类的功能。
- 父类方法不能完全满足子类的使用。这个时候重写并用
-
注解:
@
,一般写在方法、类或变量上方。用于规范化描述方法、类或变量。Override
表示下方的方法是重写父类方法,如果父类中没有此方法或参数列表不同会提示。
-
方法重写的注意事项:
- 不能重写父类私有的方法,如果子类中方法名与父类中的私有方法相同,这两个方法也只是名称相同,没有重写关系。
- 满足第1条下,重写时子类的方法权限必须大于等于父类的方法权限(也就是说子类要更加开放)。
-
继承中构造方法执行的顺序:
- 在有子父类继承关系的类中,创建子类对象,调用子类的构造方法。如果子类构造方法第一行代码没有调用子类或父类的构造方法,则会默认调用父类的无参构造。
- 可以在子类的构造方法第一行用
super(参数);
调用父类的有参 / 无参构造。 - 可以在子类的构造方法第一行用
this(参数);
调用子类的其他构造方法。 - 调用顺序一定是先调用父类的构造方法,因为子类的构造方法中可能会用到父类的成员变量。
-
this
和super
的区别:this
是对当前对象的引用。可以调用子类成员方法与变量,在子类的构造方法第一行调用子类其他构造方法。- 当子类中没有成员变量
a
而父类中有时,this.a
调用的是父类中的成员变量。 super
是子类对象的父类引用(不是父类对象)。可以调用父类成员方法与变量,在子类的构造方法第一行调用父类的构造方法。
-
继承的优缺点:
- 提高了代码的复用性和可维护性。
- 增加了类的耦合性,违反了高内聚低耦合的开发原则。
-
final
关键字,修饰的类不能被继承,修饰的变量不能被修改(常量),修饰的方法不能被重写。final int num = 10;
2、抽象
-
abstract
关键字,用于修饰抽象方法和类。 -
抽象方法:不同类方法相似但具体内容不同,只抽取声明而没有具体的方法体。
- 抽象方法必须在抽象类中。
- 一个类继承抽象类,继承时必须重写所有抽象方法,除非这个类也是抽象类。(非抽象方法可以不重写)。
-
抽象类的特点:
- 抽象类不能创建对象,不能实例化。
- 抽象类中可以有非抽象方法。
- 一个类继承抽象类,要么重写所有抽象方法,要么这个类也是抽象类。
-
抽象类的成员特点:
- 可以有成员变量 / 常量。
- 可以有抽象 / 非抽象方法。
- 可以有构造方法。
-
抽象类注意事项:
abstract
关键字不能与final
、private
关键字共存。- 抽象类有构造方法,用于对成员变量进行初始化。
- 抽象类也可以没有抽象方法,用于不能被实例化的类。
-
例:
public class Demo { public static void main(String[] args) { BasicTeacher bt = new BacisTeacher(); bt.teach(); } } abstract class Teacher { String name; public abstract void teach(); } class BasicTeacher { @Override public void teach() { System.out.println(name + "Basic"); } }