一文搞懂JAVA 修饰符

yizhihongxing

一文搞懂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日

相关文章

  • vba-如何激活特定的工作簿和特定的工作表?

    VBA-如何激活特定的工作簿和特定的工作表? 在VBA中,我们可以使用Activate方法来激活特定的工作簿和工作表。本文中,我们将详细讲解如何使用Activate方法来激活特定的工作簿和工作表。同时,我们还提供两个示例说明,演示如何使用Activate`方法。 激活特定的工作簿 以下是一个示例代码: Sub ActivateWorkbook() Workb…

    other 2023年5月8日
    00
  • ip地址有冲突怎么办 局域网ip冲突如何解决

    解决局域网IP地址冲突的攻略 当局域网中的两个或多个设备拥有相同的IP地址时,就会发生IP地址冲突。这种情况下,网络通信可能会受到干扰,因此需要解决这个问题。下面是解决局域网IP地址冲突的完整攻略: 1. 确认IP地址冲突 首先,需要确认是否存在IP地址冲突。可以通过以下步骤进行确认: 打开命令提示符或终端窗口。 输入命令 ipconfig(Windows)…

    other 2023年7月30日
    00
  • win11刚开机cpu就满了怎么办?win11刚开机cpu占用100%解决方案

    针对“win11刚开机cpu就满了怎么办?win11刚开机cpu占用100%解决方案”这个问题,我给出以下完整的攻略: 问题原因分析 首先需要分析导致 CPU 占用率达到100% 的原因,这主要包括以下几个方面: 进程异常:可能有某些进程异常,一直占用 CPU。 资源竞争:某些高 CPU 使用率的程序在同一时间竞争计算机资源。 系统服务异常:有时某些系统服务…

    other 2023年6月26日
    00
  • CMD命令行将当前磁盘所有文件名写入到文本文件的方法

    完整攻略如下: 1. 打开CMD命令行 点击开始菜单,搜索cmd或者运行(cmd.exe),即可打开CMD命令行。 2. 切换到当前磁盘 使用CD命令切换到当前正在使用的磁盘,例如切换到E盘,命令为: E: 3. 运行dir命令,将结果输出到文本文件 使用dir命令显示当前目录下的所有文件和文件夹,命令为: dir > 文件名.txt 其中文件名.tx…

    other 2023年6月26日
    00
  • Ajax客户端异步调用服务端的实现方法(js调用cs文件)

    实现客户端异步调用服务端可以采用Ajax技术,其中涉及到JavaScript调用C#文件的方法。具体实现步骤如下: 创建ASP.NET Web应用程序,包括服务端(C#文件)和客户端(HTML文件或ASPX页面)。 在服务端创建一个Web方法,使用[System.Web.Services.WebMethod]属性标记,以便供客户端异步调用。例如: “` u…

    other 2023年6月27日
    00
  • Visual Studio 2019 DLL动态库连接实例(图文教程)

    “Visual Studio 2019 DLL动态库连接实例(图文教程)”是一篇介绍如何在Visual Studio 2019中使用动态链接库(DLL)的教程。该教程旨在让读者了解如何创建和使用DLL,并且包含了基本的代码示例和图文说明。下面是该教程的完整攻略,包括两条示例说明: 1. 创建动态链接库 首先,我们需要创建一个动态链接库项目。在Visual S…

    other 2023年6月26日
    00
  • 利用shell脚本循环读取文件中每一行的方法详解

    当需要在shell脚本中读取文件中的每一行进行处理时,可以使用while循环或for循环。下面将详细介绍这两种方法。 方法一:使用while循环 使用while循环是一种常见的读取文件中每行的方法。该方法的基本语法如下: while read line do # 处理每一行的代码 done < filename 其中,read line命令用于读取文件…

    other 2023年5月8日
    00
  • Spring复杂对象创建的方式小结

    以下是使用标准的Markdown格式文本,详细讲解Spring复杂对象创建的方式的完整攻略: Spring复杂对象创建的方式小结 1. 构造函数注入 构造函数注入是一种常见的方式,通过构造函数将依赖项注入到目标对象中。以下是一个示例: public class UserService { private UserRepository userReposito…

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