Java类再生
1、在新类里简单地创建原有类的对象。我们把这种方法叫作“合成”
2、它创建一个新类,将其作为现有类的一个“类型”,我们可以原样采取现
有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”
合成的语法
为进行合成,我们只需在新类里简单地置入对象句柄即可
class WaterSource {
private String s;
WaterSource() {
System.out.println("WaterSource()");
s = new String("Constructed");
}
public String toString() { return s; }
}
class SprinklerSystem {
WaterSource waterSource;
WaterSource source = new WaterSource();
void print() {
System.out.println("waterSource = " + waterSource );
System.out.println("source = " + source );
}
}
public static void main(String[] args) {
SprinklerSystem x = new SprinklerSystem();
x.print();
}
WaterSource 内定义的一个方法是比较特别的: toString()
大家不久就会知道,每种非基本类型的对象都有一个 toString()方法
在类内作为字段使用的基本数据会初始化成零。但对象句柄会初始化成 null。
而且假若试图为它们中的任何一个调用方法,就会产生一次“违例”
继承的语法
在类主体的起始花括号之前,需要放置一个关键字 extends, 在后面跟随“基础类”的名字,
若采取这种做法,就可自动获得基础类的所有数据成员以及方法
初始化基础类
涉及到两个类—— 基础类及衍生类
在衍生类的构建器中, Java 会自动插入对基础类构建器的调用。
class Art {
Art() {
System.out.println("Art constructor");
}
}
class Drawing extends Art {
Drawing() {
System.out.println("Drawing constructor");
}
}
class Cartoon extends Drawing {
Cartoon() {
System.out.println("Cartoon constructor");
}
} ///:
public class Main {
public static void main(String[] args) {
Cartoon x = new Cartoon();
}
}
结果:
Art constructor
Drawing constructor
Cartoon constructor
基础类会在衍生类访问它之前得到正确的初始化。
到底选择合成还是继承
在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“合成”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习 OOP 的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它相反
使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用合成还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。在下一章里(多形性),会向大家介绍
必须进行上溯造型的一种场合。但只要记住经常问自己“我真的需要上溯造型吗”,对于合成还是继承的选
择就不应该是个太大的问题。
f i n a l 关键字
1、f i n a l 数据
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,我们不希望它发生变化
2、final 自变量
将自变量设成 final 属性,方法是在自变量列表中对它们进行适当的声明。这意味着在一
个方法的内部,我们不能改变自变量句柄指向的东西
int g(final int i)
个人建议:如果不是对象引用其实不用final修饰,值又不能传递回去
但是是对象的引用,就很有必要修饰了,无论谁一看就知道此引用不能修改对象的值
3、f i n a l 方法
1)第一个是为方法“上锁”,防止任何继承类改变它的本来含义。类内所有 private 方法都自动成为 final
2)编译器就可以把对那个方法的所有调用都置入“嵌入”调用里 感觉和c++ 的inline很像
4、f i n a l 类
表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作
网友评论