package com.oo;public class TestStatic {
public static void main(String[] args) {
A a = new A();
System.out.println(a.i);
a.hello();
B b = new B();
System.out.println(b.i);
b.hello();
A c = new B();
System.out.println(c.i);
c.hello();
}
}class A {
int i = 10;
public void hello() {
System.out.println("hello A");
}
}class B extends A {
int i = 20;
public void hello() {
System.out.println("hello,B");
}
}为什么调用的是父类的属性
这个应该输出的是B的属性吧
c.hello();
这个是B的没的说
10
hello A
20
hello,B
10
hello,B
A c = new B(); (声明父类,创建子类).
对对象c 而言:
属性是父类的,方法是父类的.(没有覆写).
属性是父类的,方法是子类的.(有覆写).
即new的时B类,即产生B类中的结果,但由于返回的对象类型为A类类型,故对于A类型的对象,只有A类中的属性字段有效
支持这种说法:c.i 访问的就因该是a中的属性i,如果给属性增加get,set方法,在通过方法访问就该是b中的i了,面向对象也建议吧成员设为private的 然后给成员提供get,set方法!
System.out.println(c.i);//关键是这句话,在Java中啊,在(向上转型)中,只要调用方法这么一说啊,没有调用变量这么一说,所以啊,这儿应该还是A类的变量啦!
c.hello();//调用的应该是B类的hello方法!
我这么一说,相信你会理解的啦!
System.out.println(c.i);//关键 在Java中 向上转型只有调用被从写的子类方法这么意见,没有调用子类变量这么一讲,所以调用的是A类的变量 应该是10
c.hello();//很显然是调用子类即B()类方法
B b = new B();
System.out.println(b.i);
b.hello();
A c = new B();
System.out.println(c.i);
c.hello();
这两段代码完全一样,怎么会输出:
20
hello,B
10
hello,B