1. 阅读下列代码回答问题(第一个Java程序,理解PATH和CLASSPATH,学会使用javac和java命令)
package cn.edu.uibe;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
问:
(1)上面代码所在的源文件的文件名是_______________?
(2)在DOS提示符下,当前目录为该源文件所在的目录,PATH环境变量已包含编译
程序所在的路径,编译目标路径为“D:\classes”,编译命令行是_____________?
(3)为了让Java解释器能够找到编译后的类文件,需要如何设置环境变量___________?
(4)在正确设置了相关的环境变量之后,运行HelloWorld类的命令行是____________?
答案:
(1)HelloWorld.java,公共类必须定义在和类名同名的文件中,文件名区分大小写。
(2)javac -d D:\classes HelloWorld.java ,-d给出输出目录,javac会在D:\classes创建包的目录层次结构cn\edu\uibe\HelloWorld.class
(3)set CLASSPATH=.;D:\classses,CLASSSPATH给出Java寻找.class文件的多个路径,路径之间用分号分隔,“.”表示当前路径。
(4)java cn.edu.uibe.HelloWorld,注意需要给出包名,类名后面不要加“.class”。
2. 阅读下列代码回答问题(关于private的理解)
public class Light {
private int brightness = 5;
public void brighten(Light another){
another.brightness++;
}
public static void main(String[] args) {
Light light1 = new Light();
Light light2 = new Light();
light1.brighten(light2);
}
}
问:上面代码
Java编译器是否会给出错误提示?为什么?
答案:不会出现错误提示,private限制了私有变量只能被同一个类访问,但是没有限制同一个类的不同对象之间互相访问私有变量。实际上,private是在编译时进行检查,如果想限制同类对象之间互相访问,需要在动态运行时实现,开销较大,而且没有必要。
3. 阅读下列代码回答问题(关于多态性的理解)
class Base {
int i=1;
void f(){
System.out.println("Base.f()");
}
void g(){
f(); //会调用上面的f()方法吗?
}
}
public class Derived extends Base { //继承了Base类
int i=2; //Derived类的对象有1个i还是2个i呢? 答:2个
void f(){ //覆盖override了f()方法
System.out.println("Derived.f()");
}
public static void main(String[] args) {
Derived d = new Derived(); //创建子类对象
Base b = d; //没有创建对象,仅仅是父类引用指向了子类对象
d.f(); //将会输出Derived.f()
b.f(); //也会输出Derived.f(),方法具有多态性
System.out.println(d.i); //输出的是2,d.i
访问子类中定义的变量i
System.out.println(b.i); //输出的是1,b.i访问的是父类中定义的变量i,成员变量是不会动态绑定而表现出多态性的。
d.g(); //输出Derived.f()
b.g(); //也输出Derived.f(),从父类中调用被覆盖的方法f(),也将调用到子类中更具体的方法。
}
}
问: 写出上面代码的输出?
答案:参见代码注释,子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。
4.阅读下列代码回答
问题(关于匿名内部类的理解)
interface A {
void f();
}
public class B {
public void f(A a) {
}
public static void main(String[] args) {
B b= new B();
b.f(new A() {
public void f() {
}
});
}
}
问:请解释语句
b.f(new A() {
public void f() {
}
});
的含义与作用。
答案:
这个语句在参数表中定义了一个匿名内部类,这个匿名内部类实现了接口A,实例化了一个匿名内部类的对象,并将这个对象传递给了接收接口A作为参数的方法f(A a)。需要注意的是接口A中的方法f()和类B中的方法f(A a)没有任