首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请问一个简单的有关问题 初学

2012-02-22 
请教一个简单的问题 初学Java code//----------------------package com.guopublic class A{protected in

请教一个简单的问题 初学

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中的方法的

热点排行
Bad Request.