继承:extends
在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。
格式:
class 子类 extends 父类 {}
继承的特点:
- 在Java中,类只支持单继承,不允许多继承。相当于一个儿子只能有一个爸爸。
错误示例:
class A{}
class B{}
class C extends A,B{} // C类不可以同时继承A类和B类
- 多个类可以继承一个父类。相当于一个爸爸可以有多个儿子。
正确示例:
class A{}
class B extends A{}
class C extends A{} // 类B和类C都可以继承类A
- 在Java中,不能多继承,但是可以多层继承,即一个类的父类可以再去继承另外的父类。
class A{}
class B extends A{} // 类B继承类A,类B是类A的子类
class C extends B{} // 类C继承类B,类C是类B的子类,同时也是类A的子类
- 在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类。例如上面的这种情况中,B类是A类的子类,同时又是C类的父类。
继承中成员变量的特点:
- 子类只能获取父类非私有成员
- 就近原则:谁离我近我 就用谁
- super:可以获取父类的成员变量和成员方法,用法和this是相似的
方法重写(override):只有有子父类关系 才会存在 所有东西全部相同
方法重载(overload):方法名相同 参数列表不同 与返回值无关
方法重写的应用场景:
当父类的方法不能完全满足子类使用的时候,既可以保留父类的功能(沿袭、传承),还可以有自己特有的功能。
方法重写的注意事项:
不可以重写父类私有的成员方法,压根就看不到父类的私有成员。
子类重写父类方法,权限必须大于等于父类方法的权限。
继承中构造方法的执行顺序
-
A:super(实参列表);语句 在子类的构造方法中使用,用来调用父类中的构造方法(具体哪一个由传递的参数决定),并且只能在构造方法第一行使用
-
B:this(实参列表); 语句 在类的构造方法中使用,用来调用本类中的其它构造方法(具体哪一个由传递的参数决定),并且只能在构造方法的第一行使用
/*
* 继承中构造方法的执行顺序
* 在子父类中,创建子类对象,调用子类的构造方法,
* 在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
* 为什么要调用父类构造?
* 因为需要给父类的成员变量初始化
* 肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码
*
* 我是父类无参构造 --- 我是子类有参构造 --- 我是子类无参构造
*/
public class ExtendsDemo6 {
public static void main(String[] args) {
//Die d = new Die();
Zi6 z = new Zi6();
}
}
class Die6 {
public Die6() {
System.out.println("我是父类无参构造");
}
public Die6(int num) {
System.out.println("我是父类有参构造");
}
}
class Zi6 extends Die6 {
public Zi6() {
//super(1);
//super();
this(1);//不会再调用父类的无参构造了
System.out.println("我是子类无参构造");
}
public Zi6(int num) {
//会默认调用父类无参构造
System.out.println("我是子类有参构造");
this 与 super 的区别
/*
* this和super的区别
this:当前对象的引用
调用子类的成员变量
调用子类的成员方法
在子类的构造方法第一行调用子类其他构造方法
super:子类对象的父类引用
调用父类的成员变量
调用父类的成员方法
在子类的构造方法第一行调用父类的构造方法
*/
public class ExtendsDemo7 {
public static void main(String[] args) {
Zi z = new Zi();
z.function();
}
}
class Die {
int num = 10;
public Die() {
System.out.println("我是父类无参构造");
}
public Die(int num) {
System.out.println("我是父类有参构造");
}
public void method() {
System.out.println("我是父类的方法");
}
}
class Zi extends Die {
//int num = 30;
public Zi() {
//this(1);//第一行不调用子类其他构造或者是父类构造,默认调用父类无参构造
super();
System.out.println("我是子类无参构造");
}
public Zi(int num) {
System.out.println("我是子类有参构造");
}
public void method() {
System.out.println("我是子类的方法");
}
public void function() {
//this.num = 50;
//System.out.println(num);
//this.method();
//super.num = 40;
//super.method();
System.out.println(this.num);
}
}
继承优缺点
- A:优点 提高了代码的复用性 提高了代码的可维护性
- B:缺点: 类的耦合性增强了 开发的原则:高内聚低耦合
内聚:就是自己完成某件事情的能力
耦合:类与类的关系