文章目录
概念
继承的概念来源于----人工智能中的一个概念知识图谱
 如果一个实体拥有(has)一个实体,我们就将被拥有的那个实体设置为一个字段。
 student has (age,name,grade)
 teacher has (age,name,salary)

 如果我们把两个实体中的共性抽象出来。
 
 为了减少代码冗余,可以引入继承。
代码
首先我们新建一个类person.java
package ex02;
public class Person {
    private String name;
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
然后新建一个类student继承类person,使用关键字extends
 包名.extends
package ex02;
public class Student extends Person{
    private double grade;
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
}
继承冲突
如果person和son中都有name,student继承哪一个?
 java是单继承的。

 
protected
在student中做一个方法msg()
 msg可以返回一个字符串(name+age+…)
这样定义这个方法可以吗?不可以因为在person类中,name是一个private类型,只能在类内方法访问。因此我们可以使用里面的public方法get()访问我们想使用的data.
 拥有却不能直接访问。。
 
 可以这样编码。
    public String msg(){
        return this.getName() + "," + this.getAge() + "," + this.getGrade();
    }
如果我既不想让外人(student.age)访问,又可以让继承的类直接访问。
 此时就可以使用新的修饰protected.
package ex02;
public class Person {
    protected String name;
    protected int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package ex02;
public class Student extends Person{
    protected double grade;
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
    public String msg(){
        return name + "," + age + "," + grade;
    }
}
这样修饰就不会报错了。
super调用父类方法
package ex02;
public class Person {
    protected String name;
    protected int age;
    public Person(String name, int age){
        this.name  = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
super调用
package ex02;
public class Student extends Person{
    protected double grade;
    public Student(String name, int age, double grade){
        super(name, age);
        this.grade = grade;
    }
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
    public String msg(){
        return name + "," + age + "," + grade;
    }
}
person可以引用student
package ex02;
public class Student extends Person{
    protected double grade;
    public Student(String name, int age, double grade){
        super(name, age);
        this.grade = grade;
    }
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
    public String msg(){
        return name + "," + age + "," + grade;
    }
}
类型不匹配
编译时候不会发现。
package ex02;
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Student();
//        不能直接setGrade
        ((Student)p2).setGrade(3.6);
        Student s1 = (Student) p1;
        Student s2 = (Student) p2;
        s1.setGrade(3.5);
    }
}
Exception in thread "main" java.lang.ClassCastException: class ex02.Person cannot be cast to class ex02.Student (ex02.Person and ex02.Student are in unnamed module of loader 'app')
	at ex02.Main.main(Main.java:10)
转型
为什么有转型机制呢?
 可以把不同类型的对象放到一个数组里面!
 
 
进行强制转换然后开始相应的工作。










