[ Java学习基础 ] Java的封装性与访问控制

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

1.私有级别

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

 1 // PrivateClass.java文件
 2 public class PrivateClass {
 3     private int x;
 4
 5     public PrivateClass() {
 6         x = 100;
 7     }
 8     private void printX() {
 9         System.out.println("Value Of x is" + x);
10     }
11 }
12
13
14 // HelloWorld.java文件调用PrivateClass
15 public class HelloWorld {
16     public static void main(String[] args) {
17
18         PrivateClass p;
19         p = new PrivateClass();
20
21         //编译错误,PrivateClass中的方法 printX()不可见
22         p.printX();
23     }
24 }

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

2.默认级别

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

 1 // DefaultClass.java文件
 2 package com.Kevin;
 3
 4 public class DefaultClass {
 5
 6     int x;
 7
 8     public DefaultClass() {
 9         x = 100;
10     }
11
12     void printX() {
13         System.out.println("Value Of x is" + x);
14     }
15
16 }

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

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

 1 // com.Kevin包中HelloWorld.java文件
 2 package com.Kevin;
 3
 4 public class HelloWorld {
 5
 6     public static void main(String[] args) {
 7
 8         DefaultClass p;
 9         p = new DefaultClass();
10         p.printX();
11     }
12 }

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

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

 1 // 默认包中HelloWorld.java文件
 2 import com.Kevin.DefaultClass;
 3
 4 public class HelloWorld {
 5
 6     public static void main(String[] args) {
 7
 8         DefaultClass p;
 9         p = new DefaultClass();
10         // 编译错误,DefaultClass中的方法 printX()不可见
11         p.printX();
12     }
13 }

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

3.共有级别

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

 1 // PublicClass.java文件
 2 package com.Kevin;
 3
 4 public class PublicClass {
 5
 6     public int x;
 7
 8     public PublicClass() {
 9         x = 100;
10     }
11
12     public void printX() {
13         System.out.println("Value Of x is" + x);
14     }
15
16 }

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

 1 // 默认包中HelloWorld.java文件
 2 import com.Kevin.PublicClass;
 3
 4 public class HelloWorld {
 5
 6     public static void main(String[] args) {
 7
 8         PublicClass p;
 9         p = new PublicClass();
10         p.printX();
11     }
12 }

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

4.保护级别

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

 1 // ProtectedClass.java文件
 2 package com.Kevin;
 3
 4 public class ProtectedClass {
 5
 6     protected int x;
 7
 8     public ProtectedClass() {
 9         x = 100;
10     }
11
12     protected void printX() {
13         System.out.println("Value Of x is " + x);
14     }
15
16 }

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

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

 1 // 默认包中HelloWorld.java文件
 2 package com.Kevin;
 3
 4 import com.Kevin.ProtectedClass;
 5
 6 public class HelloWorld {
 7
 8     public static void main(String[] args) {
 9
10         ProtectedClass p;
11         p = new ProtectedClass();
12         // 同一包中可以直接访问ProtectedClass中的方法 printX()
13         p.printX();
14
15     }
16 }

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

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

 1 // 默认包中HelloWorld.java文件
 2 import com.Kevin.ProtectedClass;
 3
 4 public class HelloWorld {
 5
 6     public static void main(String[] args) {
 7
 8         ProtectedClass p;
 9         p = new ProtectedClass();
10         // 编译错误,不同包中不能直接访问保护方法printX()
11         p.printX();
12
13     }
14 }

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

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

 1 // 默认包中SubClass.java文件
 2 import com.Kevin.ProtectedClass;
 3
 4 public class SubClass extends ProtectedClass {
 5
 6     void display() {
 7         //printX()方法是从父类继承过来
 8         printX();
 9         //x实例变量是从父类继承过来
10         System.out.println(x);
11     }
12 }

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

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

  • 公有访问级别任何情况下两种方式都可以;
  • 默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;
  • 保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之外只能继承访问;
  • 私有访问级别只能在本类中通过调用方法访问,不能继承访问。

 

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

原文地址:https://www.cnblogs.com/Kevin-ZhangCG/p/8892987.html

时间: 2024-10-01 21:57:55

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

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

构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只能与new运算符结合使用. 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int width; 9 // 矩形高度 10 int hei

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

一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用

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

类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别,语法格式如下: type objectName; 其中type是引用类型,即类.接口和数组.示例代码如下: String name; 该语句声明了字符串类型对象name.可以声明并不为对象分配内存空间,而只是分配一个引用. 实例化 实例化过程分为两个阶段:为对象分配内存空间和初始化对象,首先使用n

Java学习基础2

运算符: ++:  int a = 4;  int b = a++;    ++在后:先运算在递增1   输出:a=5  b=4;    int b = ++a;    ++在前:先递增1,再运算 输出:a=5  b=5;   --:   同上  & &&:  &:逻辑与  &&:短路与  若&&勤勉的表达式的结果是false,&&后面的表达式就再执行   | ||:  |:逻辑或  ||:短路或  若||前面的表达式的结果是

Java学习基础1

Java 平台: Java API JVM  特点:可跨平台  Java 运行机制:           编译                         运行 Java文件------->class文件(可跨平台)-------->程序结果  jdk:开发工具  jre:   :JVM jre:运行环境  JVM:   安装JDK, 配置环境变量:  PATH:找编译运行的工具等:jdk跟目录下的bin目录  JAVA_HOME:设置jdk根目录   PATH: %JAVA_HOME%\

JAVA学习篇--Java类加载

由来: 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序(解释性语言).当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Javaclass加载到JVM里头运行,负责加载Javaclass的这部分就ClassLoader.中文叫做类加载器. 类加载器就好比一个代理,你需要什么,我通过类加载器将你需要的内容返回给你! 类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 解释: 类加载器也是Java类,因为其他是java类的

好程序员Java学习路线Java bean是个什么概念

好程序员Java学习路线Java bean是个什么概念,Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循一定编程原则的Java类都可以被称作JavaBean.一. Java Bean技术概述??????? Java Bean是基于Java的组件模型,由属性.方法和事件3部分组成.在该模型中,JavaBean可以被修改或

JAVA学习篇--JAVA的两种编程模式对比

在Drp项目中,讲解了两种编程模式Model 1和Model2,下面是对这两种模式的简单理解,以及由于Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对比学习一下. Model1 所谓Model1就是JSP大行其道的时代,在Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应.用少量的JavaBean来处理数据库连接.数据库访问等操作. 代码示例:修改用户信息 主页面的js跳转: function

java学习路线-Java技术人员之路从0基础到高级

满满的  全是干货 java基础: 尚学堂 马士兵   个人推荐 历经5年锤练--史上最适合刚開始学习的人入门的Java基础视频   很具体   适合 时间多的看 传智播客java基础班 马士兵线程 马士兵反射 毕向东java基础 尚硅谷java基础文档 java0基础: 甲骨论Oracle  专业 mysql视频 传智播客java web  据说是史上最全面的 30天掌握java web视频 个人推荐  可惜 后面 十几天的 没有 尚硅谷 javaWeb文档 尚硅谷js&jquery,ajax