class ClassA{ static { System.out.println("In ClassA Static"); } public ClassA(){ System.out.println("ClassA()"); } } class ClassB{ static { System.out.println("In ClassB Static"); } public ClassB(){ System.out.println("ClassB()"); } } class ClassC extends ClassB{ static{ System.out.println("In ClassC Static"); } public ClassC(){ System.out.println("ClassC()"); } } class MyClass { static ClassA ca = new ClassA(); ClassC cc = new ClassC(); static{ System.out.println("In MyClass Static"); } public MyClass(){ System.out.println("MyClass()"); } } public class TestMain{ public static void main(String args[]){ MyClass mc1 = new MyClass(); MyClass mc2 = new MyClass(); System.out.println(mc1.cc == mc2.cc); } } 写出这个程序运行的结果
时间: 2023-04-04 11:05:13 浏览: 161
In ClassA Static
In ClassB Static
In ClassC Static
In MyClass Static
ClassA()
ClassB()
ClassC()
MyClass()
ClassA()
ClassB()
ClassC()
MyClass()
true
程序运行的结果为:先输出静态代码块的内容,然后按照类的继承关系依次输出构造方法的内容,最后输出MyClass的构造方法和最后一行的结果。其中,静态代码块只会在类加载时执行一次,构造方法每次创建对象时都会执行。最后一行输出true,因为mc1和mc2都指向同一个ClassC对象。
相关问题
有如下ClassA和ClassB public class ClassA { public int method(int arg) { return (arg + arg); } } public class ClassB extends ClassA { @Override public int method(int arg) { return (arg * arg); } public static void main(String[] args) { ClassA cla1 = new ClassA(); int guessMe1 = cla1.method(9); System.out.println(guessMe1); ClassA cla2 = new ClassB(); int guessMe2 = cla2.method(9); System.out.println(guessMe2); ClassB cla3 = new ClassB(); int guessMe3 = cla3.method(9); System.out.println(guessMe3); } } 请问guessMe1,guessMe2,guessMe3的值分别为?
在这段代码中:
- ClassA是一个基类,有一个method方法,返回传入参数的两倍;
- ClassB是ClassA的子类,也有一个method方法,覆盖了父类的方法,返回传入参数的平方。
根据Java中的多态性质,在以下代码中:
```
ClassA cla1 = new ClassA();
int guessMe1 = cla1.method(9);
System.out.println(guessMe1);
```
- 先创建ClassA实例,将其引用赋值给cla1;
- 调用cla1的method方法,传入参数9,返回18;
- 打印输出guessMe1的值,为18。
```
ClassA cla2 = new ClassB();
int guessMe2 = cla2.method(9);
System.out.println(guessMe2);
```
- 先创建ClassB实例,将其引用赋值给cla2;
- 因为ClassB是ClassA的子类,所以可以将其引用赋值给ClassA类型的变量;
- 调用cla2的method方法,传入参数9,返回81;
- 打印输出guessMe2的值,为81。
```
ClassB cla3 = new ClassB();
int guessMe3 = cla3.method(9);
System.out.println(guessMe3);
```
- 先创建ClassB实例,将其引用赋值给cla3;
- 调用cla3的method方法,传入参数9,返回81;
- 打印输出guessMe3的值,为81。
所以guessMe1的值为18,guessMe2的值为81,guessMe3的值为81。
在主类 StudentDemo 中,首先,输入学生的各项信息;其次,通过条件判定语句确定是哪一类生种,可以由字符串比较相等的方法 equals() 实现;接着,创建相应生种的对象;最后,调用相应生种的 isPass() 方法输出显示学位认定信息。完善下面的代码import java.util.Scanner; public class StudentDemo { public static void main(String[] args) { // TODO Auto-generated method stub int classA, classB, classC; String name, type, flag; Undergraduate s1; Graduate s2; Scanner sc=new Scanner(System.in); System.out.print("姓名:"); name=sc.nextLine(); System.out.print("生种(G or UG):"); type=sc.nextLine(); System.out.println(type); System.out.print("成绩 1:"); classA=sc.nextInt(); System.out.print("成绩 2:"); classB=sc.nextInt(); System.out.print("成绩 3:"); classC=sc.nextInt(); /********** Begin **********/ //如果学生类型为本科生 if( equals(UG)){ /********** End **********/ s1=new Undergraduate(name, classA, classB, classC); s1.isPass(); /********** Begin **********/ //如果学生类型为研究生 } else if(equals(G) ){ /********** End **********/ s2=new Graduate(name, classA, classB, classC); s2.isPass(); } } }
在第一个空白处,应该填写 type.equals("UG"),在第二个空白处,应该填写 type.equals("G")。完整代码如下:
import java.util.Scanner;
public class StudentDemo {
public static void main(String[] args) {
int classA, classB, classC;
String name, type, flag;
Undergraduate s1;
Graduate s2;
Scanner sc = new Scanner(System.in);
System.out.print("姓名:");
name = sc.nextLine();
System.out.print("生种(G or UG):");
type = sc.nextLine();
System.out.println(type);
System.out.print("成绩 1:");
classA = sc.nextInt();
System.out.print("成绩 2:");
classB = sc.nextInt();
System.out.print("成绩 3:");
classC = sc.nextInt();
if (type.equals("UG")) {
s1 = new Undergraduate(name, classA, classB, classC);
s1.isPass();
} else if (type.equals("G")) {
s2 = new Graduate(name, classA, classB, classC);
s2.isPass();
}
}
}
阅读全文