Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有,具体规则如下表:

1.私有级别

私有级别的关键字是private,私有级别的成员变量和方法只能在其所在类的内部自由使用,在其他的类中则不允许直接访问。私有级别限制性最高。示例代码如下:

 // PrivateClass.java文件
public class PrivateClass {
private int x; public PrivateClass() {
x = 100;
}
private void printX() {
System.out.println("Value Of x is" + x);
}
} // HelloWorld.java文件调用PrivateClass
public class HelloWorld {
public static void main(String[] args) { PrivateClass p;
p = new PrivateClass(); //编译错误,PrivateClass中的方法 printX()不可见
p.printX();
}
}

上述代码第2行声明PrivateClass类,其中的代码第3行是声明私有实例变量x,代码第5行是声明公有的构造方法。代码第8行声明私有实例方法。HelloWorld类中代码第22行会有编译错误,因为PrivateClass中printX()的方法是私有方法。

2.默认级别

默认级别没有关键字,也就是没有访问修饰符,默认级别的成员变量和方法,可以在其所在类内部和同一个包的其他类中被直接访问,但在不同包的类中则不允许直接访问。示例代码如下:

 // DefaultClass.java文件
package com.Kevin; public class DefaultClass { int x; public DefaultClass() {
x = 100;
} void printX() {
System.out.println("Value Of x is" + x);
} }

上述代码第6行的x变量前没有访问限制修饰符,代码第12行的方法也是没有访问限制修饰符。它们的访问级别都有默认访问级别。

在相同包(com.Kevin)中调用DefaultClass类代码如下:

 // com.Kevin包中HelloWorld.java文件
package com.Kevin; public class HelloWorld { public static void main(String[] args) { DefaultClass p;
p = new DefaultClass();
p.printX();
}
}

默认访问级别可以在同一包中访问,上述代码可以编译通过。

在不同的包中调用DefaultClass类代码如下:

 // 默认包中HelloWorld.java文件
import com.Kevin.DefaultClass; public class HelloWorld { public static void main(String[] args) { DefaultClass p;
p = new DefaultClass();
// 编译错误,DefaultClass中的方法 printX()不可见
p.printX();
}
}

该HelloWorld.java文件与DefaultClass类不在同一个包中,printX()是默认访问级别,所以p.printX()方法无法编译通过。

3.共有级别

公有级别的关键字是public,公有级别的成员变量和方法可以在任何场合被直接访问,是最宽松的一种访问控制等级。示例代码如下:

 // PublicClass.java文件
package com.Kevin; public class PublicClass { public int x; public PublicClass() {
x = 100;
} public void printX() {
System.out.println("Value Of x is" + x);
} }

上述代码第6行的x变量是公有级别,代码第12行的方法也是公有级别。调用PublicClass类代码如下:

 // 默认包中HelloWorld.java文件
import com.Kevin.PublicClass; public class HelloWorld { public static void main(String[] args) { PublicClass p;
p = new PublicClass();
p.printX();
}
}

该HelloWorld.java文件与PublicClass类不在同一个包中,可以直接访问公有的printX()方法。

4.保护级别

保护级别的关键字是protected,保护级别在同一包中完全与默认访问级别一样,但是不同包中子类能够继承父类中的protected变量和方法,这就是所谓的保护级别,“保护”就是保护某个类的子类都能继承该类的变量和方法。示例代码如下:

 // ProtectedClass.java文件
package com.Kevin; public class ProtectedClass { protected int x; public ProtectedClass() {
x = 100;
} protected void printX() {
System.out.println("Value Of x is " + x);
} }

上述代码第6行的x变量是保护级别,代码第12行的方法也是保护级别。

在相同包(com.Kevin)中调用ProtectedClass类代码如下:

 // 默认包中HelloWorld.java文件
package com.Kevin; import com.Kevin.ProtectedClass; public class HelloWorld { public static void main(String[] args) { ProtectedClass p;
p = new ProtectedClass();
// 同一包中可以直接访问ProtectedClass中的方法 printX()
p.printX(); }
}

同一包中保护访问级别与默认访问级别一样,可以直接访问ProtectedClass的printX()方法,上述代码可以编译通过。

在不同的包中调用ProtectedClass类代码如下:

 // 默认包中HelloWorld.java文件
