以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚.

现在总结如下:

一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限

Java访问权限修饰符包含四个:public,protected,friendly,private但是friendly在java中并没有显示的声明,成员变量和方法默认情况下就是friendly权限。

现在把它们的访问权限表示出来:(目前展示访问修饰符的方式主要有两种)

表示图一:(第一种展示方式,把不同的类文件分为两个变量,"是否是相同包","是否是子类".这样总共2*2=4种情况再加上本类的访问,总共5种情况都考虑进入了.我比较赞成这种分类的方式.简单明了,容易理解.)

表示图二:(这种展示方式也不错.这种展示方式多了一层,同一个类中的访问条件,但是同包中的子类和非子类统一了,Java的各个访问修饰符在同包子类和非子类的访问效果上是一样的,可以合并)

访问修饰符

同一个类

同包

不同包,子类

不同包,非子类

private

默认  

protected

public

二.首先,说明public的权限问题

定义4个类Person、People、Student、Computer,分别比较本类、同包、子类、其他包的区别。

这里要注意:当重写父类成员函数时,子类的成员函数不能比父类的成员函数权限小,一般重写把权限定义相同即可。

代码如图所示:

1.public 同类访问

 

 2.public 同包不同类访问(非子类)

3.public 同包不同类访问(子类)

4.public 不同包下的非子类访问:

5.public 不同包下的子类访问:

以上关于成员变量name都没有编译错误,说明public类型在这五种情况下都是没有问题的.

三.再说protected 权限的问题.

附录Person.java 截图

四.default(frienddly)权限问题.

同样定义4个类Person、People、Student、Computer,分别比较本类、同包、子类、其他包的区别。

这里要注意:default(不写默认指定default)同public一样可以修饰任何类而且类名要与文件名相同。

其他几个类的代码和public测试中的一样.

这里只附录其中一个出错Student中的代码和错误.

Person、People,Teacher类能编译通过,就说明用default修饰的类在本类、同包中互相访问都是可以的,而Student、Computer编译不通过说明default不可以在包外,不管有没有继承关系的类都不可以互相访问。

五:最后测试private权限问题

private意思是私有的,如果Person能编译通过而People、Student、Teacher,Computer编译不通过,就说明用private修饰的类只能在本类中访问。测试结果如下:

综上所述,java中4种修饰符访问权限的区别及详解全过程就此演示完了,再一次说明java语言的严谨性和安全性,我们在以后使用这4中修饰符时创建一个类,这个类的权限尽量要小,这样才能减少漏洞和提高安全性,从而体现java面向对象的封装性。

最后如图再回忆一下java中4个修饰符的访问权限:

===========================================================

补充:

一.访问权限修饰符修饰类名:

1,不能用protected和private修饰类。(上图可以看到修饰类名的修饰符只有 public abstract 和final可以.)
2,用friendly修饰的类叫友好类,在另外一个类中使用友好类创建对象时,要保证它们在同一包中。(上面可以看出用default修饰的在包外都是无法访问的.)

二.访问权限修饰符与继承

这里的访问修饰符指的是修饰成员变量和方法。可以分为两种情况:

1,子类与父类在同一包中

此时只有声明为private的变量与方法不能被继承(访问)。

     class Father
{
private int money ;
int weight=; }
class Son extends Father
{
viod f()
{
money=;// 非法
weight=; // 合法
}
}

2,子类与父类不在同一包中

此时private与friendly均不能被继承(访问), protected与public可以。

Father.java

      package com.aaa;
public class Father
{
int height ;
protected int money=120;
public int weight;
protected int getMoney()
{
return money;
}
void setMoney(int newMoney)
{
money=newMoney;
}
}

Son.java

      package com.bbb;
import com.aaa.Father;
public class Son extends Father
{
void f()
{
money=10000;//合法
//height=170;//非法,height为friendly修饰的变量
System.out.println(money);//输出结果是10000
//setMoney(300); //非法
int number=getMoney(); //合法
System.out.println(number);//输出结果是10000
}
public static void main(String args[])
{
Son sss=new Son();
sss.f();
}
}

