作为一门面向对象语言,继承和多态是Java重要的特性。继承封装了一些公共特性,实现代码复用,减少代码冗余;多态可以动态调整对象的调用,降低对象之间的依存关系;接口是一种规范,可以通过接口实现多继承的功能。
一、继承
利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。这是Java程序设计中的一项核心技术。[java核心技术]
新建一个人物父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person {

private int age;
private String name;

public Person(int age, String name){
this.age = age;
this.name = name;
}

public void info(){
System.out.println(age);
System.out.println(name);
}

}

Teacher子类继承Person父类,关键字extends表示继承,extends表明正在构造的新类派生于一个已存在的类。已存在的类被称为超类(superclass)、基类(base class)或父类(parent class);新类被称为子类(subclass)、派生类(derived class)或孩子类(child class)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Teacher extends Person {

//默认实现无参构造并可以不写,如果父类存在带参构造,则需要显式实现此构造
public Teacher(int age, String name) {
super(22, "shen");
// TODO Auto-generated constructor stub
super.info();
}

//重写父类方法
@Override
public void info(){
System.out.println("rewrite...");
}

public static void main(String[] args) {
Teacher t = new Teacher(20, "tutu");
t.info();//子类拥有所有父类的成员变量,但private的成员变量没有访问权限
//t.age//private变量不可访问

}
}
输出结果:
22
shen
rewrite...

二、多态
实现多态有三个条件:要有继承、要有重写、父类引用指向子类对象。
父类:

1
2
3
4
5
6
7
8
9
10
public class Animal {
public void eat(){
System.out.println("eat food");

}

public void walk(){
System.out.println("walk alone");
}
}

子类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Dog extends Animal {
//重写父类方法
@Override
public void eat(){
System.out.println("eat bone");
}

public void walk(String dog1){
dog1 = "tom";
System.out.println("walk with " + dog1);
}

public static void main(String[] args) {

Animal dog = new Dog();//向上转型,父类引用指向子类对象
dog.eat();
dog.walk();
//dog.walk("jane");//只能调用父类存在的方法

Dog dd = (Dog)dog;//向下转型
dd.walk();
dd.walk("jane");
}
}

输出结果:
eat bone
walk alone
walk alone
walk with tom

多态可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
三、封装
在面向对象程式设计方法中,封装指一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。通常都使用getter和setter方法来实现,其他类要访问本类的私有成员变量都需要通过getter和setter方法。

实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Person {

private int age;
private String name;
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;
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {

public static void main(String[] args) {

Person t = new Person();
t.setAge(20);
t.setName("shen");

System.out.println("Age:" + t.getAge() + " name:" + t.getName());
}

}
输出:
Age:20 name:shen

四、抽象与接口
1、我们知道,在面向对象世界中,所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public abstract class Animal {

private String name;
private float weight;

public Animal(String name, float weight){
this.name = name;
this.weight = weight;
}

abstract void run();//抽象类不一定有抽象方法,但包含抽象方法的类一定要被声明为抽象类

public void eat(){

}
}

继承:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Cat extends Animal{

public Cat(String name, float weight) {
super(name, weight);
// TODO Auto-generated constructor stub
}

//覆盖抽象方法
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("run fast");
}

public static void main(String[] args) {

//Animal cat = new Animal("tom", 20f);//错误,抽象类不能实例化
Cat cat = new Cat("tom", 20f);
cat.run();
}

}

另注:
如果一个类包含抽象方法,那么该类必须是抽象类。
任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
2、接口
接口是抽象方法的集合。接口并不是类,一个类通过继承接口的方式,从而来继承接口的抽象方法。
实现接口必须覆盖全部抽象方法,跟抽象类相似。但是java中不能通过extends实现多继承,可以通过实现多个接口来达到多继承的目的。

1
2
3
4
public interface Person {
public void eat();
public void say();
}

实现:

1
2
3
4
5
6
7
8
9
10
11
12
public class Student implements Person {
@Override
public void eat() {
// TODO Auto-generated method stub

}
@Override
public void say() {
// TODO Auto-generated method stub

}
}

注:
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键子。
接口中的方法都是公有的。