1.
public class TT {
public static void main(String[] args) {
String a = "A";
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
change(a,b,c);
System.out.println(a+","+b+","+c);
}
static void change(String s,StringBuffer s1,StringBuffer s2){
s= s+"1";
s1.append("1");
s2 = new StringBuffer("c1");
}
A: A,B1,C
B: A1,B1,C1
C: A,B,C2.
class Tree{
void say(){}
}
class Point extends Tree{
void say(){
System.out.println("point");
}
}
class What extends Tree{
void say(){
System.out.println("what");
}
}
class Test{
static void aa(Tree t){
t.say();
}
public static void main(String[] args) {
Tree point = new Point();
Tree what = new What();
aa(point);
aa(what);
}
}
A:point
B:what
C:什么都不输出
D:编译不能通过3:写出该程序运行后控制台的输出
public class TestString{
public static void callA(int a,StringBuffer sb){
a = 10;
sb.append(" luck");
print(a,sb);
}
public static void callB(int a,StringBuffer sb){
a = 33;
sb = new StringBuffer("haha");
print(a,sb);
}
public static void print(int a,StringBuffer sb){
System.out.println(a);
System.out.println(sb.toString());
}
public static void main(String[] args) {
int a = 100;
StringBuffer sb = new StringBuffer("GOOD");
TestString.callA(a,sb);
TestString.callB(a,sb);
print(a,sb);
}
}
4:写出该程序运行后控制台的输出
class Parent{
Parent(){
System.out.println("Parent构造方法");
}
static{
System.out.println("Parent static");
}
}
class Child extends Parent{
Child(){
System.out.println("Child构造方法");
}
static{
System.out.println("Child static");
}
}
public class TestCons {
public static void main(String[] args) {
Parent chi = new Child();
}
}
public class TT {
public static void main(String[] args) {
String a = "A";
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
change(a,b,c);
System.out.println(a+","+b+","+c);
}
static void change(String s,StringBuffer s1,StringBuffer s2){
s= s+"1";
s1.append("1");
s2 = new StringBuffer("c1");
}
A: A,B1,C
B: A1,B1,C1
C: A,B,C2.
class Tree{
void say(){}
}
class Point extends Tree{
void say(){
System.out.println("point");
}
}
class What extends Tree{
void say(){
System.out.println("what");
}
}
class Test{
static void aa(Tree t){
t.say();
}
public static void main(String[] args) {
Tree point = new Point();
Tree what = new What();
aa(point);
aa(what);
}
}
A:point
B:what
C:什么都不输出
D:编译不能通过3:写出该程序运行后控制台的输出
public class TestString{
public static void callA(int a,StringBuffer sb){
a = 10;
sb.append(" luck");
print(a,sb);
}
public static void callB(int a,StringBuffer sb){
a = 33;
sb = new StringBuffer("haha");
print(a,sb);
}
public static void print(int a,StringBuffer sb){
System.out.println(a);
System.out.println(sb.toString());
}
public static void main(String[] args) {
int a = 100;
StringBuffer sb = new StringBuffer("GOOD");
TestString.callA(a,sb);
TestString.callB(a,sb);
print(a,sb);
}
}
4:写出该程序运行后控制台的输出
class Parent{
Parent(){
System.out.println("Parent构造方法");
}
static{
System.out.println("Parent static");
}
}
class Child extends Parent{
Child(){
System.out.println("Child构造方法");
}
static{
System.out.println("Child static");
}
}
public class TestCons {
public static void main(String[] args) {
Parent chi = new Child();
}
}
2.C(没有向下转型,所以全部调用父类的方法)
3.(还是值传递和作用域的问题)
10
GOOD luck
33
haha
100
GOOD luck
4.(成员变量优先于构造函数,父类的默认的构造函数优先于子类的构造函数)
Child static
Parent static
Parent构造方法
Child构造方法
Tree point = new Point();
Tree what = new What();
aa(point);
aa(what); 传的是子类实例,为什么调用父类方法
2.A ,B (类类型转换)
3.(传值,传引用,作用域)
10
GOOD luck
33
haha
100
GOOD luck
4.(成员变量优先于构造函数,在new对象的时候,会首先检查是否有父类,如果有就先进行初始化
父类的默认的构造函数优先于子类的构造函数)
Parent static
Child static
Parent构造方法
Child构造方法
Tree what = new What();
aa(point);
aa(what); 输出应该是point和what
很典型的多态。
2.A,B
3.10
GOODluck
33
haha
100
GOODluck
4.Parent static
Child static
Parent构造方法
Child构造方法
2.A,B(自己运行测试的结果是这个)
3.(还是值传递和作用域的问题)
10
GOOD luck
33
haha
100
GOOD luck
4.(成员变量优先于构造函数,父类的默认的构造函数优先于子类的构造函数)
Parent static
Child static
Parent构造方法
Child构造方法
Parent static
Child static
parent构造方法
Child构造方法
public class TT {
public static void main(String[] args) {
String a = "A";
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
change(a,b,c);
System.out.println(a+","+b+","+c);
}
static void change(String s,StringBuffer s1,StringBuffer s2){
s= s+"1";
s1.append("1");
s2 = new StringBuffer("c1");
}
为什么输出结果是:A,B1,C呢,能不能详细解释一下,作用域的问题,能不能详细说一下?比较的困恼~这个问题·
我是这样认为的,chage之内a传递后,是a1,但是并没有传递出,所以,在change方法内a 是a1,但是出去之后还是a。
这里面的确涉及到了多态的知识,但是请注意,在aa方法中传进来的是Tree的类型,而在所有面向对象的语言中,
Tree t = new Tree();
里面控制对象类型的是前面的那个Tree,在aa中即使传进来是子类型的对象,由于参数被定义成了Tree类型,子类也会被向上转型为Tree类型,所以t.say(); 调用的自然而然也就是Tree里面的say()方法。如果想要调用子类的方法,必须在aa里面使用向下转型,这也是反射常用的技俩儿。
String a="A";
这种写法相当于值类型。s1.append("1");
这种写法操作了内存中对象,内存中的值变成了B1s2=newStringBuffer("c1");
这种写法虽然也是对象,但是c1这个对象的作用域仅局限于change这个方法,没有被带回到main方法里面关于局部变量作用域,引用和对象在内存中怎么分配的概念很重要
2.D:编译不能通过(main方法在test类中,而test类是非public的,编译出错)。
3.
10
GOOD luck
33
haha
100
GOOD luck
4.
Parent static(加载Parent时)
Child static (加载Child时)
Parent构造方法 (子类构造器先调用父类构造器)
Child构造方法
谁说一个类不是public的就编译出错
String a = "A";
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
change(a, b, c);
System.out.println(a + "," + b + "," + c);
} static void change(String s, StringBuffer s1, StringBuffer s2) {
s = s + "1"; //s引用,指向了新的串s+"1",原来的值并未改变
s1.append("1"); //s1引用,修改了引用本身的所指的值,所以原来引用值也变了
s2 = new StringBuffer("c1"); //s2引用,引向了一个新的对象,原值未变
}}
非public的有关系么?main方法调用的是它所在的类, 即使是private的都可以调用吧?
你这句话是根据什么说的?静态发那个发必须在public类中?内部类?
我是真不知道有这种说法, 我还特意在eclipse下验证了一下, 结果是仍然输出A和B
我是初学者,不太懂
但是考查的不仅仅是值传递和作用域吧?还有 String和StringBuffer的区别
new 运算符
对象的==与equals
2.A,B
3.10 GOOD luck
33,haha
100,GOOD luck
4.Parent static
Child static
Parent构造方法
Child构造方法
比如说
public class Test{
}
这样写的话只能保存为Test.java,而不能使用别的名字为这个java源文件命名了
2. A B
3. 10
GOOD luck
33
haha
100
GOOD luck
4. Parent static
Child static
Parent构造方法
Child构造方法
第二题,为什么没向下转型???
第四题,parent static 比child static先输出。
2考察:基本语法 每一个Java文件中若有多个类,要有而且仅有一个public类
3考察局部变量和参数传递:方法内部的局部变量
4每一个static变量都在构造函数初始化之前初始化,基类构造函数在导出类构造之前初始化
A,B1,C第二题:
point
what第三题:
10
GOOD luck
33
haha
100
GOOD luck第四题:
Parent static
Child static
Parent构造方法
Child构造方法
2、答案为A、B(对变量的类型起决定作用的是后面的构造函数)
3、答案如下所示:
10
GOOD luck
33
haha
100
GOOD luck
注:主要难点是最后的那个print(a,sb),记得sb所指的那个对象仍然是原来创建的那个值为"GOOD"的StringBuffer对象
4、答案为:
Parent static
Child static
Parent构造方法
Child构造方法
注:标识为static的部分是在类被载入的时候执行的,而构造函数内的代码是在利用此构造函数创造该类的一个实例时被执行的。声明:我这些解答都是在Eclipse里面调试过的,希望我的回答对你的学习有点帮助!
父类的静态成员,静态块(按照顺序),子类的静态成员静态块,父类的非静态成员,非静态块
,父类的构造函数,子类的非静态成员,非静态块,子类的构造函数。
所以第四项的答案是
Parent static
Child static
Parent构造方法
Child构造方法
2:--->A、B
3:--->10,GOODluck 33,haha 100,GOODluck
4:--->
Parent static
Child static
Parent构造方法
Child构造方法1:关于值传递的问题,有不明白的可以去我博客看下,O(∩_∩)O哈哈~
http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
大家记住当入参是一个对象的引用时:在方法内操作该对象时才能改变该对象,而操作引用时源对象是没有改变的。
而StringBuffer对象的append方法就是操作对象内容,此时的改变会在源对象内体现;而像sb=new StringBuffer(一个新的字符串);时则是操作引用,此时的改变不会在源对象内体现。
2:这个是考察:父引用(装子对象).方法, ---->分:父引用(装子对象).member方法和父引用(装子对象).static方法
(1)父引用(装子对象).子方法 //如果此时父中没有此方法,此时部分member和static,则在编译时就报错
(2)父引用(装子对象).父member方法 //如果此时子中没有此方法,走父的方法
(3)父引用(装子对象).父member方法/此时子重写了此方法 //就是说,子中也有此方法,则子压制父,走子方法(4)父引用(装子对象).父static方法 //走父方法(即使子重写了此方法,也走父方法,当调static方法时,按类名走)
4:考察的是在继承中static方法块和构造的执行顺序,下面我列出他们的顺序,
(1)父static方法块(2)子static方法块(3)父member方方块(4)父构造(5)子member方法块(6)子构造