一、概念
- 继承是面向对象的程序设计中最为重要的特征之一(三大特征为:封装、继承、多态)
- 子类(subclass)和父类或超类(superclass)存在以下关系:子类“is a”父类,即子类是一个特殊的父类。
- Java支持单继承,一个类只能有一个直接父类
- 子类可以修改父类的状态或重载父类的行为,并可添加新的状态和行为(对应着子类是一种特殊的父类)
- Java 中的继承是通过extends 关键字来实现的
class Student extends Person{}
二、Object超类
若类无extends 继承其他类,系统会默认继承java.lang.Object,其Object提供了一定的方法
如自定义了People 类,未继承其他类,系统便默认继承了Object,在eclipse可以查看到此子类所有可用的方法,其中只有sayHello是自定义的。
三、父类对象和子类对象之间的转换
1.继承使一个子类继承了父类的特征,并且附加一些新特征。子类可看成是其父类的特殊化,每个子类的实例都是其父类的实例,反过来就不行(如一个学生是一个人,一个人不一定就是学生)
2.一个父类型的变量可以给他赋一个子类实例,反过来则不行,
如Student 是 People 的子类,one和otherone 是父类实例,可以给otherone 赋一个astu 子类实例,反过来在eclipse中直接报错了,且otherone也不能直接调用Student子类里的study方法,因为在编译器里otherone仍是People,不具有study方法
要调用Student 子类里的study方法需要将otherone进行强制类型转换,如
ps:一开始觉得这有点无聊,一开始将otherone定义成Student类型不就好了,查资料发现是为了使代码更具有通用性,声明一个父类的变量用于接收子类实例对象,如用Object声明一个父类,便可接收其他子类了。
这里引申下多态:
多态:同一个实体,同时具有多种形式。最典型的例子是父类对象调用父类方法,而这个方法被子类重写了。如若Act类是核心业务类,它来使人们打招呼,用多态的方式就可以不用写多种不同对象的方法,只用用他们的父类的对象的方法即可。在test.act(new Teacher("xiaohu", 40));里,这里的内部的sayHello已被子类重载了。
class People
{
String name;
int age;
People(String aName, int age)
{
this.name = aName;
}
protected void sayHello()
{
System.out.println("Hello my name is "+this.name);
}
}
public class Teacher extends People {
public Teacher(String aName, int age) {
super(aName, age);
}
public void sayHello() {
System.out.println("I am a teacher");
}
}
public class Act {
public void act(People people) {
people.sayHello();
}
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
Act test = new Act();
test.act(new People("liming", 20));
test.act(new Teacher("xiaohu", 40));
}
四、抽象类的继承,上一篇笔记已有例子,这里只贴测试代码
package hello;
import java.util.Scanner;
import person.Person;
public class Hello
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
Student astu = new Student("Liming");
astu.sayHello("Xiao Hu");
}
}
abstract class People
{
String name;
People(String aName)
{
this.name = aName;
}
abstract void sayHello(String otherName);
}
class Student extends People
{
Student(String aName)
{
super(aName);
}
void sayHello(String name)
{
System.out.println("Hello " + name + ", I am " + this.name);
}
}