java访问控制复习的总结

今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:

  场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?

  场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1、fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理?

  此时,访问权限控制便可以起到作用了。

  在Java中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private以及protected。

  注意,上述四种访问权限,只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)

  下面就分别针对修饰类和修饰类的成员(变量和方法)来讲述这四种访问权限控制。

1.修饰类

  默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包[子包也不行!!!例如com.example.class1.java为默认访问权限,它不能在com.example.test.class2.java中import导入]中的其他类可见。

  public:用来修饰类的话,表示该类对其他所有的类都可见。

  下面通过几个例子来看一下两者的区别:

例1:

Main.java:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package com.cxh.test1;

public class Main {

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        

        People people = new People("Tom");

        System.out.println(people.getName());

    }

}

People.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test1;

class People {           //默认访问权限(包访问权限)

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    public String getName() {

        return name;

    }

    

    public void setName(String name) {

        this.name = name;

    }

}

  从代码可以看出,修饰People类采用的是默认访问权限,而由于People类和Main类在同一个包中,因此People类对于Main类是可见的。

  程序运行结果:

  

例子2:

People.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test2;

class People {           //默认访问权限(包访问权限)

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    public String getName() {

        return name;

    }

    

    public void setName(String name) {

        this.name = name;

    }

}

  此时People类和Main类不在同一个包中,会发生什么情况呢?

  下面是Main类中的提示的错误:

  

  提示Peolple类在Main类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的[子包也是不可见的]。

  正如上图的快速修正提示所示,将People类的默认访问权限更改为public的话,People类对于Main类便可见了。

2.修饰类的方法和变量

  默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量[子包也是不可见的]。

  private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地进行访问。

  protected:如果一个类的方法或者变量被protected修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。

  public:被public修饰的方法或者变量,在任何地方都是可见的。

下面再通过几个例子来看一下它们作用域类的方法和变量时的区别:

例3:

Main.java没有变化

People.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test1;

public class People {      

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    String getName() {    //默认访问权限(包访问权限)

        return name;

    }

    

    void setName(String name) {   //默认访问权限(包访问权限)

        this.name = name;

    }

}

  此时在Main类是可以显示调用方法getName和setName的。

但是如果People类和Main类不在同一个包中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test2;    //与Main类处于不同包中

public class People {      

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    String getName() {    //默认访问权限(包访问权限)

        return name;

    }

    

    void setName(String name) {   //默认访问权限(包访问权限)

        this.name = name;

    }

}

  此时在Main类中会提示错误:

  

  由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。

例4:

People.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test1;   

public class People {      

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    protected String getName() {   

        return name;

    }

    

    protected void setName(String name) {  

        this.name = name;

    }

}

  此时是可以在Main中显示调用方法getName和setName的。

如果People类和Main类处于不同包中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.cxh.test2;   

public class People {      

    private String name = null;

    

    public People(String name) {

        this.name = name;

    }

    

    protected String getName() {   

        return name;

    }

    

    protected void setName(String name) {  

        this.name = name;

    }

}

  则会在Main中报错:

  

  如果在com.cxh.test1中定一个类Man继承People,则可以在类Man中显示调用方法getName和setName:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

package com.cxh.test1;

import com.cxh.test2.People;

public class Man extends People{

    public Man(String name){

        super(name);

    }

    

    public String toString() {

        return getName();

    }

}

  下面补充一些关于Java包和类文件的知识:

  1)Java中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;

  2)对于一个Java源代码文件,如果存在public类的话,只能有一个public类,且此时源代码文件的名称必须和public类的名称完全相同,另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有public类,则源代码文件的名称可以随意命名。

原作者:海子

avicii做了一些修改和补充

原文出处:http://www.cnblogs.com/dolphin0520/ 

本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-10-07 00:55:14

java访问控制复习的总结的相关文章

Java访问控制权限

