1. 阅读下列代码回答问题(第一个Java程序,理解PATH和CLASSPATH,学会使用javac和java命令)
view plaincopy to clipboardprint?
package cn.edu.uibe;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
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的理解)
view plaincopy to clipboardprint?
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);
}
}
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. 阅读下列代码回答问题(关于多态性的理解)
view plaincopy to clipboardprint?
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(),也将调用到子类中更具体的方法。
}
}
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.阅读下列代码回答问题(关于匿名内部类的理解)
view plaincopy to clipboardprint?
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() {
}
});
}
}
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)没有任何关系,是不同的方法。
5. 阅读下列代码回答问题(关于static的理解)
view plaincopy to clipboardprint?
public class Static {
static int i = 0;
int j=0;
public static void main(String[] args) {
Static s1 = new Static();
Static s2 = new Static();
s1.i++;
s2.i++;
s1.j++;
s2.j++;
System.out.println(s1.i);
System.out.println(s1.j);
System.out.println(s2.i);
System.out.println(s2.j);
}
}
public class Static {
static int i = 0;
int j=0;
public static void main(String[] args) {
Static s1 = new Static();
Static s2 = new Static();
s1.i++;
s2.i++;
s1.j++;
s2.j++;
System.out.println(s1.i);
System.out.println(s1.j);
System.out.println(s2.i);
System.out.println(s2.j);
}
}
问:写出上面代码的输出。
答案: 2 1 2
1,i是静态变量,类的所有实例共享同一个i,通常我们不通过引用变量访问静态变量,而是通过类名访问Static.i,注意Static是我们自己定义
的类名,而小写的static是关键字,表示静态的,为类的所有实例共享的变量或方法。j是实例变量,每个对象具有不同的,属于其自身的一个变量j。
6. 阅读下列代码回答问题(关于引用变量的理解)
view plaincopy to clipboardprint?
class Counter{
int i=0;
}
public class Reference {
public void plus(int i){
i++; //不会改变传递进来的参数的值,Java传递基本类型时进行了值的拷贝
}
public void plus(Counter c){
c.i++; //会改变,因为c是一个引用变量,相当于指针
}
public void create(Counter c){
c = new Counter();
c.i++; //不会改变,因为c执行了另外一个新建的对象
}
public static void main(String[] args) {
int i = 0;
Reference r = new Reference();
Counter c1 = new Counter();
Counter c2 = new Counter();
r.plus(i);
r.plus(c1);
r.create(c2);
System.out.println(i);
System.out.println(c1.i);
System.out.println(c2.i);
}
}
class Counter{
int i=0;
}
public class Reference {
public void plus(int i){
i++; //不会改变传递进来的参数的值,Java传递基本类型时进行了值的拷贝
}
public void plus(Counter c){
c.i++; //会改变,因为c是一个引用变量,相当于指针
}
public void create(Counter c){
c = new Counter();
c.i++; //不会改变,因为c执行了另外一个新建的对象
}
public static void main(String[] args) {
int i = 0;
Reference r = new Reference();
Counter c1 = new Counter();
Counter c2 = new Counter();
r.plus(i);
r.plus(c1);
r.create(c2);
System.out.println(i);
System.out.println(c1.i);
System.out.println(c2.i);
}
}
问:上面代码输出是?
答案:参考代码注释,输出应该是:0 1 0
7. 阅读下列代码回答问题(关于异常的理解)
view plaincopy to clipboardprint?
class MyException extends Exception{
public MyException(String message){
super(message);
}
}
public class ExceptionDemo{
public void f(int num) throws MyException {
if(num<0){
throw new MyException("参数不能为负数!");
}
System.out.println(num);
}
public void g(){
try{
f(1);
f(3);
f(0);
f(-1);
f(2);
f(-5);
}catch(MyException e){
System.err.println(e.getMessage());
return;//会立即返回吗?答:不会!
}finally{
System.out.println("无论什么时候!");
}
}
public static void main(String[] args) {
ExceptionDemo demo = new ExceptionDemo();
demo.g();
}
}
class MyException extends Exception{
public MyException(String message){
super(message);
}
}
public class ExceptionDemo{
public void f(int num) throws MyException {
if(num<0){
throw new MyException("参数不能为负数!");
}
System.out.println(num);
}
public void g(){
try{
f(1);
f(3);
f(0);
f(-1);
f(2);
f(-5);
}catch(MyException e){
System.err.println(e.getMessage());
return;//会立即返回吗?答:不会!
}finally{
System.out.println("无论什么时候!");
}
}
public static void main(String[] args) {
ExceptionDemo demo = new ExceptionDemo();
demo.g();
}
}
问:上面代码输出是?
答案:输出是:1 3 0 参数不能为负数! 无论什么时候!
try语句块里面的一行代码抛出了异常,后续代码就不再执行了,而是转到catch开始匹配异常类型。finally语句块里面的代码始终会被执行,即使
在catch语句块里面有行return语句也不会立即返回,Java确保finally语句块执行完函数才会返回。
分享到:
相关推荐
对于高级开发者,这部分内容有助于理解Java程序的运行机制,并能解决实际开发中的性能问题。 另外,本书可能还会涵盖多线程编程,这是Java的一个强大特性。读者将学习到如何创建和管理线程,理解同步和互斥的概念,...
《深入理解IEC104规约及其Java...开发者需要对规约本身有深刻理解,并能运用Java语言特性来实现高效、可靠的通信。在实际应用中,这样的程序可以作为后端服务,集成到更复杂的系统中,实现对电力设备的远程监控和管理。
Java编程语言是由Sun Microsystems公司在1995年推出的面向对象程序设计语言,它的推出是编程语言发展史上的一个里程碑。Java不仅是一个编程语言,它还是一个包含了Java程序设计语言和Java平台(JavaSE, JavaEE, Java...
总之,通过实现和理解Java的选择排序,初学者不仅可以掌握一种基础的排序算法,还能深化对面向对象编程的理解。这个简单的案例提供了动手实践的机会,同时也鼓励学习者根据需求调整代码,比如改变排序方向,或者将...
Java的成功,离不开高斯林的创新精神和对技术的深刻理解,他的故事激励着无数程序员和计算机科学家。 总的来说,Java语言是人类智慧的结晶,它的出现简化了编程过程,增强了代码的可移植性,极大地推动了互联网和...
在"JAVA实用编程100例"这个学习资源中,我们涵盖了广泛的Java编程主题,旨在帮助...每个例子都是一个独立的小项目,通过实践这些项目,可以逐步建立起对Java编程的深刻理解,为将来更复杂的项目开发打下坚实的基础。
【标题】:“(全部)web真题--JAVA程序设计100例”揭示了这个压缩包文件的内容聚焦于Java编程语言在Web开发中的应用。它提供了100个实际的编程例子,旨在帮助学习者深入理解和掌握Java在构建Web应用程序时的关键概念...
《Java2程序设计实用教程(第2版)》是一本深受Java初学者和进阶者喜爱的教材,它深入浅出地介绍了Java编程语言的基本概念和技术。这本书的例题源码是学习过程中不可或缺的一部分,因为它提供了实践编程技能的宝贵机会...
每个实例都是一个独立的学习点,通过解决实际问题,你能更深刻地理解JAVA的特性和应用。"JAVA经典的40个实例"提供了一个绝佳的平台,让你在实践中学习和成长。记得在学习过程中不断思考、总结,将理论知识转化为实际...
通过本书的学习,读者不仅能掌握Java的基本语法,还能深刻理解Java背后的哲学思想,这对于成为一名优秀的Java程序员至关重要。 总之,《Java的艺术》这本书通过深入浅出的方式,帮助读者全面理解和掌握Java编程的...
总的来说,“JAVA算法分析”涵盖了广泛的Java编程技术和算法知识,不仅要求我们掌握基本的编程语法,还要对数据结构、算法设计原则有深刻的理解。通过不断学习和实践,我们可以运用这些知识解决复杂的问题,提升Java...
Bruce Eckel是MindView公司的总裁,他凭借自己在Java编程领域的深刻理解和丰富的教学经验,为读者呈现了一本深受世界各地Java程序员欢迎的教科书。本书不仅仅是一本基础教程,它也被许多读者作为参考手册频繁使用。 ...
【标题】"清华大学课程_java程序设计_郑莉_第六章...每个学生在完成这样的作业时,不仅要理解和掌握这些概念,还需要能够将它们应用到实际编程实践中,通过编写代码来解决问题,体现出他们对Java编程语言的深刻理解。
在实际编程中,你需要了解如何导入和使用Java3D库,以及如何在Java应用程序中创建和显示3D场景。例如,`Canvas3D`是显示3D内容的窗口,需要将其添加到GUI中。同时,你需要理解如何加载和播放3D模型文件,比如.obj或....
本示例“一个意义深刻的FreeMarker入门例子之HelloWord”旨在帮助初学者理解并掌握FreeMarker的基本用法。 在Java Web开发中,FreeMarker与后端控制器如Servlet或Spring MVC中的Controller协同工作,允许开发者将...
- 由于文档中提到了"***"和水印的去除,可能意味着读者可以从这本书的示例中学习如何处理PDF文档,虽然这与Java编程的主题不是直接相关,但它可以视为编程应用的一个实际例子,比如文件处理或文本操作。 综上所述...