基础知识
- 来源于人工智能中的knowledge grap,就是is与has的关系,学生是人,但人不一定是学生,他是有方向的
- 在同名包下的两个类可以有相互继承,需要用到extends
package e2 public class Person { protected String name; protected int age; public Person(String name, int age) { this.name = name; this.age = age; } 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; } }package e1; public class Student extends Person{ private double grade; public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } }如果在这时候加一个方法
public String msg(){ return name+","+age+","+grade; }按照我们的思路是没有问题的(就是一起返回嘛),但是会报错.why?唯一原因就是你引用的Persion包中对这两个属性定义的是private,这就代表这俩只可以在Persion中正常调用(就像getGrade那样),外部是无调用的,这就引出了新的访问权限的修饰就是protected,他就可以允许子孙后代调用了
构造方法
这时,我们想在e1的Student中加一个构造方法
public Student(String name, int age, double grade) { super(name,age) this.grade = grade; }super其实就是把调用父类的构造方法,在没有super且父类也没有无参构造方法的情况下,编译器其实会在即加一个super并同步的在父类中加一个空的构造方法,这时编译器不会报错,知道运行后才会因为空方法而报错,为什么不直接写三个this.呢?emmm,这不父类有嘛,省事喽
转换
Person p1 = new Person(); Person p2 = new Student(); Student s1 = (Student) p1; Student s1 = (Student) p2;你可以正常写Persion p2 = new Student(),但是你如果想直接p2.setGrade(3.2)是不行的,因为编译器会认为p2是Persion类的,而其中并没有这个,所以只能强转((Student)p2).setGrade(3.2),当然,你同样可以写Student s1=(Student)p2,但是Student s1=(Student)p1就不行,因为编译看左边,运行看右边p1还是Persion的对象,强转直接崩溃,可以用System.out.println(p1 instanceof Student);来判断是哪类,他也可以处理继承