加入收藏 | 设为首页 |

吉林银行-Java编程思维:组成与承继的结合

海外新闻 时间: 浏览:336 次

许多时分都要求将组成与承继两种技能结合起来运用。下面这个比如展现了怎么一起选用承继与组成技能,然后创立一个更杂乱的类,一起进行必要的构建器初始化作业:

//: PlaceSetting.java 
// Combining composition & inheritance
class Plate {
Plate(int i) {
System.out.println("Plate constructor");
}
}
class DinnerPlate extends Plate {
DinnerPlate(int i) { super(i);
System.out.println( "DinnerPlate constructor");
}
}
class Utensil {
Utensil(int i) {
System.out.println("Utensil constructor");
}
}
class Spoon extends Utensil {
Spoon(int i) {
super(i);
System.out.println("Spoon constructor");
}
}
class Fork extends Utensil {
Fork(int i) {
super(i);
System.out.println("Fork constructor");
}
}

class Knife extends Utensil {
Knife(int i) {
super(i);
System.out.println("Knife constructor");
}
}

// A cultural way of doing something:
class Custom {
Custom(int i) {
System.out.println("Custom constructor");
}
} 吉林银行-Java编程思维:组成与承继的结合
public class PlaceSetting extends Custom {
Spoon sp;
Fork frk;
Knife kn;
DinnerPlate pl;
PlaceSetting(int i) {
super(i + 1);
sp = new Spoon(i + 2);
frk = new Fork(i + 3);
kn = new Knife(i + 4);
pl = new DinnerPlate(i + 5);
System.out.println( "PlaceSetting constructor");
}
public static void main(String[] args) {
PlaceSetting x = new PlaceSetting(9);
}
} ///:~ 吉林银行-Java编程思维:组成与承继的结合

虽然编译器会逼迫咱们对根底类进行初始化,并要求咱们在构建器最最初做这一作业,但它并不会监督咱们是否正确初始化了成员目标。所以对此有必要特别加以留心。

姓名的躲藏

只要C++程序员或许才会惊奇于姓名的躲藏,由于它的作业原理与在C++里是彻底不同的兰研。假如Java根底类有一个办法名被“过载”运用屡次,在衍生类里对那个办法名的从头界说就不会躲藏任何根底类的版别。所以不管办法在这一级仍是在一个根底类中界说,过载都会收效:

//: Hide.java 
// Overloading a base-class method name
// in a derived吉林银行-Java编程思维:组成与承继的结合 class does not hide the
// base-class versions

class Homer {
char doh(char c) {
System.out.println("doh(char)");
return 'd';
}
float doh(float f) {
System.out.println("doh(float)");
return 1.0f;
}
}
class Milhouse {}

class Bart extends Homer {
void doh(Milhouse m) {}
}
class Hide {
public static void main(String[] args) {
Bart b = new Bart();
b.doh(1);
// doh(float) used
b.doh('x');
b.doh(1.0f);
b.doh(new Milhouse());
}
} ///:~

咱们很少会用与根底类里彻底一致的签名和回来类型来掩盖同名的办法,不然会使人感到利诱(这正是C++不允许那样做的原因,所以可以避免发生一些不必要的过错)。