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

现在总结如下:

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

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. [转]ASP.NET Web API对OData的支持

    http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html 在SOA的世界中,最重要的一个概念就是契约(contract).在云计算的 ...

  2. leetcode-8-String to Integer (atoi) (已总结)

    8. String to Integer (atoi) Total Accepted: 93917 Total Submissions: 699588 Difficulty: Easy Impleme ...

  3. DI延伸

    延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属 ...

  4. 从极速飞艇源码 VantComponent 谈 小程序维护

    在开发极速飞艇源码详情咨询Q166848365小程序的时候,我们总是期望用以往的技术规范和语法特点来书写当前的小程序,所以才会有各色的小程序框架,例如 mpvue.taro 等这些编译型框架.当然这些 ...

  5. wp8.1 SQLite的基本使用

    SQLite是一个轻量级的关系型数据库,正是由于其精悍小巧,在移动端平台被广泛应用,但不适合处理大量数据和批量操作.它的底层是由C语言编写,最初设计是为了应用于嵌入式,占用资源非常低且简单易用,而且绝 ...

  6. MVC控制器中动作方法返回的结果

    在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如“这是我做的一个MVC”. 2.File(): 返回文件类型的内容FileResul ...

  7. NOIP2018滚粗祭(周记更新至11.25)

      还好吧, 好像回归之后 还是有时间去机房转一转的 一个特别生动的例子就是 体育会考就去机房呆了一上午. 这里又要吐槽一下信息技术会考 stm我拿到的第一道题就是 https://www.luogu ...

  8. BZOJ 1150--数据备份(链表&堆&贪心)

    1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2572  Solved: 1038[Submit ...

  9. docker设置引用国内镜像加速

    设置步骤: 1 先到daocloud.io网站注册一个账号 过程略,注册成功后,进入控制台 2 点击控制台上的加速器 拉到中间部分,有一个『主机监控程序』的文字链接,见下图: 然后选择主机类型,我用的 ...

  10. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...