面向对象的基本特征:
1、继承(inherite)
-
生活中,继承财产,基因,文化。。。
-
继承:延续、扩展
2、关键字:extends
3、继承的作用
- (1)代码的复用
- (2)代码的扩展
4、什么情况下需要继承?
-
(1)当我们编写新的类型时,发现已有的类型中有我们需要的事物的全部特征(属性、方法),这个时候就可以考虑使用继承。
- 并且我们要求新的类型是旧的这个类型的子集,即is-a的关系。
- 例如:Student is a Person. Student类别是Person类别的子集。
-
(2)当我们编写了多个类后,发现这几个类有共同的特征(属性、方法),这个时候我们可以考虑抽象出一个公共的父类出来。
- 抽取出的这个公共的父类,可以简化代码(相同部分不用重复写),还可以用父类的类型统一管理众多的子类的对象。
-
总结:无论从上至下,还是从下往上,都是说明一点,父类中是所有子类的共同的特征。
5、如何实现继承
- 语法格式:
- 【修饰符】 class 子类名 extends 父类名{
}
- 【修饰符】 class 子类名 extends 父类名{
6、继承的特点
-
(1)父类的所有的属性、方法都会继承到子类中。
- 关于私有的属性和方法是否可以被继承到子类中?
- A:从在子类中可直接访问的角度来说:不能
- B:从子类具有的事物特征来说:可以
-
即在子类对象的堆内存中,需要分配对应的内存,需要存储它的值,
-
(2)父类的构造器无法继承到子类中。
-
(3)子类的构造器中“必须”调用父类的构造器。
-
默认情况下,调用父类的无参构造。
-
如果父类没有无参构造,那么子类“必须手动”调用父类的某个有参构造。使用super(实参列表)调用父类的有参构造。
-
为什么要调用父类的构造器?
- 要为从父类继承的属性进行初始化,那么父类的构造器中已经写了对应初始化代码,我们子类就不用重复,调用一下就可以了。
-
-
(4)Java只支持单继承==>即只有一个亲生父亲
-
(5)Java支持多层继承==>父类还可以有父类
-
(6)一个父类可以同时有多个子类==》一个父亲可以同时有多个孩子
- 子类还可以有子类 ==》代代相传
-
(7)子类可以扩展父类没有的特征(属性和方法)
-
(8)子类还可以对父类的“方法”进行“重写”
public class TestInherited {
public static void main(String[] args) {
Student stu = new Student("张三",20,90);
stu.eat();
System.out.println(stu.getInfo());
}
}
class Animal{
public void eat(){
System.out.println("吃");
}
}
class Person extends Animal{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(){
System.out.println("父类Person的无参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age;
}
}
class Student extends Person{
private int score;
//无参构造
public Student(){
super();//调用父类的无参构造,如果表示调用父类的无参构造的话,这句话可以省略。
//super(null,0);//手动调用父类的有参构造
}
public Student(String name, int age, int score) {
super(name, age);//调用父类的有参构造,为从父类继承的name和age属性初始化
// this.name = name;//错误的,因为name和age是私有的
// this.age = age;
this.score = score;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}