import com.Kevin.ProtectedClass; public class HelloWorld { public static void main(String[] args) { ProtectedClass p;
p = new ProtectedClass();
// 编译错误,不同包中不能直接访问保护方法printX()
p.printX(); }
}

该HelloWorld.java文件与ProtectedClass类不在同一个包中,不同包中不能直接访问保护方法printX(),所以p.printX()方法无法编译通过。

在不同的包中继承ProtectedClass类代码如下:

 // 默认包中SubClass.java文件
import com.Kevin.ProtectedClass; public class SubClass extends ProtectedClass { void display() {
//printX()方法是从父类继承过来
printX();
//x实例变量是从父类继承过来
System.out.println(x);
}
}

不同包中SubClass从ProtectedClass类继承了printX()方法和x实例变量。代码第8行是调用从父类继承下来的方法,代码第10行是调用从父类继承下来的实例变量。

提示 访问成员有两种方式:一种是调用,即通过类或对象调用它的成员,如p.printX()语句;另一种是继承,即子类继承父类的成员变量和方法。

  • 公有访问级别任何情况下两种方式都可以;

  • 默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;

  • 保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之外只能继承访问;

  • 私有访问级别只能在本类中通过调用方法访问,不能继承访问。

 

提示 访问类成员时,在能满足使用的前提下,应尽量限制类中成员的可见性,访问级别顺序是:私有级别→默认级别→保护级别→公有级别。

[ Java学习基础 ] Java的封装性与访问控制的更多相关文章

  1. [ Java学习基础 ] Java构造函数

    构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...

  2. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  3. [ Java学习基础 ] Java的抽象类与接口

    一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...

  4. [ Java学习基础 ] Java异常处理

    一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Sys ...

  5. [ Java学习基础 ] Java的对象容器 -- 集合

    当你有很多书时,你会考虑买一个书柜,将你的书分门别类摆放进入.使用了书柜不仅仅使房间变得整洁,也便于以后使用书时方便查找.在计算机中管理对象亦是如此,当获得多个对象后,也需要一个容器将它们管理起来,这 ...

  6. [ Java学习基础 ] Java对象的创建和销毁

    类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...

  7. Java学习--基础

    java学习 基础 Java三大版本 javase 标准版 占领桌面端(基础) javame 移动版 嵌入式开发.占领手机端 javaee 企业版 占领服务器端 Java的特性和优势 跨平台.可移植性 ...

  8. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

  9. Java 学习(20):Java Applet 基础 & Java 文档注释

    -- Java Applet 基础 -- Java 文档注释 Java Applet 基础 Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Ja ...

随机推荐

  1. C语言第一次作业——输入输出格式

    题目1温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 #include& ...

  2. initializer element is not a compile-time constant

    初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 如下就会报这个错误(KUIScreenWidth)是变量 static CGFloat const topButtonWidt ...

  3. 算法第四版 coursera公开课 普林斯顿算法 ⅠⅡ部分 Robert Sedgewick主讲《Algorithms》

    这是我在网上找到的资源,下载之后上传到我的百度网盘了. 包含两部分:1:算法视频的种子 2:字幕 下载之后,请用迅雷播放器打开,因为迅雷可以直接在线搜索字幕. 如果以下链接失效,请在下边留言,我再更新 ...

  4. Flask 扩展 Flask-PyMongo

    安装 pip install Flask-PyMongo 初始化Pymongo实例 from flask import Flask from flask.ext.pymongo import PyMo ...

  5. 18-TypeScript模板方法模式

    在有些情况下,一个功能在基础功能上是不会变的,算法的基本骨架也是确定的,但是在某些场景下算法的具体实现有些差异.应对这种问题,可以采用模板方法模式: abstract class Salary{ ab ...

  6. Mego(1) - NET中主流ORM框架性能对比

    从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...

  7. Mego(03) - ORM框架的新选择

    前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...

  8. WebApi 接口返回值类型详解 ( 转 )

    使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...

  9. Linq 等式运算符:SequenceEqual

    检查元素的数量,每个元素的值及两个集合中元素的顺序是否相等,3个方面都相等则为true,否则为false IList<string> strList1 = new List<stri ...

  10. apigw鉴权分析(1-1)阿里数加 - 鉴权方式分析

    一.访问方式 1.访问阿里云首页 https://www.aliyun.com/?utm_medium=text&utm_source=bdbrand&utm_campaign=bdb ...