Java修饰符

Java修饰符用来定义类、方法、变量,通常放在语句的最前端,修饰符主要分为两类:

  • 访问控制修饰符
  • 非访问修饰符

访问控制修饰符

访问控制修饰符定义类、变量、方法的访问权限。Java支持4种访问控制修饰符:public, protected, default, private.

  • public:修饰类、接口、方法、变量,所修饰的对象对所有类可见。
  • protected:修饰变量和方法,所修饰的对象对同一包内的类可见,若子类不在同一个包内,则该子类只能访问其继承的成员。(详情见Java protected 关键字详解
  • default:修饰类、接口、方法、变量,当缺省访问控制修饰符时默认为default,所修饰的对象在同一包内可见。
  • private:修饰变量和方法,所修饰的对象只在同一类内可见。用private修饰的变量不能被外部直接访问,通常需要通过getter和setter方法间接访问,实现对对象成员变量的保护。
/*Person.java------------------------------------*/
package model1;

public class Person {
    private String name;
    private int age;
    String gender; //访问控制修饰符为default,同一包内可见

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected void setAge(int age) {
        this.age = age;
    }

    protected int getAge() {
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    protected void sayHi() {
        System.out.println("Hi");
    }
}
/*Student--------------------------------------*/
package model1;

public class Student extends Person{
    public Student(String name, int age) {
        super(name, age);
    }

    public void setGender(String gender) {
        this.gender = gender;//由于处于同一包内,可以访问Person的gender变量
    }
}
/*Teacher------------------------------------*/
package model2;

import model1.Person;

public class Teacher extends Person {
    private int klass;
    public Teacher(String name, int age) {
        super(name, age);
        this.klass = klass;
    }

    public void setGender(String gender) {
        this.gender = gender;//model1包内的Person的成员变量gender对model2包不可见
    }

    public void greet() {
        super.sayHi();
    }
}
/*Main.java------------------------------*/
import model1.Person;
import model1.Student;
import model2.Teacher;

public class Main {

    public static void main(String[] args) {
        Person student = new Student("Jason", 20);
        ((Student) student).setGender("male");//setGender方法来源于Student类,可以访问同一包内的gender变量
        Person teacher0 = new Teacher("Jack", 30);
        teacher0.sayHi();//Compile Error,Main类不在model1包中,也不是Person的子孙类,不能访问sayHi方法
        Teacher teacher1 = new Teacher("John", 32);
        teacher1.greet();//通过Teacher类中的greet方法访问Person的sayHi方法,Teacher类是Person类的子类,可以访问sayHi方法
    }
}

区别见下表

修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N详解 N
default Y Y Y N N
private Y N N N N

非访问修饰符

非访问修饰符实现一些其他功能

  • static 修饰符,用来修饰类方法和类变量。
    static修饰的变量和方法称为静态变量静态方法,也叫类变量类方法,静态变量和静态方法不随着创建对象而创建,它们属于类本身所有。
  • final 修饰符,用来修饰类、方法和变量。
    • final修饰的类不能够被继承。
    • final修饰的方法可以被继承,但是不能被子类重新定义。
    • 修饰的变量为常量,是不可修改的,用final修饰的常量在创建时必须赋值。
public class Test{
  final int value = 10;
  // 下面是声明常量的实例
  public static final int BOXWIDTH = 6;
  static final String TITLE = "Manager";
 
  public void changeValue(){
     value = 12; //将输出一个错误
  }
}
  • abstract修饰符,用来创建抽象类和抽象方法。
  • synchronized修饰符声明的方法同一时间只能被一个线程访问。
  • volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
  • transient 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 修饰符用来定义类、方法或者变量的,通常放在语句最前端。Java提供了很多修饰符,主要分为两类:访问修饰符、非访问修...
    TESTME阅读 212评论 0 0
  • Java修饰符 Java语言提供的很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符修饰符用来定义类、方法或...
    狐仙大人_阅读 386评论 0 0
  • 无处安放的手 我好像是个喜欢逃避的人,有时候常常知道自己哪里不足,却一直选择逃避,不愿付出行动。 想要好好学一些东...
    铅笔只演绎黑白阅读 123评论 0 0
  • 我们总有一天要习惯身边所有人的离开,包括自己。 曾经我以为至亲的人死亡是一件很遥远的事情,知道自己暂时还没有强大到...
    _未几阅读 776评论 1 3
  • 临夏市春运交通安全工作日报:2月15日,我市春运交通安全总体态势平稳,天气局部多云,辖区交通秩序良好,无交通堵塞情...
    独唱团00阅读 152评论 0 1