一、继承(代码复用性)
继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
继承的基本语法:class子类 extends 父类{}
1)子类就会自动拥有父类的属性和方法
2)父类又叫超类,基类
3)子类又叫派生类
以下是一个便于更好理解继承的例子
1)首先定义一个父类Student
package object;
public class Student {
public String name;
public int age ;
public int rank;
public double score;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setRank(int rank){
this.rank=rank;
}
public void setScore(double score){
this.score=score;
}
}
2)定义pupil子类
package object;
public class pupil extends Student{
public void show() {
System.out.println("小学生的信息为:");
System.out.println(name+"\t"+age+"\t"+rank+"\t"+score+"\t");
}
}
3)定义undergraduate子类
package object;
public class undergraduate extends Student{
public void show(){
System.out.println("该大学生信息为:");
System.out.println(name+"\t"+age+"\t"+rank+"\t"+score+"\t");
}
}
4)最后定义一个test1类进行操作
package object;
public class test1 {
public static void main(String[] args) {
pupil pupil1 =new pupil();
pupil1.setName("小王");
pupil1.setAge(10);
pupil1.setRank(1);
pupil1.setScore(99);
pupil1.show();
//输出结果为
//小学生的信息为:
//小王 10 1 99.0
undergraduate n1 =new undergraduate();
n1.setName("大王");
n1.setAge(20);
n1.setRank(1);
n1.setScore(100);
n1.show();
//输出结果为:
//该大学生信息为:
//大王 20 1 100.0
}
}
引入新知识:super关键字
a)含义:super代表父类的引用,用于访问父类的属性、方法、构造器
b)用以下例子来解释其三个特点:
//先定义一个父类
package object;
public class base {
public int n1=100;
protected int n2=200;
int n3=300;
private int n4=400;
public void test1(){
}
protected void test2(){
}
void test3(){
}
private void test4()
{
}
}
1)访问父类的属性,但不能访问父类的private属性。
package object;
public class improve extends base{
public void test(){
System.out.println(super.n1);
System.out.println(super.n2);
System.out.println(super.n3);
System.out.println(super.n4);//由于n4是私有的,所以不能进行访问。
}
}
2)访问父类的方法,不能访问父类的private方法。
package object;
public class improve extends base{
public void test(){
super.test1();
super.test2();
super.test3();
super.test4();//由于test4方法是私有的,所以不能进行访问。
}
}
3)访问父类的构造器:super(参数列表),只能放在构造器的第一句,只能出现一句。
public improve(){
super();//访问父类的无参构造器。
}
c)super关键字的细节
1)调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
2)当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super(在使用super找方法时,与this和直接访问不同,在调用方法时,没有查找本类这一步骤)、this、直接访问是一样的效果!
3)super的访问不局限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类中都有同名的成员,使用super访问遵循就近原则。
插入知识:调用某方法的顺序是:
(1)先找本类,如果有,则调用。
(2)如果没有,则找父类(如果有,并可以调用,则调用)。
(3)如果父类没有,则继续找父类的父类,直到object类。
提示:如果在查找方法的过程中找到了,但不能访问,则报错;如果在查找方法的过程中,没有找到,则提示方法不存在。