所以,访问权限修饰符权限从高到低排列是public  ,protected  ,friendly, private。

上面这个继承的问题实际还是访问修饰符的权限问题.

1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。

2、protected:protected对于子女、兄弟来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。


3、default(friendly):java的默认访问权限,这种权限通常被称为包访问权限,default对于兄弟来说,就是public的,在包之外,这些成员就变成private。

4、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。其他类想访问可以通过该类的成员方法访问如get/set

关于Java的权限修饰符(public,private,protected,默认friendly)的更多相关文章

  1. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  2. Java中权限修饰符public、private、protected和default的区别

    1.public 可以修饰类.成员变量和成员函数,没有任何限制,同一个包中,或者不同包中的类都可以自由访问 2.private 可以修饰成员变量和成员函数,只能在本类中使用 3.default (不写 ...

  3. 【java基础】(1)Java的权限修饰符(public,protected,default,private)

    访问权限修饰符权限从高到低排列是public  ,protected  ,default, private. 一.根据“是否是同包”.“是否是子类”分为4中情况+本类 5种情况 二.把 同包中的子类 ...

  4. 访问修饰符(public,private,protected,internal,sealed,abstract)

    为了控件C#中的对象的访问权限,定义对象时可以在前面添加修饰符. 修饰符有五种:private(私有的),protected(受保护的),internal(程序集内部的),public(公开的),以及 ...

  5. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  6. C#访问修饰符(public,private,protected,internal,sealed,abstract)

    为了控件C#中的对象的访问权限,定义对象时可以在前面添加修饰符. 修饰符有五种:private(私有的),protected(受保护的),internal(程序集内部的),public(公开的),以及 ...

  7. 2018/03/10 每日一学PHP 之 修饰符 public/private/protected

    对于面向对象 修饰符的使用是我们最常用,也是很容易忽略的小细节. 对于编程来说,把握好每一个小细节,就能构造出漂亮,优雅的程序. public 使用最多的修饰符,公共方法,允许所有访问,就像一个公交车 ...

  8. 访问修饰符 public,private,protected,以及不写(默认) 时的区别?

    修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protecte d √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为 ...

  9. 访问修饰符public,private,protected,以及不写(默认)时的区别?

    private: 1.在当前类开发中,main方法之外可以直接借助名字使用,当前类的main方法中可以使用对象打点的方式直接使用成员. 2.在当前类之外,使用对象(或是类名,针对静态的)打点调用都是被 ...

随机推荐

  1. FPGA时序约束和timequest timing analyzer

    FPGA时序约束 时钟约束 #************************************************************** # Create Clock #****** ...

  2. .NET基础 (08)字符串处理

    字符串处理1 System.String是值类型还是引用类型2 StringBuilder类型有何作用3 如何在String和Byte[]对象之间进行转换4 简述BASE64编码的作用以及C#中对其的 ...

  3. (深搜)棋盘问题 -- poj -- 1321

    链接: http://poj.org/problem?id=1321 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2889 ...

  4. Rhino 使 JavaScript 应用程序更灵动(转载)

    脚本语言有良好的快速开发,高效率的执行,解释而非编译执行等优点,并且具有与其他语言编写的组件之间强大的通信功能.JavaScript 一直是脚本语言中的领头羊,它是一门具有非常丰富特性的语言.除了浏览 ...

  5. Postgresql 日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...

  6. c++中的隐藏及重载、重写与隐藏的区别

    c/c++中的隐藏  举个栗子 class A { public : void fun1(int a, int b) { cout<<"abcd"<<end ...

  7. byte[] 数组和字符串的转换,与byte[] 数组和int类型的之间的转化

    我们先来看看byte bool  int ushort  等的定义 首先时byte[]数组与string之间的转换 string 转换位byte[] 数组 string str = "1-1 ...

  8. B - Bridging signals (LIS)

    点击打开链接 B - Bridging signals 'Oh no, they've done it again', cries the chief designer at the Waferlan ...

  9. 【12c OCP】CUUG OCP认证071考试原题解析(36)

    36.choose the best answer View the Exhibits and examine the structures of the PRODUCTS, SALES, and C ...

  10. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...