Java关键字(一) 修饰符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所修饰的,不支持在子孙类下调用的,其他两种是支持在子孙类下调用的。

 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 × × ×
时间: 2024-10-07 06:19:11

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

访问修饰符private/protected/默认(friendly)protected 方法重写,重载

访问修饰符 本类 同包 子类 其他 private True   False False    False 默认(friendly) True   True False  False protected True True  True  False public True  True  True  True 重载:方法名相同,参数列表(参数数据类型.个数等)不同 重写:有继承才有重写,子类重写方法,方法名.返回值.参数列表相同,访问修饰符不能呢比父类更严格 package com.jredu.c

Java 访问权限修饰符以及protected修饰符的理解

2017-11-04 22:28:39 访问权限修饰符的权限 访问修饰符protected的权限理解 在Core Java中有这样一段话"在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone().子类只能直接调用受保护的clone方法克隆它自己.为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象".但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说

Java中的private protected public和default的区别

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

Java 访问权限修饰符 与 非访问权限修饰符

分类 Java语言提供了很多修饰符,大概分为两类: 1. 访问权限修饰符 2. 非访问权限修饰符 访问权限修饰符 public:共有访问.对所有的类都可见. protected:保护型访问.对同一个包可见,对不同的包的子类可见. default:默认访问权限.只对同一个包可见,注意对不同的包的子类不可见. private:私有访问.只对同一个类可见,其余都不见. 非访问权限修饰符 static 修饰符,用来创建类方法和类变量. final 修饰符,用来修饰类.方法和变量,final 修饰的类不能

java类中修饰符public,protected等访问权限总结

public   protected  ……   private       类    +          +         +       +       包    +          +         +      继承   +         +      其他   + java类中修饰符public,protected等访问权限总结

Java中访问修饰符public、private、protecte、default

Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅可以跨类访问,而且允许跨包(package)访问.private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”.被其修饰的类.属性以 及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问.protect: 介于public 和 private 之间的一种访问修饰符,一

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

前言:如果提到protected的访问控制级别,您的第一反应是"只能是子类才可以访问",那么您很可能需要往下看. 首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:   private default protected public 同一个类中 √ √ √ √ 同一个包中   √ √ √ 子类中     √ √ 全局范围内       √ 在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能

Java中各种修饰符与访问修饰符

Java中各种修饰符与访问修饰符 类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被所有类访问(使用) public类必须定义在和类名相同的同名文件中 package 可以被同一个包中的类访问(使用) 默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 修饰符 名称 说明 备注 final 使用此修饰符的类不能够被继承 abstrac

java学习笔记(三)java中的修饰符abstract、static与final

一.四种访问级别的访问范围 访问级别 访问修饰符 同类 同包 子类 不同的包 公开 public 受保护 protected 默认 没有访问修饰符 私有的 private 二.使用abstract修饰符需要遵守的语法规则 1.抽象类中可以没有抽象方法,但是包含抽象方法的类必须定义为抽象类,即用abstract修饰: 2.抽象类跟抽象方法不能被final修饰符修饰: 3.抽象类中可以有非抽象方法,因为继承抽象类的子类必须重写父类中所有的抽象方法,因此抽象类中不能有抽象构造方法和抽象静态方法: 4.