class A{
String str="Hello";
public void t(){
System.out.println("Hello, you son of a bitch.");
}
}class B extends A{
String str="OK";
public void t(){
System.out.println("What's up, you bastard?");
}
}public class Test{
public static void main(String[] args){
A aa=new B();
System.out.println(aa.str);
aa.t();B bb=new B();
System.out.println(bb.str);
bb.t();
}
}What's the result?
String str="Hello";
public void t(){
System.out.println("Hello, you son of a bitch.");
}
}class B extends A{
String str="OK";
public void t(){
System.out.println("What's up, you bastard?");
}
}public class Test{
public static void main(String[] args){
A aa=new B();
System.out.println(aa.str);
aa.t();B bb=new B();
System.out.println(bb.str);
bb.t();
}
}What's the result?
What's up, you bastard?
OK
What's up, you bastard?
可怜的揭帖率。。
What's up, you bastard?
OK
What's up, you bastard?请赐教!
然而B中重写了A类的t()方法。所以在用aa.t()调用的是B类的t(),这时候的aa.t()相当于:
B bb = new B();
bb.t();
这是关于方法的分析。下面是关于函数的:
由于B类继承A类,那么B完全可以直接使用str = "OK";这相当于重新为A类中的str赋值。
然而B并没有这么做,他重新声明了一个变量:String str = "OK";所以在看完答案后,本人认为B重写了A的t方法,但并没有更改A中str的值。不知道这么分析有没有错误。望赐教!
如楼主情况,记着:
A aa=new B();
System.out.println(aa.str);
aa.t(); B bb=new B();
System.out.println(bb.str);
bb.t(); 上面调用变量时,一定是aa的,即是不考虑对象实际的类型,只考虑看到的aa.str的aa是什么类型
方法就是考虑对象的实际类型,实际类型是什么,就调用什么的方法。故题中是子类的方法。
What's up, you bastard?
OK
What's up, you bastard?
1.A aa=new B(); 这句话中的对象aa执有的是A的引用是不完全属于B类的对象。所以输出的应该是A对象的属性。即Hello.但其new的却是B类的对象。所以调用的应该是子类已重写的方法。输出的是What's up, you bastard?2.B bb=new B(); 这句中,bb对象已重新new了一次。那么bb对象是跟aa完全不一样的对象。其执有的是B的引用。new的又是B的构造方法。所以bb是完全属于B类的对象。那么输出的属性与调用的方法都应该是B类的。答案也就出来了。上面的解释1中,涉及到内存中对象的存储方式与结构。详细可参考《JAVA编程思想》中对于JAVA对象在内存中存储章节的详解。
Hello, you son of a bitch.
OK
What's up, you bastard?
我觉得是这样的输出
What's up, you bastard?
ok
What's up, you bastard?
bit代表什么?A.字节 B.字 C.二进制位 D.字长
三个人去motel,老板说三个人需要$30,所以他们三个人一人交了$10。第二天老板觉得,他们三个人一起,一共交$25就可以了。老板拿了$5给服务生,叫服务生给客人送过去。结果服务生因为那三个人没给小费怀恨在心,只给他们每个人退回$1。那么问题来了,他们第一天总共交了$30,现在变成他们由一人交$10,变为一人交$9,他们一共交了$27,服务生私吞$2,那么那$1哪去了?
public void A(String str){...}
则在子类中:
public void A(String str){...}这是重写,方法名,参数列表与父类中的方法一致.
而
public void A(int i){}或public void A(String str,String str2..){}
这些方法名相同而参数列表不同的是重载.
并且,重写是针对子类方法对父类方法的概念,至少有两个有继承关系的类存在,被重写的方法在父类中.
重载是指一个类自已内部存在两个或以上的,同名不同参(数列表)的方法,说不清谁重载谁了^_^!我是菜鸟,今天正好看了这方面的知识,回答得不完善的话请多多指教.
正解是C二进制位.
What's up, you bastard?
OK
What's up, you bastard?
Hello
What's up, you bastard?
Hello
What's up, you bastard?原因是 实际操作的B类对象 变量是以父类的为准,方法是以子类的为准.
调用的是父类的变量(把子类的变量覆盖了) 实际调用的是子类的方法(相同的)。
要想调用子类的对象
可以用类名来约束 bb.B.str ;
What's up, you bastard?
OK
What's up, you bastard?
A类的属性和方法都被重写了
JAVA 等面向对象的特性:,封装,继承,多态这里用到了多态 (上面说的覆盖 也是那么一回事 )
属性不具有多态而方法具有多态
不存在 引用传递 JAVA 只有 值传递
What's up, you bastard?
OK
What's up, you bastard? java基础啊
What's up, you bastard?
Hello
What's up, you bastard? 不用多说