一文搞懂JAVA 修饰符

一文搞懂JAVA 修饰符

在Java中,修饰符(Modifier)是用来限制或者开放类、接口、方法和变量的访问权限;限制或者限制方法的继承或其他行为。Java中的修饰符分为以下几种:

  • 访问控制修饰符:public,private,protected和默认(即不写)四种修饰符。
  • 继承控制修饰符:final 和 abstract 两种修饰符。
  • 静态修饰符:static 修饰符。
  • 其他修饰符:synchronized 和 transient 等修饰符。

访问控制修饰符

public

public 是最常用的访问控制修饰符,它表示公开的、最高访问级别,可以在同名类或任意一个类中被访问到。例如:

public class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

public class Dog extends Animal {
    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.eat();
        dog.bark();
    }
}

private

private 表示这个成员变量或方法只能在该类的内部可见,不能在外部被访问到。例如:

public class Animal {
    private String name;
    public Animal(String name){
        this.name = name;
    }
    private void printName(){
        System.out.println("Animal's name: " + name);
    }
}

public class Dog extends Animal {
    public Dog(String name){
        super(name);
    }
    public void printOwner(){
        System.out.println("My owner's name is: " + name);
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog = new Dog("Lucy");
        dog.printName();// 编译错误,方法私有
        dog.printOwner();// 正常输出
    }
}

protected

protected 对该类和其子类可见,即同一个包内的其他类和该类的子类可以访问该成员。例如:

package com.demo;
public class Animal {
    protected String name;
    public Animal(String name){
        this.name = name;
    }
}

package com.demo;
public class Dog extends Animal {
    public Dog(String name){
        super(name);
        System.out.println(name); // animal's name
    }
}

package com.test;
import com.demo.Dog;
public class Test {
    public static void main(String[] args){
        Dog dog = new Dog("Lucy");
        dog.name;// 编译错误,不在同一个包内
    }
}

默认访问控制

如果一个类、方法或变量没有声明任何访问控制修饰符(即不加 public、private 或 protected 这些修饰符之一),则它具有默认访问控制,即在同一个包内可见。

继承控制修饰符

final

final 修饰的类不能被继承,修饰方法则不能被子类重写,修饰变量则表示该变量为常量。例如:

public final class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

public class Dog extends Animal { // 编译错误,final类不能继承
}

public class Cat extends Animal {
    public void eat(){
        System.out.println("Cat is eating fish...");
    }
}

public class Test {
    public static void main(String[] args){
        Cat cat = new Cat();
        cat.eat();//吃鱼
    }
}

abstract

abstract 修饰类表示该类是一个抽象类,不能被实例化,只能被继承。abstract 修饰方法表示该方法是一个抽象方法,没有实现。例如:

public abstract class Animal {
    public void eat(){ // 普通方法
        System.out.println("Animal is eating...");
    }
    public abstract void bark(); // 抽象方法
}

public class Dog extends Animal {
    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Test {
    public static void main(String[] args){
        Animal animal = new Animal();// 编译错误,抽象类无法实例化
        Dog dog = new Dog();
        dog.eat(); // 吃
        dog.bark(); // 叫
    }
}

静态修饰符

static 修饰的方法或者变量是属于该类本身,不属于具体的实例,可以被该类的所有实例访问。例如:

public class Dog {
    private static String name;
    public Dog(String name){
        Dog.name = name;
    }
    public static void printName(){
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog1 = new Dog("Lucy");
        Dog dog2 = new Dog("Lily");
        dog1.printName();//Lily,因为最后一次赋值为Lily,name被静态修饰
        dog2.printName();//Lily
    }
}

其他修饰符

synchronized

synchronized 修饰方法表示该方法为同步方法,同一时间只能有一个线程访问该方法。例如:

public class Animal {
    public synchronized void eat(){ // 同步方法
        System.out.println("Animal is eating...");
    }
}

public class Test {
    public static void main(String[] args){
        Animal animal = new Animal();
        new Thread(() -> animal.eat()).start();
        new Thread(() -> animal.eat()).start();
    }
}

transient

transient 修饰的变量表示该变量不会被序列化,即不会保存到输出流中。例如:

public class Animal implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient int age;
}

public class Test {
    public static void main(String[] args) throws Exception {
        Animal animal = new Animal();
        animal.name = "Lucy";
        animal.age = 3;
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("animal.txt")));
        oo.writeObject(animal);
        oo.close();
        ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("animal.txt")));
        Animal newAnimal = (Animal) oi.readObject();
        oi.close();
        System.out.println(newAnimal.name);//Lucy
        System.out.println(newAnimal.age);//0,因为age属性被transient修饰了,不会被序列化
    }
}

