枫叶「零碎记录」

Java基础之三大特性

字数统计: 1.3k阅读时长: 5 min
2017/11/12 Share

Java有三大特性继承、封装、多态

继承

  1. 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
  2. 子类拥有父类非private的属性和方法。
  3. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  4. 子类可以用自己的方式实现父类的方法。
  • 我们知道,构造器是不能被继承的,只许被调用!

需要注意的是,子类是依赖于父类的(这也说明了一个弊端,即继承是一种强耦合关系),子类拥有父类的非private属性和方法(弊端二:破坏了封装),所以父类应先于子类被创建。

所以当父类没有默认构造器时,子类需要指定一个父类的构造器,并且写于子类构造器的第一行!当然父类有默认构造器,子类就无需super了,Java会自动调用。

  • 再说protected关键字。插一句,只有合理使用访问修饰符,程序才能更好的为我们服务!

对于子类,为了使用父类的方法,我们可以修改它的访问修饰符为protected,而不是一股脑儿的写上public!一劳永逸的做法可能会带来更大的危害!

而对于类的成员变量,继续保持它的private!

  • 最后是向上转型了,它是一个重要的方面。从上面的的代码中,我写上了Person person = new Yang(“yang”, “male”, 23); 这样结果是将Yang向上转型为Person,带来的影响可能就是属性和方法的丢失,但是它将是安全的。

同时它最大的作用是…..子类能够提供父类更加强大的功能以适用于不同的场合,完成不同的操作。

不太清楚可以看看这两个: List arrayList = new ArrayList<>(); 和 List linkedList = new LinkedList<>();

我们知道ArrayList是数组实现,查找更快;而LinkedList是链表实现,添加元素和删除元素效率更好!

但是向上转型有一个弊端,指向子类的父类引用因为向上转型了,它将只拥有父类的属性和方法,同时子类拥有而父类没有的方法,是无法使用了的!

所以,继承实现了软件的可重用性和可拓展性。但是Java是单继承的,并且继承也有多个弊端(上面有提),其实还有一个弊端是父类一旦改变,子类可能也得进行改变!所以慎用吧。

封装

  1. 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问。
  2. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。
  3. 可以对成员变量进行更精确的控制。(在setter方法中进行实际意义的校验)

对于封装的思想,我们需要尽可能的隐藏内部细节,只保留一些对外操作。

多态

多态性就是不同的子类型可以对同一个请求做出不同的操作。同时多态性分为编译时多态性和运行时多态性,对应着方法重载overload和方法重写override!
对于方法重写,存在在继承中。它作为运行时多态性的表现,首先需要子类继承和实现父类的方法,然后向上转型,父类引用子类对象,对同一件事作出不同的响应。

方法重写时,需要注意的是子类的访问修饰符的访问范围不能小于父类,如父类的一个方法修饰符为protected,那么子类继承时,只能选用public或者protected。除了访问修饰符,其余完全相同于父类!

对于方法重载,出现在同一个类中,它是编译时多态性的表现。定义为:同名的方法如果有不同的参数列表便视为重载。

最后有一道经典的题目作为结尾

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
55
56
57
58
59
public class A {
public String show(D obj) {
return ("Father and D");
}
public String show(A obj) {
return ("Father and Father");
}
}
class B extends A {
public String show(B obj) {
return ("Child and Child");
}
public String show(A obj) {
return ("Child and Father");
}
}
class C extends B {
}
class D extends B {
}
class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
结论:
1--Father and Father
2--Father and Father
3--Father and D
4--Child and Father
5--Child and Father
6--Father and D
7--Child and Child
8--Child and Child
9--Father and D
CATALOG
  1. 1. 继承
  2. 2. 封装
  3. 3. 多态