代码问题反思——有继承的对象的参数及返回问题

========时间: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判断创建具体产品对象,返回抽象产品接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值