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. 2015 多校联赛 ——HDU5348(搜索)

    Problem Description As we all kown, MZL hates the endless loop deeply, and he commands you to solve ...

  2. poj 1279 半平面交核面积

    Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6668   Accepted: 2725 Descr ...

  3. [WC2008]游览计划

    [题目描述] 从未来过绍兴的小 D 有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 N 行M 列(N×M)个方块 ...

  4. bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status ...

  5. [APIO2012]

    来自FallDream的博客,未经允许,请勿转载,谢谢. --------------------------------------------------- A.dispatching 派遣 上次 ...

  6. python3 条件判断,循环,三元表达式

    一. 条件判断 条件判断的关键字if elif else,具体规则如下: if condition_1: statement_block_1 elif condition_2: statement_b ...

  7. Linux 基本概念和操作2

    接着上一篇 "Linux 基本概念和操作" 1.删除文件 有时候我们想要删除的文件是只读文件,直接使用rm 文件名,会报错.这时使用" -f " 参数强制删除. ...

  8. c++中sizeof的用法

    /*测试sizeof() 测试环境:windows 7 64位操作系统 VS2012编译器 */ #include <iostream> using namespace std; int ...

  9. c语言第二次作业2

    ---恢复内容开始--- (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 源程序 对源程序进行编译 错误信息1: 错误原因:stdio.h输入错误 改正方法:i和d互换位置 错误信息2: ...

  10. GC其他:引用标记-清除、复制、标记-整理的说明

    对象死亡历程 1.基本的mark&sweep是必须的,后续的都是对他的改进, 2.young代理的survivor就是使用了复制算法,避免碎片 3.还有标记整理算法(压缩),就是将存活的对象移 ...