public class Test{
public static void main(String[] arg){
B b = new B();
System.out.println(b.i);
System.out.println(b.j);
A a = new B();
System.out.println(a.i);
System.out.println(a.j);
a.m();
a.m1();
System.out.println(a.i);
System.out.println(a.j);
}
}class A{
int i = 1;
static int j = 3;
void m(){
i = 5;
}
static void m1(){
j = 7;
}
}class B extends A{
int i = 2;
static int j = 4;
void m(){
i = 6;
}
static void m1(){
j = 8;
}
}问。为什么输出结果是那样的
http://topic.csdn.net/u/20070828/10/7aa61fbc-8575-4212-85c4-582c08f81535.html
此处使用指向A的引用,编译器只允许使用A类中的方法,而不是B中的方法,如果要使用B的方法,必须进行强制转换
public class Test {
public static void main(String[] arg) {
B b = new B();
System.out.println(b.i);
System.out.println(b.j); A a = new B();
System.out.println(a.i);
System.out.println(a.j); a.m();
a.m1();
System.out.println(a.i);
System.out.println(a.j);
}
}class A {
int i = 1; static int j = 3; void m() {
i = 5;
} static void m1() {
j = 7;
}
}class B extends A {
int i = 2; static int j = 4; void m() {
i = 6;
} static void m1() {
j = 8;
}
}类的静态成员和静态方法是不能被继承的
public static void main(String[] arg) {
B b = new B();
b.m1();
System.out.println(b.j);
}
}class A {
int i = 1;
static int j = 3;
void m() {
i = 5;
System.out.println("A的普通方法");
}
static void m1() {
j = 7;
System.out.println("A的静态方法");
}
}
class B extends A {
int i = 2;
void m() {
i = 6;
System.out.println("B的普通方法");
}
}
最后输出的是:
A的静态方法
7
B b = new B();
System.out.println(b.i);//2
System.out.println(b.j);//4调用的是子类的属性
A a = new B();
System.out.println(a.i);//1
System.out.println(a.j);//3方法被覆盖,但是属性不被覆盖。
a.m();
a.m1();
System.out.println(a.i); //1
System.out.println(a.j); //7分别调用B类的m()方法(被B类覆盖)和A类的m1()方法(静态方法只属于该类),
所以调用m()方法的时候只改变b对象的属性,与a对象的属性无关,故a.i=1;
调用m1()方法时改变类a.j,所以a.j=7
换句话说也就是和对象的声明时类型有关,A a = new B();
System.out.println(a.i);//1
System.out.println(a.j);//3这里a的声明时的类型是A,那么a.m();实际上调用的就是A类的方法而m()方法默认是default
这时调用方式是动态绑定的,和对象的实际类型有关,调用的方法是与实际类型最接近的方法
a的实际类型是B,那么a.m1()调用的就是B类的方法