【前端学java】类中的访问权限详解,通俗易懂(5)

简介: 【8月更文挑战第9天】类中的访问权限详解,通俗易懂(5)

访问修饰符

在Java类中,属性也称为成员变量实例变量,其声明语法如下:

<访问修饰符> <数据类型> <属性名>;

访问修饰符用于控制属性的可见性和访问范围,也就是Java中的访问权限。

  • private:只能在同一个类中访问。
  • default(默认权限、不写修饰符):可以在同一个包内访问。
  • protected:可以在同一个包内或子类中访问。
  • public:可以从任何地方访问。
同一个类中 同一个包中 不同包的子类 不同包的无关类
public
protected
无(空着不写)
private

private

private表示类的私有属性,只能在类自身中访问
如图,我们在Person类中定义了一个私有属性name,在实例化的对象中访问时,会报错
image.png

default

当我们不写修饰符,即不设定任何权限时,JVM会提供默认权限,即包权限。

public class Auth {
   
   
    public static void main(String[] args) {
   
   
        // TODO 面向对象 - 访问权限
        Person people = new Person();
        System.out.println(people.name);
    }
}

class Person {
   
   
    String name = "shixiaoshi";
}

上述代码中,我们在Person类中定义了name属性,并没有指明权限属性,这个时候它就是默认权限,可以在这个包文件内任意地方访问。
我们在看一个例子,我们定义一个Object2的包,包内的Auth方法中定义一个name属性,他是默认权限。
image.png
然后,我们在Object1的包内访问这个name属性
image.png
由于name属性是包权限,所以当我们跨包的时候,就无法访问到了。

protected

public

public是公共的访问权限修饰符,在任何地方都可以用。

公共类的唯一性

如下图,当我们在同一个java源码中写第二个public时,代码就会报错。
GIF 2023-7-25 11-06-59.gif

类名与文件名一致性

公共类的文件名必须与源码文件名相同
如下图,源码文件名为Auth,当我们把类名改成Auth1时,代码就会报错
GIF 2023-7-25 11-10-05.gif

main方法的public

main方法的public是不能删除的。如下图,删除public后,main方法就无法执行了
GIF 2023-7-25 11-16-36.gif

main方法是有JVM调用的,JVM调用时,应该可以任意调用,而不用考虑权限问题。

main方法的static表示其是Auth类的自身的静态成员,也不能删除(方便JVM虚拟机执行)。

Java中的内部类与外部类

简述

在Java类中,属性可以通过访问修饰符来控制访问权限,访问修饰符有四种

  • private:只能在同一个类中访问。
  • default:(什么都不写)可以在同一个包内访问。
  • protected:可以在同一个包内或子类中访问。
  • public:可以从任何地方访问。

比如,下面的Auth类中就有一个私有属性name

public class Auth {
   
   
    private String name ="shixiaoshi";
    public static void main(String[] args) {
   
   

    }
}

那Auth类本身可以用这四种修饰符修饰吗?要解决这个问题,我们需要先了解一下什么是内部类,什么是外部类
观察下面代码

package Object;
public class Auth {
   
   
    private String name ="shixiaoshi";
    public static void main(String[] args) {
   
   

    }
}

class People {
   
   
    public class InnerClass {
   
   

    }
}
  • 在源码中(即Object包内)直接声明的类就是外部类,如 Auth、People
  • 在类中声明的类就是内部类,如InnerClass

外部类的修饰符

如图,我们定义了四个类,分别加上了不同修饰符
image.png
根据编译器的报错结果可知,Java不允许外部类使用privateprotected修饰符

内部类的访问

public class People {
   
   
    OuterClass outer = new OuterClass();
    // 内部类可以看做外部类的属性
    OuterClass.InnerClass innerClass = outer.new InnerClass();
}
class OuterClass {
   
   
    // 内部类
    public class InnerClass{
   
   

    }
}

内部类可以看做外部类的一个属性,因此可以使用所有修饰符。上述代码中,通过OuterClass outer = new OuterClass();创建了OuterClass类的实例,通过outer.new InnerClass()实例化了内部类。OuterClass.InnerClass指明了innerClass的数据类型。

单例模式

类的构造函数也是支持访问修饰符的。如protected权限

public class People {
   
   
    public static void main(String[] args) {
   
   
        Dog ww = new Dog();
    }
}
class Dog {
   
   
    protected Dog(){
   
   
      System.out.println("汪汪");
  }
}

public权限

public class People {
   
   
    public static void main(String[] args) {
   
   
        Dog ww = new Dog();
    }
}
class Dog {
   
   
    public Dog(){
   
   
      System.out.println("汪汪");
  }
}

JVM默认提供给类的构造方法,其实就是公共的,无参的构造方法。

但是,直接使用private权限时,就会报错
image.png

那么,什么时候private权限是在什么使用呢?

1、类的创建过程复杂(禁止外部类使用)
2、实现单例模式

public class People {
   
   
    public static void main(String[] args) {
   
   
        Dog ww = Dog.getInstance();
    }
}
class Dog {
   
   
    private static Dog dog = null;
    private Dog(){
   
   
      System.out.println("汪汪");
    }
    public static Dog getInstance(){
   
   
        if(dog == null){
   
   
            dog = new Dog();
        }
        return dog;
    }
}
相关文章
|
13天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
42 0
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
5天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
3天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
13天前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
1天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
11天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
8天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
61 6
【Java学习】多线程&JUC万字超详解
下一篇
DDNS