请教个问题,Java中属性的隐藏与方法的覆盖,求详解.

先看一个程序
public class RunTime {

public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.A);
System.out.println(a.b);
a.voice();
a.method();

}

}
class Dog extends Animal {
public int b = 3;
public static int A = 3;
public static void method(){
System.out.println("狗");
}
public void voice() {
System.out.println("狗叫");
}
}

class Cat extends Animal {
public int b = 4;
public static int A = 4;
public static void method(){
System.out.println("猫");
}
public void voice() {
System.out.println("猫叫");
}
}

class Animal {
public int b = 0;
public static int A = 0;
public static void method(){
System.out.println("动物");
}
public void voice() {
System.out.println("动物叫");
}
}

运行输出结果是:
0
0
猫叫
动物

我想问下为什么会输出这个结果, 为什么不是下面的输出呢?

4
4
猫叫


求详解答。。。谢谢!!

首先要知道这几点
1.只有注入到内存的属性和方法,才能被使用.(这是本类的,如果是其他类,还得考虑安全级别,如:public protected private等)

2.静态方法和静态属性 不依赖于 对象的创建(new) 即:在对象创建之前,只要应用程序启动,就注入内存.
你可以直接调用,如:可以直接使用Animal.A Animal.method(),而且:
a.A <==> Animal.A
a.method() <==> Animal.method()

3.非静态程序块, 即 成员变量,成员方法, 要依赖于 对象的创建,只有 创建了这个的对象,才给这个对象分配内存,注入内存,你才能使用它

4.Animal a = new Cat(); 即: 父类 对象 = new 子类
左边的是句柄, 指向的是子类的对象,由于你创建的是子类的对象,而且子类也覆盖了父类的方法和属性(非静态),所以
a.voice(); 所以执行的是子类的方法.
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-18
成员变量是没法继承的,而方法可以继承。
首先a对象是Animal类的对象,所以两个变量的输出的是Animal类的成员变量。其中a.A,调用的静态方法所以a.A和Animal.A是一样的。而且Animal.A更为标准。
再看方法。由于method类是静态方法,所以a.method就是Animal.method;而voice方法在Cat类中被覆写,所以调用Cat类中的方法,如果要访问父类Animal的voice方法应该用super关键字调用。
第2个回答  2013-01-18
变量可以继承。
但方法就不同了,只因为他是属于一个类的,不需要被实例化,才称之为static方法.
也是因为他是属于一个类的.子类不能覆盖static方法,在调用的时候也是调用父类的static的方法.
呵呵.看你的理解了
第3个回答  2013-01-18
在子类继承父类时,形构相同(返回值,方法名,参数都相同)的方法会被覆盖。 但这是有前提的,他针对的是实例方法,像static这样的方法就不能被”覆盖“。

也就是
public static int A = 0;
public static void method(){
System.out.println("动物");
}
A属性和 method 均是静态的不可以被覆盖
而 public void voice() 方法 则被覆盖了
第4个回答  2013-01-18
如果印 Cat.b 就是4

请教个问题,Java中属性的隐藏与方法的覆盖,求详解.
1.只有注入到内存的属性和方法,才能被使用.(这是本类的,如果是其他类,还得考虑安全级别,如:public protected private等)2.静态方法和静态属性 不依赖于 对象的创建(new) 即:在对象创建之前,只要应用程序启动,就注入内存.你可以直接调用,如:可以直接使用Animal.A Animal.method(),而且:a.A <==> ...

Java的问题,求详解~
} 这里没有给这个方法传入值,默认调用本类的值,相当于this.x+this.y。

高分求java的基础视频教程,要基础入门的。电驴和迅雷上的资源太乱了...
内容介绍:本章讲解以下内容: (1)类方法详解(2)抽象(3)封装(4)四个访问修饰符 public private protected 默认(5)包韩顺平 循序渐进学 java 从入门到精通 第10讲-访问修饰符 重载 覆盖内容介绍:本章讲解以下内容: (1)四个访问修饰符的详解(2)继承详解(3)方法的重载(4)方法的覆盖韩顺平 循序渐进学 java 从...

java中hashcode什么时候用?怎么用? 求详解
一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等 了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以 认为只要姓名和...

java问题:哪位大侠帮忙解释下数据库操作里面的StatementCallback是...
JdbcTemplate对数据库访问包装,持久化操作更简单,但降低了访问的灵活性,而通过回调接口的使用,可弥补此损失.通过StatementCallback接口,可获得JdbcTemplate的Statement回调,使用原生的SQL命令,此时,同样可利用JdbcTemplate提供的系列优点,如一致的异常体系.StatementCallback回调接口只有一个方法需实现:Object doIn...

在java中,设a=3,b=-5.求 (1):--a%b++ (2):(a>=&&a<=12?a:b) (3...
(1)答案为2。(2)题有问题a>=?(3)题也有问题(--)前面缺字母!解决这种题先考虑--或++在字母前还是后,在前面就先自加或减在进行运算,在后面就先进行完运算在自加或减。不知道表述清楚了没有,请仔细看好了

在java中,设a=3,b=-5.求 (1):--a%b++ (2):(a>=&&a<=12?a:b) (3...
--a b++ 为2;--a是先a-1,再用a的值(此时已为2)做运算,而b++ 是先用b的值再加1,即得2%-5 为2 (a>=&&a<=12?a:b)是不是题打错了?a++%-- 题目不对吧???

java编程题 本人新手,求详解。
computerScore \/ public void setComputerScore(double computerScore) { this.computerScore = computerScore;} \/ 输出成员变量(4个成员变量)的信息。\/ public void print(){ System.out.println("学号:"+sId);System.out.println("姓名:"+sName);System.out.println("计算机成绩:"+mathScore);...

java该怎么自学?
企业中广泛使用一些优秀的框架技术来解决上述问题,因此我们还需要学习框架技术,项目开发中主流的Java框架技术有SpringMVC、Spring、MyBatis、MyBatis Plus、SpringData等。这些框架技术都是一个优秀程序员所必备的技能。 使用Javaweb进行企业级开发是完全可以的,但是开发效率比较低,所以对常用的逻辑操作进行封装就形成了...

JS中关于call()方法的一个问题,如图中所示,求高手详解。
第二句alert(a),显然在函数e的作用域里,变量a是不存在的,所以js会到window的作用域去查找属性a,而window的属性a是有的,它的值是A,所以这个时候alert(a)就是alert(window.a),alert的结果就是A。第三种:我觉得看了前两种调用的分析,你应该知道f.call(y.t)相当于什么,它相当于y.t.f...

相似回答