重新精读《Java 编程思想》系列之public,protected,private与无修饰符权限的区别

简介: 重新精读《Java 编程思想》系列之public,protected,private与无修饰符权限的区别

前言

相信大家在平时的工作中对于public和private的修饰权限是用的比较多的。对于protected和无修饰符用的是比较少的。我也一样,在读书的时候,又看到了这个问题,于是,在此进行总结和详细的钻研,来认真区分这些修饰符。分享给大家,供大家参考。

导图

我们先来看一张总体的导图,对这几个访问权限进行一个总体的了解。然后我们通过示例进行分别验证。

我们在进行实例验证的时候,也是由类内部,同个包,子类和其他范围进行验证。

public修饰符

类内部

我们定义一个类,在类内部是可以正常访问变量的。

public class PublicVar {

    public String pubicString;

    public void test() {
        String s = pubicString;
    }

}

同个包

在当前类的同包下,建立一个类,创建对象,发现可以正常访问类的public变量。

public class PublicVarSamePackage {

    public void test(){
        PublicVar publicVar = new PublicVar();
        String a = publicVar.pubicString;
    }

}

子类

public class ChildrenPublicVar extends PublicVar {

    public void test(){
        String s = pubicString;
    }

}

子类中可以访问到父类的public变量。需要说明的是,子类无论是在同包下还是非同包下都可以。

其他范围

其他范围我们可以理解为在其他包的类能否访问到public变量。这里是可以的。

public class PublicVarDiffPackage {

    public void test(){
        PublicVar publicVar = new PublicVar();
        String a = publicVar.pubicString;
    }

}

protected修饰符

类内部

与public修饰符一样,在类内部是可以正常访问的。

public class ProtectedVar {

    protected String protectedString;

    public void test() {
        String s = protectedString;
    }

}

同个包

与当前类在同一个包下的类可以正常访问变量。

public class ProtectedVarSamePackage {

    public void test(){
        ProtectedVar protectedVar = new ProtectedVar ();
        String a = protectedVar.protectedString;
    }

}

子类

当是子类的时候,无论该子类与父类在同一包下还是不同包下,都可以正常访问该变量。

public class ChildrenProtectedVar extends ProtectedVar {

    public void test(){
        String s = protectedString;
    }

}

其他范围

其他范围的时候,如果与当前类在同一包下,则可以访问该protected变量。如果不在同一包下,则不可以访问编译器会报错。

private修饰符

类内部

private 修饰的变量在类的内部可以正常访问。

同个包

同个包下的其他类不可访问private变量。

子类

子类也不可以访问private变量。

其他范围

其他范围也不可访问类的private变量。

无修饰符

无修饰符和protected修饰符在类内部,同包,其他范围的访问模式,但是对于子类,就有一些不一样了。

类内部

可以正常访问。

同包

可以正常访问。

其他范围

可以正常范围。

子类

子类这里要重点介绍一下,当子类与父类在同一包下的时候,子类可以访问父类的无修饰符变量。
当子类与父类不同包的时候,子类无法访问父类的无修饰符变量。编译器会提示报错。

总结

支持修饰符修饰变量的作用范围就介绍到此。希望大家已经理解。主要注意无修饰符的子类访问情况即可。

相关文章
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
86 14
|
1月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
25 1
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
66 8
|
2月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
3月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
1天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
31 17
|
12天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
14天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
14天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
14天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
39 3