面向对象特征二:继承性
方法的重写
super关键字
子类对象的实例化过程

一.继承性

1.为什么要有继承性:
  有一些东西拥有某些公共的特性, 将他们相同的部分抽取出来放在一起, 方便代码的复用与修改
2.通过"class A extends B"类实现类的继承:
  子类: A; 父类(或基类SuperClass): B
3.子类继承父类以后, 父类中声明的属性、方法, 子类就可以获取到.
  明确: 当父类中有私有的属性或方法时, 子类同样可以获取得到, 只是由于封装性的设计, 使得子类不可以直接
调用
罢了.
  子类除了通过继承, 获取父类的结构之外, 还可以定义自己的特有的成分.
extends:子类是对父类功能的“扩展”, 明确子类不是父类的子集.
4.Java中类的继承性只支持单继承: 一个类只能继承一个父类. 反之, 一个父类可以有多个子类.
5.子父类是相对的概念.

二.orverwrite or override

方法的重载与重写的区别?

重载: “两同一不同”: 同一个类, 同一个方法名, 不同的参数列表. 注: 方法的重载与方法的返回值无关!
构造器也是可以重载的
重写: (前提: 在继承的基础之上, 子类在获取了父类的结构以后, 可以对父类中同名的方法进行“重构”)

  • 方法的返回值, 方法名, 形参列表形同;
  • 权限修饰符不小于父类的同名方法;
  • 子类方法的异常类型不大于父类的;
  • 两个方法要同为static或同为非static.

三.super

1.super: 相较于关键字this, 可以修饰属性、方法、构造器
2.super修饰属性、方法: 在子类的方法、构造器中, 通过"super.属性"或者"super.方法"的形式, 显式的调用父类的指定属性或方法. 尤其是, 当子类与父类有同名的属性、或方法时, 调用父类中的结构的话, 一定要用“super.”
3.通过“super(形参列表)”, 显式的在子类的构造器中, 调用父类指定的构造器!
  任何一个类(除Object类)的构造器的首行, 要么显式的调用本类中重载的其它的构造器“this(形参列表)”或显式的调用父类中指定的构造器“super(形参列表)”, 要么默认的调用父类空参的构造器"super()"
"super(形参列表)"或"this(形参列表)"只能出现一个
  建议在设计类时, 提供一个空参的构造器!

四.子类对象的实例化

先构建(调用父类的构造器构建)父类的内容, 再构建子类的内容

为了直观的理解, 可以运行一下代码, 看输出的结果:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//子类对象实例化的全过程
public class TestDog {
public static void main(String[] args) {
Dog d = new Dog();
d.setAge(10);
d.setName("小明");
d.setHostName("花花");
System.out.println("name:" + d.getName() + " age:" + d.getAge()
+ " hostName:" + d.getHostName());
System.out.println(d.toString());
}
}
// 生物
class Creator {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Creator() {
super();
System.out.println("this is Creator's constructor");
}
}
// 动物类
class Animal extends Creator {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Animal() {
super();
System.out.println("this is Animal's constructor");
}
}
// 狗
class Dog extends Animal {
private String hostName;
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public Dog() {
super();
System.out.println("this is Dog's constructor");
}
}

输出结果为:

1
2
3
4
5
this is Creator's constructor
this is Animal's constructor
this is Dog's constructor
name:小明 age:10 hostName:花花
Dog类的对象dd在堆空间内的信息

评论