java中值得注意的细节

1、访问控制修饰符相关
被public修饰的可见性:当前类、同一包内、子类、其他包均可见。
被protected修饰的可见性:当前类、同一包内、子类
被private修饰的可见性:当前类
没有修饰符修饰(Default):当前类、同一包内

2、transient修饰符
被该修饰符修饰的变量序列化时,JVM虚拟机会忽略该变量,不会被序列化。

3、volatile修饰符
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // 第一行
        {
            // 代码
        }
    }
    public void stop()
    {
        active = false; // 第二行
    }
}

上面的例子中,通常情况下,在一个线程调用run()方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。如果第一行中缓冲区的 active 值被使用,那么在第二行的active值为 false 时循环不会停止。
但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。

4、final修饰符

(1)final修饰变量
final修饰的变量,其值只能被初始化一次,即无法更改变量的值;final修饰的对象,其引用不能被更改,但是对象内部的值可以被改变。

(2)final修饰的方法
final修饰的方法可以被子类继承,但是不能被子类修改。

(3)final修饰的类
final修饰的类不能被继承

5、重载(Overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
重载规则:
(1)被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
(2)被重载的方法可以改变返回类型;
(3)被重载的方法可以改变访问修饰符;
(4)被重载的方法可以声明新的或更广的检查异常;
(5)方法能够在同一个类中或者在一个子类中被重载。
(6)无法以返回值类型作为重载函数的区分标准。

6、多态存在的三个必要条件
(1)继承
(2)重写
(3)父类引用指向子类对象
注意的点:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用);
四、变量不能被重写(覆盖),”重写”的概念只针对方法,如果在子类中”重写”了父类中的变量,那么在编译时会报错。

7、抽象类总结规定
(1) 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
(2) 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
(3)抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
(4)构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
(5) 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

8、接口Interface
(1)接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
(2)一个接口可以继承另一个接口
(3)接口允许多重继承,如:public interface A extends B,C,D

你可能感兴趣的:(java中值得注意的细节)