Java基础

92 阅读3分钟

向上继承

定义一个Shape类

class Shape {
    void draw() {
        System.out.println("draw a shape");
    }
}

再定义Shape类的子类Circle,它继承Shape类

class Circle extends Shape {
    void draw() {
        System.out.println("draw a circle");
    }
}

此时可以定义一个Shape类型的Circle实例

public static void doSomething(Shape shape) {
    shape.draw();
}

public static void main(String[] args) {
    Shape circle = new Circle();
    doSomething(circle);
}

doSomething方法的作用是调用Shape类型参数的draw方法,doSomething这个方法不用考虑shape的具体实例是什么

标签

Java语言中通过标签可以实现一部分goto语句的作用,同时借助break和continue语句

outer:
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 2; j++) {
        System.out.println("usual" + ", i = " + i + ", j = " + j);
        if (i == 0) {
            System.out.println("**break inner" + ", i = " + i + ", j = " + j);
            break;
        }
        if (i == 1) {
            System.out.println("**continue inner" + ", i = " + i + ", j = " + j);
            continue;
        }
        if (i == 2) {
            System.out.println("**continue inner" + ", i = " + i + ", j = " + j);
            continue outer;
        }
        if (i == 3) {
            System.out.println("**break outer" + ", i = " + i + ", j = " + j);
            break outer;
        }
    }
}

运行结果如下所示:

usual, i = 0, j = 0
**break inner, i = 0, j = 0
usual, i = 1, j = 0
**continue inner, i = 1, j = 0
usual, i = 1, j = 1
**continue inner, i = 1, j = 1
usual, i = 2, j = 0
**continue inner, i = 2, j = 0
usual, i = 3, j = 0
**break outer, i = 3, j = 0

配合this来理解static的含义

在一个类里面,this可以调用自身的方法,而static修饰的静态方法就是没有this的方法,所以不能调用非静态方法,但非静态方法内部可以调用静态方法

finalize()方法和C++的析构函数比较

Java和C++对对象的清理工作大不相同,在C++中,对象可以在栈上分配对象,也可以在堆上分配对象,在栈上的对象是函数的局部变量,超出}范围后生命周期就结束了,而堆上的对象在执行完delete后生命周期也结束了,所以C++中对象的内存在哪个时刻被回收是可以确定的。
而Java中对象在堆中分配,只能通过new创建,当对象无用(没有引用指向它)时,这个对象将等待垃圾回收器来回收占用的内存,回收时间取决于垃圾回收器的工作时间,这时间无法预知。

C++中的对象被回收前,析构函数会被调用;Java中的垃圾回收器运行销毁对象时,会先调用finalize函数,在下一次运行垃圾回收器时才会真正回收对象占用的内存。

访问权限控制

Java中有四种访问权限,分别是public、protected、默认权限(包访问权限)和private

包访问权限

包访问权限是没有使用任何访问权限修饰词的默认权限,只能被当前包下的其他类访问

public:接口访问权限

对于每个人都是可用的

protected:继承访问权限

允许不同包下的子类访问,同时protected也具有包访问权限

private:私有权限

仅允许自身类访问

默认包

当java文件中未指定package时,该文件会被自动归入默认包下,所以所有未指定package的类都能互相访问

Java解释器运行过程

1.寻找环境变量CLASSPATH
2.获取包名,将包名的.转换为/(或者\,视不同系统而定)
3.将得到的路径与CLASSPATH连接,解释器在这目录下查找类名的.class文件