廖雪峰Java2面向对象编程-3继承和多态-1继承
Posted singleSpace
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰Java2面向对象编程-3继承和多态-1继承相关的知识,希望对你有一定的参考价值。
1.继承
![](https://image.cha138.com/20210524/d67833b34f744518a2a2fc2cdc4dbb5a.jpg)
![](https://image.cha138.com/20210524/b6b593d2c6ea43e294b55568817ae35d.jpg)
2.protected
上例中Person类定义的private字段无法被子类访问,用protected修饰的字段可以被子类访问。
protected把字段和方法的访问权限控制在继承树内部
Person.java
public class Person /*extends Object */{
protected String name; //将name的修饰符更改为protected
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!");
};
}
Student.java
public class Student extends Person{
private int score;
public void setScore(int score){
this.score = score;
}
public int getScore(){
return this.score;
}
public String hello(){
return "Hello, " + this.name; //引用name
}
}
public class Hello {
public static void main(String[] args){
Person ming = new Person();
Student hong = new Student();
ming.setName("小明");
hong.setName("小红");
ming.run();
System.out.println(hong.hello());//引用hello方法
hong.run();
}
}
3.继承关系中的构造方法
编写Person类时,可以编写构造方法,或由编译器自动生成构造方法。由于子类包含有父类的所有功能,必须手动调用父类的构造方法。
Java语言规定,子类的构造方法第一行语句必须调用父类的构造方法。调用方式是super();
如果我们没有写super(),编译器会自动生成super()。如果父类没有默认的构造方法,此时编译器自动生成的构造方法会报错,因为父类的构造方法必须传入参数。此时我们需要显式的写上super,传入参数。
Person.java
public class Person /*extends Object */{
protected String name;
private int age;
public Person(){ //默认的构建方法
this.name = "王重阳";
}
public Person(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!");
};
}
Student.java
public class Student extends Person{
public Student(){
//根据父类默认的构建方法,自动生成super();
}
public Student(String name){
super(name);
}
private int score;
public void setScore(int score){
this.score = score;
}
public int getScore(){
return this.score;
}
}
Hello.java
public class Hello {
public static void main(String[] args){
Student p = new Student("林朝英");
Student s = new Student();
p.run();
s.run();
}
}
![](https://image.cha138.com/20210524/52693024c45645a5b51c45752fe2047a.jpg)
![](https://image.cha138.com/20210524/d27c93740cf94cbebea541c8859febd6.jpg)
/*Person实例p可能指向Person实例,也可能指向Student实例。向下转型为Student很有可能报错。如果变量p指向的实际类型并不是Student实例,JVM运行时会抛出ClassCastException的错误。*/
Person p = new Person("tom");
Student s2 = (Student) p;
s2.run();
![](https://image.cha138.com/20210524/54473c3ec1f146db971178c16f553e7b.jpg)
Student s = new Student("jack");
System.out.println(s instanceof Person);
System.out.println((s instanceof Student) + "\\n");
Student n = null;
System.out.println(n instanceof Object);
System.out.println(n instanceof Person);
System.out.println(n instanceof Student);
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190114213553125-21523129.png" width="500" />
使用instanceof修改向下转型代码
```#java
Person p = new Person("tom");
Student s = new Student("jack");
Person ps = s;
if(p instanceof Student) { //只在类型正确时转型,避免异常
Student s2 = (Student) p;
s2.run();
}
![](https://image.cha138.com/20210524/47277bf1570e449d8dc0bee8a88c4ad5.jpg)
6.总结:
继承是面向对象编程的一种代码复用方式。
Java只允许单继承
protected允许子类访问父类的字段和方法
子类的构造方法可以通过super()调用父类的构造方法
可以安全地向上转型为更为抽象的类型
可以强制向下转型,最好借助instanceof判断
子类和父类的关系是is,has关系不能用继承
以上是关于廖雪峰Java2面向对象编程-3继承和多态-1继承的主要内容,如果未能解决你的问题,请参考以下文章