Java编程中组合、继承和代理的区别
最近在看《Java编程思想》这一本书,看到第7章复用类,学习的时候查了查网上的资料,感觉都说得不是很清楚,就来说说我的看法。
复用类即实现代码复用的类,Java中大概分为三种:组合、继承、代理(实际Java没有提供对代理的直接支持)。
- 组合:要使用A类的方法,为了不改变其原有结构,在一个新的类B中创建A类的一个对象a,以创建的这个对象a来调用A类的方法。
- 继承:要使用A类的方法,不改变其原有结构,创建一个类B,继承自A,这个类B拥有A类的所有方法和属性,并能自身做扩展,拥有A所没有的属性和方法。
- 代理:要使用A类的方法,不改变其原有结构,在一个新的类B中创建A的对象a,并且在B中创建方法fb,方法内部是a调用A类的方法,但是使用时是B的对象调用其自身方法fb。
下面来看例子():
1.组合
//组合
//:multiplexing/Getresult.java
class Calculater {
Calculater() {
System.out.println("use composition");
}
int Sum() {
int res = 0;
for (int i = 0; i < 1000;i++) {
res += i;
}
return res;
}
}
public class Getresult {
private Calculater cal;
public Getresult(){
cal = new Calculater();
}
public static void main(String[] args) {
Getresult result = new Getresult();
System.out.println(result.cal.Sum());
}
}/*output
use composition
499500
*/
2.继承
//:multiplexing/GetresultInheritance.java
public class GetresultInheritance extends Calculater{
GetresultInheritance(){
System.out.println("use inheritance");
}
public static void main(String[] args) {
GetresultInheritance result = new GetresultInheritance();
System.out.println(result.Sum());
}
}
/*output
use inheritance
499500
*/
3.代理
//:multiplexing/GetResultProxy.java
public class GetResultProxy {
private Calculater cal = new Calculater();
public long GetSum(){
System.out.println("use proxy");
return cal.Sum();
}
public static void main(String[] args) {
GetResultProxy result = new GetResultProxy();
System.out.println(result.GetSum());
}
}
/*output
use proxy
499500
*/
那么三种复用方式的访问权限又是怎样的呢?组合是调用类
1.组合
public class Getresult {
private Calculater cal;
public Getresult(){
cal = new Calculater();
}
public static void main(String[] args) {
Getresult result = new Getresult();
System.out.println("use compositon");
result.cal.B();
result.cal.C();
}
}
class Calculater {
Calculater() {
}
private void A () {
System.out.println("private method");
}
protected void B() {
System.out.println("protected method");
}
public void C() {
System.out.println("public method");
}
}/*output
use compositon
protected method
public method
*/
2.继承
public class GetresultInheritance extends Calculater{
GetresultInheritance(){
System.out.println("use inheritance");
}
public static void main(String[] args) {
GetresultInheritance result = new GetresultInheritance();
result.B();
result.C();
}
}/*output
use inheritance
protected method
public method
*/
3.代理
public class GetResultProxy {
private Calculater cal = new Calculater();
public void B() {
cal.B();
}
public void C() {
cal.C();
}
public static void main(String[] args) {
GetResultProxy result = new GetResultProxy();
System.out.println("use proxy");
result.B();
result.C();
}
}/*output
use proxy
protected method
public method
*/
可以看到,实际上三种方式都只能访问protected和public方法,调用private方法则会报错。虽然组合使用的是该类的成员对象调用方法,但是Java的private成员方法只支持包含该方法的类内部访问。