再学Java 之 private、protected、public和default的作用域

前言:如果提到protected的访问控制级别,您的第一反应是”只能是子类才可以访问“,那么您很可能需要往下看。

首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:
































  private default protected public
同一个类中
同一个包中  
子类中    
全局范围内      

在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能在子类中才能访问,其他情况下不行;事实上,正确的表述方式应该是”如果在同一个包,则protected修饰的成员都可以被访问到;假如不在同个包,则只有子类才能访问到“。

下面写一个实例(也可以到这里 下载):

(1)首先是程序的结构,这里,有两个包,分别有com.harvin包含parent和child类;com.other包含other_child类

(2)com.harvin.Parent类的代码:


package com.harvin;
/*
* @author harvin
*/
public class Parent {

public static void main(String[] args){

}

private void private_method() { }
protected void protected_method() { }
void default_method(){ }
public void public_method(){ }

}

(3)com.harvin.child类代码:


package com.harvin;

public class Child{
private void private_method() {
//这里会报错。因为private修饰的成员,其他类均不可访问
new Parent().private_method();
}
protected void protected_method() {
//同一个包内,不过是不是子类,都可以访问到protected成员
new Parent().protected_method();
}
void default_method(){
//同一个包内,也可以访问
new Parent().default_method();
}
public void public_method(){
new Parent().public_method();
}
}

(4)com.other.other_child类的代码:


package com.other;
import com.harvin.*;

public class Other_child extends Parent{
private void private_method() {
//这里会报错。因为private修饰的成员,其他类均不可访问
super.private_method();
}
protected void protected_method() {
//这里会报错。不在同一个包内,但是是parent的子类,所以可以访问
super.protected_method();
}
void default_method(){
//这里会报错。不在同一个包内,不可以访问
super.default_method();
}
public void public_method(){
super.public_method();
}
}

再学Java 之 private、protected、public和default的作用域,布布扣,bubuko.com

时间: 2024-10-10 12:45:58

再学Java 之 private、protected、public和default的作用域的相关文章

Java中的private protected public和default的区别

转至:http://blog.sina.com.cn/s/blog_74c571240101jaf5.html    类内部  本包  子类 外部包  public    √  √  √  √ protected   √  √  √  × default    √  √  ×  ×  private   √  ×  ×  ×  

再学Java 之 Integer 包装类缓存

前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static void main(String[] args){ Integer i1 = new Integer(1); Integer i2 = new Integer(1); System.out.println(i1 == i2); Integer i3 = 1; Integer i4 = 1; System.

java之j2se:再学java对象容器

今天是开学第一天,按照上学期的讲课进度,本该是可以开始学习多线程了,但是由于换了老师,可能交接方面有点出入,又给我们讲授了一遍java对象容器,所以这也是为什么题目为"再学". 本文目录: 集合的主要用途 单值类集合:List类与Set类 键值对类集合:Map类 集合的主要用途:集合主要在查询数据返回的时候常用.比如要使用jsp做一个学生信息管理系统,需要从数据库中返回查询学生的结果,把这些结果放入一个集合里,再通过方法返回,在显示层(view)可以使用jsp标签来把他们显示出来. 单

再学Java 之 foreach循环

从Java 5 之后,Java提供了一种新的循环:foreach循环,这种循环遍历数组和集合更加简洁. foreach循环语法格式如下: for ( type variableName : array | collection){ //variableName自动迭代访问每个元素 } 在很多书籍中,都能找到这么一句话"使用foreach循环迭代数组元素时,并不能改变数组元素".如: String books = {"a","b","c&

对private protected public的详解:

1 #include <iostream> 2 #include <stack> 3 #include <queue> 4 #include <exception> 5 #include <sstream> 6 #include <string> 7 #include <vector> 8 #include<list> 9 #include<cassert> 10 #include<cstdl

再学Java 之 形参个数可变函数

自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]

再学Java 之 interface的成员变量

前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然后让其他类通过类名访问他.在这里,想使用之前实训项目的第一版应用层协议的设计想法,即使用一个接口类来定义所有子类都会使用到的变量.然后,就引出了一个interface成员变量和static final的问题. (一)一个简单的问题 首先,看一段代码: 1 //Variable.java 2 publ

Java关键字(一) 修饰符private、protected、public和default的作用域

我们经常用着四种修饰符去修饰变量.方法和类,但是这四种的作用域都一样吗? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具体的作用域是哪些范围.先对其四种进行说明再通过案例进行证明: public:具有最大访问权限. 可以被同一项目下的任何类所调用,一般用于对外的情况. protected:与public不同的是不同包下的类是不能使用的,但是其子孙类除外.所以我认为这是特意为子类设计的. default:它是针对本包设计的,它所修饰的在本

2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class TemplateThread { //如果这个方法不想被子类或者别人随意改动[这样子类就不能覆写该方法了],这里方法就要设置为final方法 public final void println(String message){ System.out.println("###################