Java的访问控制权限相比于C++等语言可能稍微复杂一点,不过也不难理解.Java的访问控制权限分为两块--"类或接口的访问控制权限"与"变量和方法的访问控制权限". 1.类或接口的访问控制权限     类或接口的访问控制权限是指能不能用该类建立对象,接口能不能被实现等等.能够修饰类或接口的访问控制权限的修饰符(modifier)只有两个--public和friendly.不过,值得一说的是friendly并不是Java的关键字,它只是一个习惯叫法,指的是"

[Java基础] Java线程复习笔记

先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java是第一个在语言层面就支持线程操作的主流编程语言.和进程类似,线程也是各自独立的,有自 己的栈,自己的局部变量,自己的程序执行并行路径,但线程的独立性又没有进程那么强,它们共享内存,文件资源,以及其他进程层面的状态等.同一个进程内的 多个线程共享同样的内存空间,这也就意味着这些线程可以访问同样的变量和

Java高级复习㈠ 多线程

1.线程 也称为轻量级进程,每个线程有自己的堆栈.程序计数器.局部变量.与进程相比,进程中的线程之间隔离程度要小 2.Java实现 ①implements Runnable ②extends Thread 一般推荐① 3.sleep().yield() sleep()方法对当前线程操作,指定以毫秒为单位的线程最小休眠时间,除非线程因中断提早恢复执行,否则不会在这段时间前恢复执行.线程可调用另一线程的interrupt()方法,向暂停的线程发出InterruptedException,变相唤醒暂停

Java阶段复习

实验环境:JDK1.8.0_111 Java阶段复习 ·Java程序的源文件名和源文件里面声明的类名的关系 我们现在有一个名为Review.java的java程序源文件名,源程序如下:         class/*声明类的关键字*/ Review/*类名*/{             /*下面的一行是main方法,main方法的格式是固定的,只有"[]"和"args"不固定,                "args"相当于是一个一维数组的数组

java面向对象复习

Java面向对象复习 1.类是抽象的,对象是具体的 2.方法的重载: 条件: (1):在同一个类中 (2):方法名称相同 (3):方法参数不同 3.构造方法: 语法: (1)必须和类名相同 (2)必须没有返回类型,可以重载 (3)如果没有自定义一个构造方法,系统会为自动创建一个无参构造方法 (4)如果已经自定义了一个构造方法,系统就不会创建这个无参的构造方法 作用: (1)初始化类中的成员变量 (2)完成一些必须的初始化工作 4.this相当于当前对象,一般情况下可以省略 5.作用域: 类的作用

Java面试复习提纲

Java面试复习提纲 作者:egg 邮箱:[email protected] 微博:http://weibo.com/xtfggef 博客:http://blog.csdn.net/zhangerqing 本章主要介绍一下面对即将来临的Java面试,我们应该从哪些方面去复习,将重点知识罗列出来,以便从容复习,在每个内容后面附该内容在本博客的地址! 类与对象   Java之美[从菜鸟到高手演变]之类与对象(一) Java之美[从菜鸟到高手演变]之类与对象(二) Java之美[从菜鸟到高手演变]之类

Java基础复习笔记系列 四

Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时,不能指定其长度.不同于C 数组的小标可以是整型常量或整型表达式. .length方法是显示数组的长度:数组.length;String.length();一个是属性,一个是方法.注意区分. 2.数组的内存分析? Array a[]; a = new Integer(15); /*这个a在栈中,在堆

Java基础复习㈥ 内存分配

1.方法区 类的全限定名.直接超类的全限定名.该类是类或者接口.访问修饰符.直接超接口全限定名: 运行时常量池.字段.方法.静态变量.到类装载器的引用.到类class的引用 2.栈内存 局部变量区.操作数栈.帧数据区 3.堆内存 存放由new创建的对象和数组 *栈内存和堆内存 栈存取速度比堆快,仅次于寄存器,栈数据可以共享.栈中主要存放一些基本类型的变量和对象句柄 4.本地方法栈内存 5.String ① String str1 = "abc"; String str2 = "

Java基础复习笔记系列 五 常用类

Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String s2 = “hello”:结论:s1 == s2. 字符串常量放在data区. 3. String s3 = new String("hello"); String s4 = new String("hello");结论:s3 != s4.但s3.equals(s4).