Java中的控制符修饰符总结

类修饰符:

public(公共访问控制符) 将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。

friendly(默认访问控制符)只有在相同包中的对象才能使用这样的类。

abstract (抽象修饰符)将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。

final (最终修饰符)将一个类生命为最终(即非继承类),表示他不能被其他类继承。


成员变量修饰符:

对于成员变量,子类与父类之间没有重写或重载的关系,只有能否访问、继承的关系,子类如果也定义了相同的变量,子类方法会优先读取子类定义的变量,子类没有重定义变量,则会去访问父类的变量。

public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。

private(私有访问控制符)指定该变量只允许本类的方法访问,其他任何类(包括子类)中的方法均不能访问。

protected(保护访问控制符)指定该变量可以被本类和子类访问。在子类中可以覆盖此变量。

friendly(默认访问控制符) ,在同一个包中的类可以访问,其他包中的类不能访问。

final (最终修饰符)指定此变量的值不能变。

static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。

transient(过度修饰符)告诉编译器,在类对象序列化的时候,此变量不需要持久保存。

volatile(易失修饰符)保证了用volatile修饰的变量对所有线程的可见性,volatile 修饰的成员变量在每次被线程访问时,都强制从主内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到主内存。

volatile不能解决数据竞争问题(共享数据的线程安全问题)

/**
 * 演示volatile不能解决数据竞争问题,只能保证变量可见性。
 * 
 * count++的字节码层面:
 *  getstatic        //读取静态变量(count)volatile保证所有线程再这一步读取到的值是主内存的最新值,但由于count++计算并不是原子操作(原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)),还是会发生线程安全问题
 *  iconst_1        //定义常量值 1
 *  iadd               //count增加1
 *  putstatic        //把count结果同步到主内存
 * 
* * @author nodcat */ public class VolatileDemo { public volatile static int count = 0; public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { new Thread(() -> { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } for (int j = 0; j < 100; j++) { count++; } }).start(); } Thread.sleep(2000); System.out.println("count=" + count); } }

方法修饰符:

public(公共控制符)指定方法可以从所有类访问。子类可以访问、继承、重载、重写该方法。

private(私有控制符)指定此方法只有本类的方法能访问,其他的类不能访问(包括子类)。子类无法访问该方法,自然也无法继承、重载该方法,对于子类不可见,但子类可以自己定义相同签名的方法。

protected(保护访问控制符)指定该方法可以被本类和子类进行访问,在子类中可以重写(覆盖)此变量。子类可以访问该方法,自然也可以继承、重载、重写该方法。

final (最终修饰符)指定该方法不能被重写(覆盖)。子类可以访问该方法,自然也可以继承、重载该方法,但无法重写该方法。

static(静态修饰符)指定不需要实例化就可以调用的方法。

abstract(抽象修饰符)指定该方法是一个抽象方法,所在的类必须是抽象类,需要由子类实现该方法。

synchronized(同步修饰符) 如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行是每次只能由一个线程运行的意思,并不是说仅能让某一特定线程运行。这种方法称为synchronized方法,有时也称为同步方法。

native(本地修饰符)指定此方法的方法体是用其他语言在程序外部编写的。

你可能感兴趣的:(Java中的控制符修饰符总结)