概念
继承的概念来源于----人工智能中的一个概念知识图谱
如果一个实体拥有(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)
转型
为什么有转型机制呢?
可以把不同类型的对象放到一个数组里面!
比如要做疫情管理,用学生也有老师,然后有不同的处理方法。
我们就可以实用转型去处理这个问题!
进行强制转换然后开始相应的工作。