java基础(九)继承

关键字: extends

为什么存在:

多个类存在相同属性和行为,将其放在一个父类中,其余的类只需要继承就行。
提高代码复用性

格式:

class 子类名 extends 父类名{}

eg:

Person类:

public class Person {
	private int age;
	private String name;
	
	public static void eat(){
		System.out.println("吃饭");
	}
}

Student:

public class Student extends Person{
}

Main:

public class ExtendsDemo {
	public static void main(String[] args) {
		Student st = new Student();
		st.eat();
	}
}

好处:

  1. 提高代码复用性
  2. 子类还可以在父类的基础上添加新成员
  3. 提高代码的维护性
  4. 让类与类之间产生关系,是多态的前提
    (这也是弊端,类与类的耦合性很高)

弊端:

  1. 高耦合
  2. 可以打破封装性

拓展:

开发原则:低耦合,高内聚

耦合:类与类的关系

内聚:就是自己完成某件事情的能力

Java中继承的特点

  1. java中只支持继承,不支持多继承
class zilei extends fulei,fulei2{} //这种不允许
  1. 但支持多层继承
class a 
class b extends a{}
class c extends b{}

Java中继承的注意事项

  1. 子类不能继承父类的私有成员方法
    继承非私有方法,里面如果有私有变量也可以。(打破封装性)
    Person类:
public class Person {
	private int age;
	private String name;
	
	public static void eat(){
		System.out.println(age); //私有成员变量age
	}
}

Student:

public class Student extends Person{
}

Main:

public class ExtendsDemo {
	public static void main(String[] args) {
		Student st = new Student();
		st.eat();
	}
}
  1. 子类不能继承父类的私有成员变量
  2. 子类不能继承父类的构造方法,只能通过super关键字访问
  3. 不要为了部分功能就去继承

继承适用场景:

继承体现的是一种关系: “is a”

假设法
当设计的时候需要你去分析:
比如有张三,李四类,张三 is a Person;李四 is a Person
比如有香蕉,苹果类,香蕉 is a 水果;苹果 is a 水果

那就是说如果你觉得ab都属于c的一种,就可以使用继承


继承中成员变量的关系

  1. 父类中成员变量名称与子类的不同:不冲突

  2. 若相同,变量就近原则。变量值为子类中的值

既输出局部范围的变量,还要输出本类成员范围中的变量:

父类:

public class Father {
	int num = 100;
}

子类:

public class Son extends Father{	
	int num = 50;
	
	public void show(){
		int num = 10;
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(super.num);
	}

}

Main:

public class ExtendsDemo2 {
	public static void main(String[] args) {
		Son son = new Son();
		son.show();
	}
	
}

输出为:

10 //输出的是最近的方法体中的num
50//输出的是son类中的num
100//输出的是父类中的num
关键字 寻值范围
this.num 本类中>父类
super.unm 父类
num 方法体>本类>父类

继承中构造方法的方法

  1. 子类中所有构造方法执行前都会默认访问父类中无参构造方法
  2. 为什么:子类会继承父类数据,所以子类初始化之前,一定要完成父类数据的初始化

子类的每个构造方法第一句都是:super(); 不写也会默认有

public class Student extends Person{
	public Student(){
		super();
	}
}

super(); 可以访问父类的带参构造方法

猜你喜欢

转载自blog.csdn.net/CrankyST/article/details/83825260