总结

本文介绍了Java中修饰符的应用,涉及到访问控制修饰符、继承控制修饰符、静态修饰符和其他修饰符。看完本文,相信大家对Java中的修饰符会有更深刻的理解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂JAVA 修饰符 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • java获取手机已安装APK的签名摘要

    Java获取手机已安装APK的签名摘要的完整攻略 在Java中,我们可以使用PackageManager类和Signature类来获取手机已安装APK的签名摘要。以下是详细的步骤: 获取PackageManager对象 首先,我们需要获取PackageManager对象,用于获取已安装应用的信息。可以使用以下代码获取PackageManager对象: jav…

    other 2023年10月13日
    00
  • Apache+PHP+MySQL搭建PHP开发环境图文教程

    下面我将详细讲解如何搭建Apache+PHP+MySQL的PHP开发环境,包含必要的软件下载、安装和配置过程。 环境要求 要成功搭建PHP开发环境,需要满足以下软件要求: Apache HTTP服务器 PHP MySQL数据库 步骤1:下载安装Apache 在官网下载Apache的最新版本,根据自己的操作系统选择对应的安装程序,然后运行安装程序,按照步骤完成…

    other 2023年6月27日
    00
  • 深度学习遥感影像(哨兵2a/b)超分辨率

    深度学习遥感影像(哨兵2a/b)超分辨率攻略 什么是超分辨率? 超分辨率是一种图像处理技术,旨在将低分辨率图像转换为高分辨率像。在遥感影像处理中,超分辨率技术可以提高遥感影像的分辨率,从而提高遥感影像的量和精度。 哨兵2a/b遥感影像 哨兵2a/b是欧空局(European Space Agency)发射的一组卫星,用于获取高辨率的遥感影像。哨兵2a/b遥感…

    other 2023年5月6日
    00
  • CAD怎么画构造线? CAD绘制构造线的三种方法

    CAD绘图软件提供了多种方法来绘制构造线,下面将详细介绍三种常用的方法。 方法一:使用直线工具 打开CAD绘图软件并创建一个新的绘图文件。 在绘图界面上选择直线工具,通常可以在绘图工具栏或菜单栏中找到。 在绘图界面上点击鼠标左键确定构造线的起点。 移动鼠标并点击鼠标左键确定构造线的终点。 重复步骤3和4,绘制其他构造线。 示例1:绘制一个垂直于X轴的构造线 …

    other 2023年8月6日
    00
  • Java继承构造器使用过程解析

    Java继承构造器使用过程解析 在Java中,继承是一种重要的面向对象编程概念。继承是指子类从父类继承属性和方法。在继承中,子类可以使用其父类的属性和方法,同时也可以添加新的属性和方法。 在Java中,构造器是一种用于初始化对象的特殊方法。Java中的继承涉及到构造器的使用,这里将详细介绍Java继承构造器使用过程。 父类构造器 在Java中,每个类都有一个…

    other 2023年6月26日
    00
  • 傲游浏览器5.0.2正式版发布 更新一览(附下载地址)

    傲游浏览器5.0.2正式版发布 更新一览 傲游浏览器5.0.2正式版已经发布,本文将详细介绍该版本的更新内容和一些示例说明。以下是更新一览: 新增功能 广告拦截器增强:傲游浏览器5.0.2正式版引入了更强大的广告拦截器,可以有效地屏蔽网页上的广告内容,提供更加清爽的浏览体验。示例说明:在以前的版本中,某些网站的广告可能无法完全屏蔽,但在5.0.2版本中,广告…

    other 2023年8月4日
    00
  • 正则表达式常用元字符整理小结

    正则表达式常用元字符是指在正则表达式中具有特殊含义的字符。它们被用于匹配文本中的不同类型的字符。 以下是常用的元字符整理小结: ^:匹配字符串的开始位置,在中括号中表示取反匹配。 $:匹配字符串的结束位置。 .:匹配任意字符,不包括换行符。 *:匹配前一个字符的0个或多个,可以理解为贪婪匹配。 +:匹配前一个字符的1个或多个,也是贪婪匹配。 ?:匹配前一个字…

    other 2023年6月20日
    00
  • CSS2中从优先权重的计算方式来辨别下CSS

    CSS2 中,样式的优先权重是由选择器的特殊性(specificity)和源代码顺序(order)两者共同决定的。通过这个规则,我们可以区分不同优先级的 CSS 规则,并决定哪个样式优先应用。 选择器特殊性 每个选择器都有它自己的特殊性值,表示它的权重。特殊性值靠谱如下: 选择器中每个 ID 值为一个数,即 0, 1, 0, 0 选择器中每个 class 值…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部