Java使用三个关键字在类的内部设定访问权限:public、private、protected。这些访问指定词(access specifier)决定了紧跟其后被定义的成员(方法或属性)可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者(类内部访问)和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。

Java还有一种默认的访问权限,当没有使用任何访问指定词时,它将发挥作用。这种权限通常被称为“包访问权限”,因为在这种权限下,类可以访问在同一个包中的其他类的成员,但是在包之外,这些成员如同指定了private一样。

protected关键字与默认权限作用相当,差别仅在于在包外继承的类可以访问protected成员,但是不能访问默认权限成员。

(以上是看了Java编程思想中文第四版总结的,英文版没看过。但是关于访问权限的解释有部分是不对的。

由此看来,不论看什么书,都要抱着怀疑的态度,看后实践才是硬道理。)

例子:

1.测试类内访问:

package synnex.demo.access;

public class AccessDemo {

    public String name;
    private int age;
    protected String address;
    String phoneNumber;

    public AccessDemo() {
    }

    /**
     * @param name
     * @param age
     * @param address
     * @param phoneNumber
     */
    public AccessDemo(String name, int age, String address, String phoneNumber) {
        //构造函数属于类的内部方法,可以访问任何权限的成员。
        super();
        this.name = name;
        this.age = age;
        this.address = address;
        this.phoneNumber = phoneNumber;
    }

    public static void main(String[] args) {

        //main方法在类型创建者内部,故也可以访问任何权限的成员。
        AccessDemo demo = new AccessDemo();
        demo.name = "name";
        demo.age = 26;
        demo.address = "beijing";
        demo.phoneNumber = "13520968888";

    }

}

2.包内的类访问:

package synnex.demo.access;

public class PackageAccessDemo {
    public PackageAccessDemo() {
    }

    public static void main(String[] args) {
        AccessDemo demo = new AccessDemo();
        //在同一个包中的类,除了访问不到private类的成员,其他的都可以直接访问到。
        demo.name = "namepackage";
//        demo.age = 26;
        demo.address = "shanghai";
        demo.phoneNumber = "222222222222";
    }

}

3.包外非继承的类访问:

package synnex.demo;

import synnex.demo.access.AccessDemo;

public class AccessOutpackageDemo2 {
    public AccessOutpackageDemo2() {
    }

    public static void main(String[] args) {

        AccessDemo demo = new AccessDemo();
        //对于包外非继承关系的类,只有public权限的成员可以直接访问到。
        demo.name = "out package no extends";
//        demo.age = 26;
//        demo.address = "nanjing";
//        demo.phoneNumber = "13520968888";
    }

}

4.包外继承的类访问:

package synnex.demo;

import synnex.demo.access.AccessDemo;

public class AccessOutpackageDemo1 extends AccessDemo {
    public AccessOutpackageDemo1() {
    }

    public static void main(String[] args) {

        AccessOutpackageDemo1 demo = new AccessOutpackageDemo1();
        //对于包外继承关系的类,public和protected权限的成员可以直接访问到。
        demo.name = "out package extends";
//        demo.age = 26;
        demo.address = "nanjing";
//        demo.phoneNumber = "13520968888";
    }

}

总结如下图:

访问修饰符

同一个类

同包

不同包,子类

不同包,非子类

private

protected

public

默认

Java的访问权限详解(3+1)public private protected default的更多相关文章

  1. 访问权限系列一(public/private/protected/default):成员变量

    通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...

  2. C++之类成员的访问权限详解(一)

    概念解析 众所周知,面向对象编程语言的特征之一就是封装,不同编程语言对于封装提供的实现有所不同,但原理大体上是相同的.C++提供了三种不同程度的访问权限来实现,主要是通过public.private. ...

  3. scala 访问权限详解

    private/protected [包名/类名/this] 即可指定变量的作用域.(this代表只有当前实例(即对象)可以访问) 伴生类和伴生对象中的成员可以相互访问. class PackageO ...

  4. java中public private protected default的区别

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  5. 访问修饰符 public private protected default

  6. 【Linux学习】Linux下用户组、文件权限详解

    原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...

  7. java之AbstractStringBuilder类详解

    目录 AbstractStringBuilder类 字段 构造器 方法   public abstract String toString() 扩充容量 void  expandCapacity(in ...

  8. (转)Mysql数据库之Binlog日志使用总结Linux下用户组、文件权限详解

    Linux下用户组.文件权限详解 原文:http://blog.csdn.net/sdulibh/article/details/51566772 用户组 在linux中的每个用户必须属于一个组,不能 ...

  9. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

随机推荐

  1. ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...

  2. 【NOIP2017 OFO(下)】

    ·我不知道对不对,只是不想让大米兔就这样离开.      by tkys_Austin;                    [另一只情绪化的兔子]        今年的11月12日NOIP提高组, ...

  3. hdu 5641 BestCoder Round #75

    King's Phone  Accepts: 310  Submissions: 2980  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  4. [bzoj4828][Ah/Hnoi2017]大佬

    来自FallDream的博客,未经允许,请勿转载,谢谢. 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你 ...

  5. CTSC2017 铁牌记

    Day 0: 先到了丽都酒店. 看见北京八十中学生在发胸牌手册和T恤,领完之后开始分房间. 我和ryc一屋,lyd和ysq一屋,yzy和gzz分到了珀利酒店,老师尝试了半天把我们分到一个酒店,失败了. ...

  6. 勤拂拭软件系列教程 之 Android开发之旅

    勤拂拭软件工作室持续推出Android开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢Android的朋友们学习进步: 1. 勤拂拭软件Android开发之旅(1) 之 Android 开发环 ...

  7. Python中模块之xml的讲解

    xml模块的功能介绍 这里主要讲解xml模块下的etree.ElementTree类. 1. 创建 具体代码如下 import xml.etree.ElementTree as XM namelist ...

  8. js 删除字符串中所有空格

    //去除头尾和中间空格,制表符 function trimSpaces(Str){               var ResultStr = "";               ...

  9. Flexible DEMO 实现手淘H5页面的终端适配

    <!DOCTYPE html> <html> <head> <title>淘宝flexiblejs</title> <meta cha ...

  10. Vue生命周期-手动挂载理解

    改前端遇到个bug,console能够输出值,但是前端不能显示. 我简直一脸懵逼,vue的问题?网络的问题?浏览器的缓存问题? 公司网络,所以直接排除网络问题. 浏览器缓存,试了下确实一定概率可以显示 ...