如何使用父类的引用访问子类的成员?

时间:2015-06-30 09:37:50

标签: java inheritance design-patterns

让我们有课程:

class Parent {
     public Parent getParent() {
         ...
     }
}

class Child extends Parent{
     public Parent getChild() {
         ...
     }
}

//instantiating Child by using reference of Parent
Parent parent = new Child();

当我使用时:

//Works fine
Parent parentObject = parent.getParent();

当我使用时:

//Doesn't works
Child childObject = parent.getChild();

但是当类型转换对象:

//Works fine
Child childObejct = ((Child)parent).getChild();

作为程序员,对于我希望通过引用父类来使用子成员的每个调用,这是一个忙于输入强制转换的东西。

4 个答案:

答案 0 :(得分:2)

您声明了名为Parent的{​​{1}}类型的变量,实际上是parent

如果您没有投射变量,则只能使用类Child的方法。

如果将变量强制转换为实数类型(在本例中为Parent),则可以访问类Child及其超类Child的所有方法。 / p>

注意:为了减少误解,如果将变量Parent命名为child,最好将其命名为Parent,因此很明显这是一个真正的孩子。

答案 1 :(得分:1)

你会做这样的事吗?我不明白你想要什么...

private void registerBroadcastReceiver() {
    final IntentFilter theFilter = new IntentFilter();
    /** System Defined Broadcast */
    theFilter.addAction(Intent.ACTION_SCREEN_ON);
    theFilter.addAction(Intent.ACTION_SCREEN_OFF);

    BroadcastReceiver screenOnOffReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String strAction = intent.getAction();

            KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);

            if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) 
            {
                if( myKM.inKeyguardRestrictedInputMode()) 
                {
                    System.out.println("Screen off " + "LOCKED");
                } else 
                {
                    System.out.println("Screen off " + "UNLOCKED");
                }
            }
        }
    };

    getApplicationContext().registerReceiver(screenOnOffReceiver, theFilter);
}

主要做这个

    abstract class Parent {
     public Parent(){
     }
     public abstract void doStuff();

}

 class Child extends Parent{
     public Child() {
     super();
     }

    @Override
    public void doStuff() {
        // TODO Auto-generated method stub

    }

答案 2 :(得分:1)

它并不复杂。当你有一个向上转换时,编译器很容易确定实际类型并进行转换,因为你知道每个类只是从一个父类扩展。

但是当您向下转换对象时,编译器无法推断具有父引用的对象是运行时中的哪个Child对象,因为每个Parent类都可以有多个Child类。

祝你好运。

答案 3 :(得分:1)

//Doesn't works
// parent.getChild() returning Parent object and you are trying to assign to child object, which is not possible implicitly.
Child childObject = parent.getChild();

您可以通过以下更改来尝试更多案例:

class Parent {
    public Parent getParent() {
        return new Parent();
    }
}

class Child extends Parent{
    public Child getChild() {
        return new Child();
    }

    // to access methods of child class using Parent class,
    //You should Override(same method Names and signatures) the methods of Parent Class
    public Parent getParent() {
        return new Parent();
    }
}