========时间:2019-03-24 20:42:39========
今天写了下面这样一段代码
/*
*其中PrintView和HzPrintView是我写的两个类
*且HzPrintView extends PrintView
*/
PrintView printView;
if (isEnglish == true){
printView = new PrintView(psm);
}
else {
printView = new HzPrintView(psm);
}
由于这个代码段我用了很多个地方,当时我就想能不能用方法包装起来,直接调用。下面是我的错误思路:
首先我想到的是把对象引用变量作为参数传进方法,然后在方法中实例化,仔细一想,不行!!!如果我把它作为参数传进方法中,根据java参数是传值的机制,传进去的是对象引用变量的地址(此时为NULL),然后在方法中实例化后,方法里面的引用地址改变了,而方法外的并没有改变,没有达到目的。
然后,我又想可不可以return一个对象出来。这个时候有两种可能情况,一种是return一个PrintView对象,另一种是return一个HzPrintView对象。怎么做?用多态?根据经验,先来个小的demo试试可行性。
package Demo;
public class TestDemo {
public static void main(String[] args) {
TestClass1 t;
t = test(2);
System.out.println(t.getI());
System.out.println(t.getJ); //这里报错,无getJ方法
}
public static TestClass1 test(int flag){
if (flag == 1){
return new TestClass1();
}
else {
return new TestClass2();
}
}
}
class TestClass1{
private int i;
public int getI() {
return i;
}
TestClass1(){
i=1;
}
}
class TestClass2 extends TestClass1{
private int j;
public int getJ() {
return j;
}
TestClass2(){
j=2;
}
}
如上代码,写到t.getJ的时候报错了,说无getJ()方法。哦,对了。继承向上转型后子类后面添加的一些成员是用父类引用无法调用的,这个想法就此破产。
到底该怎么搞了?后面想到或者请教到了方法会在下面进行更新,同时也希望各位有好的方法评论在下方一起学习。
如果有什么写的不对的地方还请各位多多指正。
========时间:2020年5月23日16:25:34========
当时刚学java,现在看还挺有意思。有意思的有两点:
-
对象作为参数的问题
-
设计模式中的里氏替代原则
第一个是对象作为参数的问题,在上文中有提到:把对象作为形式参数传入方法中时,传入的是引用地址,如果在方法内再次new一个对象赋值给这个参数,此后操作的对象和方法外传进来的实参没有任何关系,也就是说方法里的操作对方法外的对象引用起不到任何作用。
第二个是文末提到的如何解决的问题,可以用设计模式的里氏替代原则解决和简单工厂模式来解决。 大致代码如下:
-
使用接口实现一个抽象产品,创建需要的具体产品都继承抽象产品这个接口。
-
创建一个静态工厂类,里面实现一个方法instance方法,传入参数需要创建的具体产品名,然后根据产品名ifelse判断创建具体产品对象,返回抽象产品接口。