JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?相关的知识,希望对你有一定的参考价值。
private,public,protected,默认不写(firendly)1、Class类的访问权限:
public:可以供所有的类访问。
默认:默认可以称为friendly但是,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++。默认的访问权限是包级访问权限。
即如果写了一个类没有写访问权限修饰符,那么就是默认的访问权限,同一个包下的类都可以访问到,即使可以实例化该类
(当然如果这个类不具有实例化的能力除外,比如该类没有提供public的构造函数)。
说明:
1、每个编译单元(类文件)都仅能有一个public class
2、public class的名称(包含大小写)必须和其类文件同名。
3、一个类文件(*.java)中可以不存在public class。
这种形式的存在的场景:如果我们在某个包内撰写一个class,仅仅是为了配合同包内的其他类工作,而且
我们不想再为了撰写说明文档给客户(不一定是现实意义的客户,可能是调用这个类的类)看而伤脑筋,而且有可能过一段时间之后
有可能会彻底改变原有的做法,并完全舍弃旧版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的static的成员(属性和方法)可以办到。
2、类成员变量的访问权限:
public:紧接public的属性任何类都可以访问到。可以直接使用ClassName.propertyName。但是从类的封装性上来考虑将一个类的属性定义成public一般很少使用,
在定义静态常量的时候通畅会这样定义。如:public static final int PAGE_SIZE=10;
private:只有类本身内部的方法可以访问类的private属性,当然内部类也可以访问其外部类的private成员的。(属性和方法)
默认(friendly):包级可见,同一个包内的类可以访问到这个属性,可以直接使用className.propertyName来访问,但是从类的封装性特性来说很少这样使用类的属性的。
protected:关键字所处理的是所谓“继承”的观念。对于同一包的其他类,protected=默认,对于不同包的类,如果存在继承关系,而baseClass存在protected属性,则可以被其自继承,而不同包的其他类
则不能访问类的protected属性。
3、类的成员方法的访问权限:
其从语法角度来讲,这些访问权限控制符作用于类的方法和作用于类的属性上的效果是一样的。
public:所有类可见。
pirvate:只有同一类内部的方法可见,在有就是内部类也可以访问到。
默认(friendly):包内可见。
protected:继承可见。
4、访问权限存在的理由
1、“让使用者无法碰触到他们不该碰触的东西。”这些东西仅供类的内部机制使用。将某些成员声明成private,对于使用者来说可以说是一种服务,
因为这样使用者可以知道哪些是他关注的哪些是不重要的,不需要关注,如此历来对于使用来说降低了对使用对象认识的难度。
2、(最终要的理由)让程序设计者可以更动class内部运作方式,而无须担心波及到客户端程序。
5、java的“访问权限修饰符”赋予classes开发者极具有价值的控制能力。身为classes开发者,如果你的任何改变可以完全不干扰你的使用者,
你便可以安心改变你的底层实现,因为客户端程序员无法访问class的这一部分。
通过今天学习访问权限的问题了解到,接口或者抽象等等策略所谓的“实现隐藏”其根本原因并不是说为了隐藏实现的代码和思路,而是降低使用者的使用难度,以及从维护角度来说可见范围的控制给程序维护带来了极大的安全性。
参考资料:http://snowcat.javaeye.com/blog/304933
参考技术A private,public,protected,firendly至于各自特点学编程的都知道,如果你不是学编程的话就没必要知道baidu,google到处都是,如果你是学编程的建议自己用不同的修饰符写几个变量用用自然知道了!
Java关键字 修饰符privateprotectedpublic和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所修饰的,不支持在子孙类下调用的,其他两种是支持在子孙类下调用的。
1 package com.yuanfy.test.scope2; 2 import com.yuanfy.test.scope1.Person; 3 /** 4 * @Description: 在子孙类下测试 四种作用域 5 * @author yuanfy 6 * @date 2017年12月8日 下午5:24:30 7 */ 8 public class BlackPerson extends Person{ 9 10 public BlackPerson(String name, int age) { 11 super(name, age, "black"); 12 } 13 public static void main(String[] args) { 14 BlackPerson person = new BlackPerson("James", 32); 15 16 System.out.println("name:" + person.name);//private 编译报错,所以private修饰的 是不能在不同包下的子孙类访问 17 System.out.println("age:" + person.age);// default 编译报错,所以default修饰的 是不能在不同包下的子孙类访问 18 System.out.println("color:" + person.color);//protected 19 person.say();//public 20 } 21 }
测试3:不同包下面测试 四种作用域,从下面测试案例中可以看到只有public才支持不同包下的其他类(子孙类除外)调用,其他三种都不支持。
1 package com.yuanfy.test.scope2; 2 3 import com.yuanfy.test.scope1.Person; 4 5 /** 6 * @Description: 不同包下面测试 四种作用域 7 * @author yuanfy 8 * @date 2017年12月8日 下午5:11:12 9 */ 10 public class PersonTest2 { 11 public static void main(String[] args) { 12 Person person = new Person("James", 32, "red"); 13 14 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修饰的 是不能在其他包下访问的。 17 person.say();//public 18 } 19 }
所以经过上面案例分析可以得出他们分别对应有效的作用域,如下表:
作用域 | 当前类 | 同一包内 | 子孙类(不同包) | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
以上是关于JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?的主要内容,如果未能解决你的问题,请参考以下文章
Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)