Java 修饰符

Java 是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。本文主要介绍Java 修饰符。

1、修饰符

public关键字是访问修饰符,表示用于设置类,属性,方法和构造函数的访问级别。

我们将修饰符分为两种:

  • 访问修饰符-控制访问级别
  • 非访问修饰符-不控制访问级别,但提供其他功能

2、访问控制修饰符

对于,可以使用publicdefault

修饰符

描述

public

该类可由任何其他类访问

default

当使用不指定修饰符时,该类只能由同一包中的类访问。

对于属性,方法和构造函数,可以使用以下之一:

修饰符

描述符

public

可用于所有类

private

只能在声明的类中访问

default

当使用不指定修饰符时,该类只能由同一包中的类访问。

protected

对同一包内的类和所有子类可见。

3、非访问修饰符

对于,可以使用finalabstract

修饰符

描述

final

final 修饰的类不能够被继承

abstract

用来创建抽象类

对于属性和方法,可以使用以下之一:

修饰符

描述

final

修饰的方法不能被继承类重新定义

static

修饰的属性和方法属于类,而不是对象

abstract

只能在抽象类中使用,并且只能在方法上使用。

该方法没有实现,例如,

abstract void run();。 方法由子类实现。

transient

序列化包含修饰的属性和方法的对象时,将忽略这些属性和方法

synchronized

一次只能由一个线程访问方法

volatile

当写一个volatile变量时,
JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。
当读一个volatile变量时,
JMM会把该线程对应的本地内存置为无效。
线程接下来将从主内存中读取共享变量。

4、final修饰符

如果不希望覆盖现有的属性值,请将属性声明为final

例如:

public class Main {
  final int x = 10;
  final double PI = 3.14;

  public static void main(String[] args) {
    Main myObj = new Main();
    myObj.x = 50; // 会产生一个错误: cannot assign a value to a final variable
    myObj.PI = 25; // 会产生一个错误: cannot assign a value to a final variable
    System.out.println(myObj.x);
  }
}

5、static修饰符

static方法是类方法,不需要创建类的对象就可以访问,这与public不同:

例如:

下面示例说明staticpublic方法之间的区别:

public class Main {
  // 静态方法
  static void myStaticMethod() {
    System.out.println("可以在不创建对象的情况下调用静态方法");
  }

  // 公共方法
  public void myPublicMethod() {
    System.out.println("公共方法必须通过创建对象来调用");
  }

  // main方法
  public static void main(String[ ] args) {
    myStaticMethod(); // 调用静态方法
    // myPublicMethod(); 会出错

    Main myObj = new Main(); // 创建Main类的对象
    myObj.myPublicMethod(); // 调用方法
  }
}

6、abstract修饰符

abstract抽象方法属于abstract类,并且该方法没有实现。方法由子类实现:

例如:

// MyClass.java
public class MyClass {
  public static void main(String[] args) {
    // 创建Student类的一个对象(从Person继承属性和方法)
    Student myObj = new Student();

    System.out.println("Name: " + myObj.fname);
    System.out.println("Age: " + myObj.age);
    System.out.println("year: " + myObj.year);
    myObj.study(); // 调用抽象方法
 }
}

//Main.java 抽象类 
abstract class Person {
  public String fname = "cjavapy";
  public int age = 3;
  public abstract void study(); // abstract method
}
// 子类 (从Main类继承)
class Student extends Person {
  public int year = 2017;
  public void study() { // 实现抽象方法
    System.out.println("好好学习,天天向上!!!");
  }
}








推荐阅读
cjavapy编程之路首页