首先要知道这几点
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(); 所以执行的是子类的方法.
成员变量是没法继承的,而方法可以继承。
首先a对象是Animal类的对象,所以两个变量的输出的是Animal类的成员变量。其中a.A,调用的静态方法所以a.A和Animal.A是一样的。而且Animal.A更为标准。
再看方法。由于method类是静态方法,所以a.method就是Animal.method;而voice方法在Cat类中被覆写,所以调用Cat类中的方法,如果要访问父类Animal的voice方法应该用super关键字调用。
变量可以继承。
但方法就不同了,只因为他是属于一个类的,不需要被实例化,才称之为static方法.
也是因为他是属于一个类的.子类不能覆盖static方法,在调用的时候也是调用父类的static的方法.
呵呵.看你的理解了
在子类继承父类时,形构相同(返回值,方法名,参数都相同)的方法会被覆盖。 但这是有前提的,他针对的是实例方法,像static这样的方法就不能被”覆盖“。
也就是
public static int A = 0;
public static void method(){
System.out.println("动物");
}
A属性和 method 均是静态的不可以被覆盖
而 public void voice() 方法 则被覆盖了
如果印 Cat.b 就是4