日期:2014-05-20  浏览次数:20767 次

请教一个简单的问题 初学
Java code
//----------------------
package com.guo;

public class A
{
    protected int a;
}

//----------------------
package com.guo.yue;

import com.guo.A;
public class B extends A
{
    public int getA()
    {
        return a;   
    }
    public static void main(String[] args)
    {
        A a1 = new B();                  //  如果是  B a1 = new B();则是对的     
        System.out.println(a1.getA());  // 报错  A的引用指向B的对象 为什么不可以调用getA() 
                                              //还有为什么 不可以直接输出 a1.a  而不去用getA()
    }
}


------解决方案--------------------
因为A类中没有getA()这个方法
------解决方案--------------------
//还有为什么 不可以直接输出 a1.a 而不去用getA()

面向对象设计的话属性一般都是私有的,而通过getter()方法为外界提供访问的方法。
------解决方案--------------------
首先回答你 :错误为:The method getA() is undefined for the type A。
2。可以用a1.a来输出值=0;类属性值int默认值为0;如果被声明为protect 就不能输出了;
3.回答你为什么不能调用getA():如果说父类中有这个属性跟方法,子类有重写过,那么调用的是子类中的属性跟方法。如果父类中没有这个属性跟方法,那么子类调用就会出错。如果父类有这个属性跟方法,而子类没有,则调用的是父类的属性跟方法。
------解决方案--------------------
lz编译时和运行时两个概念木有搞清楚呀。。你这个错误编译时就出错了。。因为编译器一看。。是A引用,A类中没有getA方法,就报错了。。。在编译时,编译器不能看到你的实际对象层面上,你想要的情况是多态,是在运行时。
------解决方案--------------------
a1能"点"出什么方法不是看他引用了什么对象,而是看他本身是什么类型的引用。你的a1是A类型,A类型中没有getA(),所以就不行~~~
------解决方案--------------------
建议楼主百度一下“java 多态”。

为什么 不可以直接输出 a1.a
因为你protected了,所以不能直接输出。要想直接输出,必须public。

protected的作用是让子孙类的对象可以直接调用,但如果你处于运行期就不可以调用。
------解决方案--------------------
because如果你写的 A al=new B();如果你要调用B类中的getA()的话,那么你这个写法必须是父类即A类里也必须有getA()这个方法,总的来说,如果子类和父类中都有,调用子类的。如果父类有,子类没有,调用父类的。如果父类没有,子类有,报错。如果父类子类都没有,那肯定错了····(上述的总结是就你的A al=new B();这个写法的)
------解决方案--------------------
第一个:A a1 = new B();这一句是用子类对象代替了一个父类对象(替换原则),而父类A中,并没有getA这个方法。
第二个:protected 的属性和方法可以在本包和子类访问,非同包的子类里面,不能直接使用父类,或者其它包的子类访问
------解决方案--------------------
A a1 = new B();
// A 的对象 a1,表现A的属性
// 用 B 类的构造器构造,但是只表现A的属性,B的不可见
------解决方案--------------------
此为A类对象的引用指向指向B类对象,在A中是无法看到b中的方法的