java_关于继承

继承:
现实世界中:
通过分析多种类型发现有一些共同特征和共同行为,再将这些种类归为一种新类型

如: 黄种人
    白种人
    黑种人
可以定义为人类

计算机语言中:
先编写父类,再编写子类,然后才有对象

某个类(子类)可以从另一个类(父类)中继承一些成员变量和方法,子类还可以添加自己独有的成员变量和方法

 子类,也叫派生类
 父类,也叫超类,基类

关键字:extends
语法格式:

    public class subClass extends superClass{

    }

继承中的构造器:
子类不能继承父类的构造器,但是子类中的构造器可以调用父类的构造器:super(有参传参);
作用:可以更好地给继承过来的成员变量赋值

子类中的构造器一定会有一个调用的父类的构造器
父类中如果没有无参构造器,子类需要显示调用父类构造器
有无参构造器,子类中的构造器可能隐式调用了父类的构造器,即隐藏了super();

super()与this()的区别:
相同点:都调用构造器,而且必须放在首行首句
不同点:super()调用父类的构造器,
this()调用本类其他的构造器

继承的传递性:
继承特征有传递特性,B类型继承了A类型的特征,C类型继承了B类型的特征..C类型间接继承了A的特征
继承的另外一个特点:
单继承:一个子类只能继承一个父类,但是,一个父类可以有多个子类

设计一个人类型Person
设计一个学生类型Student
创建对象,测试
/**父类Person*/
public class Person {
    String name;
    int age;
    char gender;
    public Person(String name,int age,char gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public void eat(String food){
        System.out.println(name+"喜欢吃"+food);
    }
    public void sleep(){
        System.out.println("Person类中的行为");
    }
}
/**编写子类Student,并写main()方法测试*/
public class Student extends Person{
    int score;
    public Student(String name,int age,char gender,int score){
        super(name,age,gender);
        this.score = score;
    }
    public void sleep(){
        System.out.println("Student类中的行为");
    }
    public void study(){
        System.out.println("非常喜欢学习");
    }
    public static void main(String[] args) {
        Person p = new Student("张三",22,'男',99);
        p.eat("面包");
        p.sleep();//输出的是:Student类中的行为  即运行时调用的是Student中的方法
        //p.study();Person类中没有这个方法
    }
}

一个源文件中只能有一个public修饰的类,而且此类必须与文件名一致,其他类不用修饰词

方法的重写(override):
子类可以继承父类放入方法,在继承时,我们可以在子类中编写与父类中的方法名相同的,参数列表页相同的方法,这就是重写

(1)父子类关系,方法名相同,参数列表相同
(2)返回值类型可以相同,也可以不同[子类方法的返回值类型必须是父类方法的返回值类型的子类]

父类型的变量可以引用子类型的对象;
如:
Person p = new Student(“张三”,22,’男’,99);
Person类型的变量p引用了子类型Student的对象

编译期绑定:
在编译期间,变量只能调出本类型的方法
运行期绑定:
在运行期间,真正执行的方法的逻辑与对象的类型有关

方法在运行期间动态绑定到对象上,在编译期间方法静态绑定到变量(类型)上
成员变量的调用与变量的类型有关系(与编译期和运行期无关)

在创建子类对象时,在内存中会不会产生父类对象?
1..会,没有父类对象,哪来子类对象
这里写图片描述
2..不会,创建子类对象时,子类对象的成员变量包含两部分
一部分为父类中继承来的,在成员变量前有默认的super.
一部分是自己的 在成员变量前有默认的this.
这里写图片描述
如果子类独有的与父类继承过来的变量重名时,必须显式指定使用super.或this.
为了避免吗不必要的麻烦,子类的成员变量尽可能不和父类的成员变量同名

猜你喜欢

转载自blog.csdn.net/yc_hen/article/details/81346869