让我们有课程:
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();
作为程序员,对于我希望通过引用父类来使用子成员的每个调用,这是一个忙于输入强制转换的东西。
答案 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();
}
}