class A
{
void f()
{
System.out.println("hello,A");
}
}class B extends A
{
void f()
{
System.out.println("hello,B");
}
}public class TestA
{
public static void main(String [] args)
{
A b = new B();
b.f();
}
}请问1:A b = new B();到底产生的是谁的对象???
请问2:在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?
{
void f()
{
System.out.println("hello,A");
}
}class B extends A
{
void f()
{
System.out.println("hello,B");
}
}public class TestA
{
public static void main(String [] args)
{
A b = new B();
b.f();
}
}请问1:A b = new B();到底产生的是谁的对象???
请问2:在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?
2、对两者应该都没有影响
请问2:在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?答:都没有影响!b.f()执行的是B类的方法.因为override了
在java中除了static和final方法外都是后期绑定,所以static 和final方法都不能被覆盖.static方法不能覆盖和被覆盖!
前半部只是A的reference,但具体在后半部指向B的一实例。因此调用的是B的f()方法。
涉及JAVA的多态问题,有一“向上转型”的效果,即可认为B是一种特殊的A。但调用的是这种特殊A(即B)的方法
这就是里氏代换原则:如果对每个类型T1的对象o1,都有类型为T2的对象O2,使得一T1定义的所有程序P在所有对象o1都代换成o2时,程序P的行为没有变化,那么T2为T1的子类型。
这里的b是一个特殊的对象,即不属于A也不属于B,
它拥有A类的属性,B类的方法(B继承A);
如果B中有重构A的方法,则拥有B中重构的方法;
本例,b实现的是B类中的f()方法;
2.没影响
这句话表示用父类的引用指向子类对象,
这时 b.f();当然是调用的是子类的方法在两个类的void f()方法前都加上static关键字后,对A b = new B();这句话有什么影响吗??对b.f()又有什么影响?
没有影响
{
/*void f()
{
System.out.println("hello,A");
}*/
}class B extends A
{
void f()
{
System.out.println("hello,B");
}
}public class TestA
{
public static void main(String [] args)
{
A b = new B();
b.f();
}
}当我将类A中的void f()方法注释掉后,这个程序编译时提示出错,信息如下:
C:\TestA.java:22: cannot resolve symbol
symbol : method f ()
location: class A
b.f();
^
1 errorA b = new B();如果生成的是B类的一个对象,b.f()应该会直接调用类B中的void f()方法,不应该报错啊??现在出错了,说明调用的是A类中的方法,可A中的void f()方法被注释,不存在了。所以出错。到底怎么了?
1. 如果f不是static方法, 那么 这时候要看b到底指向的哪个对象,千万不要认为b是对象,b只不过是一个引用变量,它的作用是指向一个A或者A的子类的对象; b指向了哪个类的对象,那么b就调用这个类的f方法。
2. 如果f是static方法,这时候则调用A类中的方法,因为static方法是不能override的。关于这点,可以看其他的帖子。而当你把A类中的f方法删除时,出现了编译错误,解释如下:
因为通过 A b 这句话,可以知道 b 需要指向 A 或者A的子类的对象;也即b是A类型的引用变量;
而 编译器 在面对 b.f() 这条语句时,当然要先判断A类中到底有没有f这个方法, 如果A中没有则当然会报出编译错误。
b只是相当于一个interface,具体还是关联B的实现,所以A中需要有“f()”方法去关联。
1、b是B的实例,如果B有其他的扩展属性或者方法,则b全部拥有,只是可以把b当作A的实例来访问而已;
2、对两者应该都没有影响WRONG!
b是一个A接口的实例。
它执行的方法。是接口的方法。只不过在B类中实现了接口的方法。同理A是一个类
b同样是A的一个实例,执行的是在B中重写的方法。不知道这样明白不。