Java面向对象的继承——简明教程

 

本章我们来解释Java面向对象的继承,继承树,继承关键字protected和super,向上转型,向下转型,区分继承和组合。

一、java类的继承

如果我已经定义了Man类,现在要定义一个Student 类,那关于Man类中的字符name和age是不是也要重复定义?其实是不用的,所以在java中可以使用类的继承让Student 类继承Man类。Java使用extends关键字来实现继承。 例如:

public class Hello {
public static void main(String[] args) {
Student st = new Student();
st.setScore(89);
st.setName("Saisi");
System.out.println(st.getName()); //Saisi
System.out.println(st.getScore()); // 89

}

}

class Man {
private String name;
private int age;

public String getName() {
	return this.name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return this.age;
}

public void setAge(int age) {
	this.age=age;
}

}

class Student extends Man {
	private int score;

public void setScore(int score) {
		this.score = score;
}

public int getScore() {
	return this.score;
}
}

二、继承数

在Java中,没有明确写extends的类,编译器会自动加上extends Object。Man也是继承类,继承Object,除了Object,都会继承自某个类,因为只有Object特殊,它没有父类。

如图:

1、protected 关键字

因为在Man类中的字段是私有的,外部不能访问。所以当要在Man的子类中输出或者是返回Man中的字段时就会出错。这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问。

class Student extends Man {
private int score;
public String hi() {
		return "Hello, " + name; // OK!
}
}


public class Hello {
public static void main(String[] args) {
Student st = new Student();
st.setScore(89);
st.setName("Saisi");
System.out.println(st.hi()); //Hello, Saisi

}

}

2、super关键字

super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName。不过,这里使用super.name,或者this.name,或者name,效果都是一样的。编译器会自动定位到父类的name字段。 但是,要注意的是,子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承。所以要记得,任何class的构造方法,第一行语句必须是调用父类的构造方法,否则会出错。

例如1:

public String hi() {
return "Hello, " + super.name; // OK!
}

例子2:

public class Hello {
public static void main(String[] args) {
// 调用
Student st = new Student("Sali",12,23);
System.out.println(st.getName()); //Sali

}

}

class Man {
protected String name;
protected int age;
// 构造方法
public Man(String name , int age) {
				this.name = name;
				this.age = age;
		}

public String getName() {
			return this.name;
}

public int getAge() {
			return this.age;
}

}


class Student extends Man {
private int score;
// 子类的构造方法
public Student(String name, int age, int score) {
// 第一行一定是调用父类的构造方法
// 如果父类不是无参数的构造方法,所以要带参
super(name,age);
			this.score = score;
	}


public int getScore() {
		return this.score;
}
}

三、向上转型

因为 Student是从Man继承下来的,所以个引用类型为Person的变量,能否指向Student类型的实例?结果是行得通的,在java程序中这叫做向上转型。Sigoyi(真厉害),子类向上转型了。

例如:

Student s = new Student();
Man m = s; //子类向上转型
Object o1 = s; 

四、向下转型

与上面相反的,就是父类类型强制转型为子类类型。但是向下转型的时候,由于子类的功能属性都比父类型的多,所以为了避免向下转型出错,Java提供了instanceof操作符,先判断一个实例究竟是不是某种类型。

例如:

Man m1 = new Student();
Man m2= new Man ();
Student s1 = m1 // ok m1--->指向Student 
Student s2 = m2 //出错 m2--->Man

Man p = new Man ();
if (p instanceof Student) { // ture
    // 只有判断成功才会向下转型:
    Student s = p; 
}
本文为博主原创文章,知识共享,开源精神,转载注明出处。