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)没有任何关系,是不同的方法。

5. 阅读下列代码回答问题(关于static的理解)


代码
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. 阅读下列代码回答问题(关于引用变量的理解)


代码
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. 阅读下列代码回答问题(关于异常的理解)


代码
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编程的7个例子的更多相关文章

  1. 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

    声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...

  2. 深刻理解Java中的String、StringBuffer和StringBuilder的差别

    声明:本博客为原创博客,未经同意.不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(链接为http://blog.csdn.net/bettarwang/article/detai ...

  3. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  4. 深刻理解Java中形參与实參,引用与对象的关系

    声明:本博客为原创博客,未经同意.不得转载! 原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道.在Java中,除了 ...

  5. Java编程思想 学习笔记5

    五.初始化与清理 1.用构造器确保初始化  在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...

  6. 深入理解java虚拟机系列初篇(一):为什么要学习JVM?

    前言 本来想着关于写JVM这个专栏,直接写知识点干货的,但是想着还是有必要开篇讲一下为什么要学习JVM,这样的话让一些学习者心里有点底的感觉比较好... 原因一:面试 不得不说,随着互联网门槛越来越高 ...

  7. 《Java编程的逻辑》终于上市了!

    2018年1月下旬,<Java编程的逻辑>终于出版上市了! 这是老马过去两年死磕到底.无数心血的结晶啊! 感谢"博客园"的广大读者们,你们对老马文章的极高评价.溢美之词 ...

  8. Java编程的逻辑 (82) - 理解ThreadLocal

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. Java编程的逻辑 (66) - 理解synchronized

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

随机推荐

  1. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  2. unity里面查找所有物体

    测试的时候发现一个很诡异的bug,在prefab里面的物体的属性居然不断的在变化,最后一步步调试才发现,区别是查找物体的api,特此记录下 两种api Canvas[] canvasArray = ( ...

  3. java工具类-邮件发送

    mail-1.4.jar package com.huawei.it.citools.mail; import java.util.Date;import java.util.List;import ...

  4. Android中如何使用JUnit进行单元测试 eclipse

    Android中如何使用JUnit进行单元测试 在我们日常开发android app的时候,需要不断地进行测试,所以使用JUnit测试框架显得格外重要,学会JUnit可以加快应用的开发周期. Andr ...

  5. 设置修改CentOS系统时间和时区

    1.yum install ntp,安装时间服务ntpdate time-a.nist.gov && hwclock -w (跟网络同步时间,并且写入主板BIos) 2.chkconf ...

  6. 第 0 课 Golang环境搭建

    1  下载 https://studygolang.com/dl  2   安装完成后,查看环境变量 GOBIN 存放可执行文件的目录的绝对路径. GOPATH 工作区目录的绝对路径.存放远源码的路径 ...

  7. new 运算符干了什么

    为了追本溯源, 我顺便研究了new运算符具体干了什么?发现其实很简单,就干了三件事情. var obj = {}; obj.__proto__ = F.prototype; F.call(obj); ...

  8. IPv4正则表达式匹配

    IP地址的长度为32位,分为4段,每段8位.用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开.例如:某台计算机IP地址为111.22.33.4. 分析IP地址的组成特点:25 ...

  9. 如何更改Windows10的计算机基本信息

    请问如何去掉红色框内的内容?优化大师更改无效!   最佳答案 打开注册表,定位到如下路径 1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current ...

  10. ES6系列_16之模块化操作

    ES6的模块化操作主要包括两个方面. (1)export :负责进行模块化,也是模块的输出. (2)import : 负责把模块引,也是模块的引入操作. export的用法: export可以让我们把 ...