Java关键字(一) 修饰符private、protected、public和default的作用域
一、private、protected、public和default的作用域
我们经常用着四种修饰符去修饰变量、方法和类,但是这四种的作用域都一样吗? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具体的作用域是哪些范围。先对其四种进行说明再通过案例进行证明:
public:具有最大访问权限。 可以被同一项目下的任何类所调用,一般用于对外的情况。
protected:与public不同的是不同包下的类是不能使用的,但是其子孙类除外。所以我认为这是特意为子类设计的。
default:它是针对本包设计的,它所修饰的在本包下的其他类都访问。
private:只为类本身提供。是一种封装的体现。
二、案例
案例:先声明一个类,可以供子类继承。
package com.yuanfy.test.scope1;
/**
* @Description: 父类,其中有四种修饰符所修饰的变量和方法
* @author yuanfy
* @date 2017年12月8日 下午5:04:35
*/
public class Person {
private String name;
int age;
protected String color; public Person(){} public Person(String name, int age, String color) {
super();
this.name = name;
this.age = age;
this.color = color;
} public void say(){
System.out.println(this.name + " say: I am " + this.color + " Person");
}
}
测试1:同包下面测试 四种作用域,从中可以看出private不支持在同包下的其他类使用,其他三种是支持在同包下其他类调用的。
package com.yuanfy.test.scope1;
/**
* @Description: 同包下面测试 四种作用域
* @author yuanfy
* @date 2017年12月8日 下午5:11:12
*/
public class PersonTest {
public static void main(String[] args) {
Person person = new Person("James", 32, "red");
System.out.println("name:" + person.name);//编译报错,所以private修饰的 是不能在同包下的其他类访问
System.out.println("age:" + person.age);// default
System.out.println("color:" + person.color);//protected
person.say();//public
}
}
测试2:在子孙类下测试 四种作用域(不同包的情况下,同包相当于测试1),从下面测试代码中可以看出:private和default所修饰的,不支持在子孙类下调用的,其他两种是支持在子孙类下调用的。
package com.yuanfy.test.scope2;
import com.yuanfy.test.scope1.Person;
/**
* @Description: 在子孙类下测试 四种作用域
* @author yuanfy
* @date 2017年12月8日 下午5:24:30
*/
public class BlackPerson extends Person{ public BlackPerson(String name, int age) {
super(name, age, "black");
}
public static void main(String[] args) {
BlackPerson person = new BlackPerson("James", 32); System.out.println("name:" + person.name);//private 编译报错,所以private修饰的 是不能在不同包下的子孙类访问
17 System.out.println("age:" + person.age);// default 编译报错,所以default修饰的 是不能在不同包下的子孙类访问
System.out.println("color:" + person.color);//protected
person.say();//public
}
}
测试3:不同包下面测试 四种作用域,从下面测试案例中可以看到只有public才支持不同包下的其他类(子孙类除外)调用,其他三种都不支持。
package com.yuanfy.test.scope2; import com.yuanfy.test.scope1.Person; /**
* @Description: 不同包下面测试 四种作用域
* @author yuanfy
* @date 2017年12月8日 下午5:11:12
*/
public class PersonTest2 {
public static void main(String[] args) {
Person person = new Person("James", 32, "red"); System.out.println("name:" + person.name);//private 编译报错,所以private修饰的 是不能在其他包下的任何类访问(除了自身)
15 System.out.println("age:" + person.age);// default 编译报错,所以default修饰的 是不能在其他包下访问的。
16 System.out.println("color:" + person.color);//protected 编译报错,所以default修饰的 是不能在其他包下访问的。
person.say();//public
}
}
所以经过上面案例分析可以得出他们分别对应有效的作用域,如下表:
| 作用域 | 当前类 | 同一包内 | 子孙类(不同包) | 其他包 |
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| default | √ | √ | × | × |
| private | √ | × | × | × |
Java关键字(一) 修饰符private、protected、public和default的作用域的更多相关文章
- private,protected,public和default的区别
private,protected,public和default的区别 除了default以外,其他都是Java语言的关键字.default代表的是对类成员没有进行修饰的情况.它本身也代表了一种访问控 ...
- Java 访问权限修饰符以及protected修饰符的理解
2017-11-04 22:28:39 访问权限修饰符的权限 访问修饰符protected的权限理解 在Core Java中有这样一段话“在Object类中,clone方法被声明为protected, ...
- 【Java】abstract,final,static,private,protected,public的区别
[abstract]抽象的 1. abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的类一定是 ...
- Java中的private protected public和default的区别
转至:http://blog.sina.com.cn/s/blog_74c571240101jaf5.html 类内部 本包 子类 外部包 public √ √ √ √ pro ...
- Java中的权限修饰符private、protected、public
java中的修饰符分类: 权限修饰符: private, default, protected, public 状态修饰符: static, final 抽象修饰符: abstract 权限修饰符 我 ...
- 关于Java的权限修饰符(public,private,protected,默认friendly)
以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚. 现在总结如下: 一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限 Java访问权限修饰符包含四个:p ...
- Java中访问修饰符public、private、protecte、default
Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...
- asp.net 修饰符介绍(关于public、private、protected、internal)
1.private修饰符 private修饰符用于设置类或类成员的访问权限仅为所属类的内部,private也被称为私有修饰符.某些时候需要访问私有类成员时,可通过get和set访问器读取或修改. 2. ...
- Java中的 修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符 访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...
随机推荐
- mybatis mysql 批量插入
场景描述: 使用mybatis操作mysql数据库,进行批量插入数据,提高代码质量和执行效率. 环境: mybatis spring mysql java xml配置文件 <insert id ...
- Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...
- 找到python官方标准库文档
python中有很多标准库.我们没法记住全部标准库,但是可以在:https://docs.python.org/3/py-modindex.html 中查看标准库的索引 在python的官方文档中,如 ...
- iOS之创建一个常驻线程
// 当创建一个线程,并且希望它一直存在时,但往往我们创建的线程都是执行完成之后也就停止了,不能再次利用,那么如何创建一个线程可以让他可以再次工作呢,这个时候就需要使用到RunLoop了.下面的是我写 ...
- RxSwift 对 MJRefresh 使用的封装
对于一个很常用的两个库, MJRefresh 如何可以像 UIButton 使用方式呢: btn.rx.tap.subscribe(...) Rxswift 中的很多类似处理的方式都使用了跟下面极为相 ...
- Knight Moves
Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...
- 在ASP.NET Core中使用AOP来简化缓存操作
前言 关于缓存的使用,相信大家都是熟悉的不能再熟悉了,简单来说就是下面一句话. 优先从缓存中取数据,缓存中取不到再去数据库中取,取到了在扔进缓存中去. 然后我们就会看到项目中有类似这样的代码了. pu ...
- c++学习笔记---05--- C++输出输入小结
C++输出输入小结 题目: 这个程序将向用户提出一个"Y/N"问题,然后把用户输入的值赋值给answer变量. 要求: 针对用户输入'Y'或'y'和'N'或'n'进行过滤: 发掘程 ...
- Flex 基础语法(一)
任何一个容器都可以指定为Flex布局. .box{ display: flex; } 行内元素也可以使用Flex布局. .box{ display: inline-flex; } Webkit内核的浏 ...
- indexed database IndexedDB
Indexed Database API 目的是提供一个可供javascript存储和检索对象,并且还能进行查询,搜索等数据库操作 设计为几乎完全异步,因此绝大部分操作都稍后执行,因此每次操作都应 ...