public、private、default、protected总结

来源:互联网 发布:程序员 博客 编辑:程序博客网 时间:2024/05/22 02:05

public > protected > default > private
以前感觉自己也是知其然不知其所以然,就傻傻的背别人说的,但是不知道其中真正意义,看了视频才知道。(不敢说别人是不是这样,反正本菜鸟就是这样)
文字看不懂的建议看 视频课程:Java4Android——课时25-27(包和访问权限)
平常总是百度看public、private、default、protected差别,但是看别人文字总是没有深刻理解其中的含义。个人觉得看了Java4Android的视频教程,才深刻理解了这几个权限的差别。
1、4个权限是跟包相关的(所以必须先了解包package org.marsdroid)-建议看视频,文字描述实在太难
2、【default】String name;当没有任何权限描述是,默认是default,两个类在同一个包,可以随意调用。不在同一个包下,跨包不可以访问,那就不行了。
比如下面:(Person类在包com.marsdroid之外就无法被调用,只有跟Person在同一包下的类才可以使用)

package com.marsdroid;class Person{}

3、【public】不管在哪个包,随意调用
4、【private】仅仅在本类下面调用,就算该类被别的类继承extends了,也无法使用private权限的变量和函数
5、【protected】主要跟继承有关系。
(1)和default区别:
首先拥有和default一样的功能(同一包路径下com.xxx.xxx,不用extends也能用protected修饰的方法),但是该权限只能修饰成员变量和成员函数。允许跨包继承使用,(default不行,只能在本包下继承使用)。
(2)和public区别:
public String name;中的name随便用,不用继承也可以使用。
protected String name;中的name,只有继承了该变量所在类后,才可以使用。
比如:

public class Person{    public String name;    protected int age;}

1、在其他类中直接Person p = new Person();就可以用变量name,但是不能用age,
2、想用age的情况,必须是Person的子类,class Student extends Person{} Student才能用,允许跨包使用。

个人觉得Java4Android讲师,是非常棒的,不仅仅只是讲解枯燥的概念。(用一个不懂的概念,去帮你解释另一个概念,纯属扯淡)
老师用例子和实例讲解,真是棒级了,这种授课方式让人恍然大悟。极力推荐免费视频课程《Java4Android》

2016.12.12再总结一下protected权限修饰符

概述:
学习模板方法模式Template Method Pattern,让我真正明白了protected和final的作用。

抽象类:

public abstract class SuberAbstract {    public abstract void publicRun();    protected abstract void protectedRun();    final public void run(){        this.publicRun();        this.protectedRun();    }}

继承抽象类的子类(模板):

public class Man extends SuberAbstract {    @Override    public void publicRun() {        System.out.println("Man_publicRun");    }    @Override    protected void protectedRun() {        System.out.println("Man_protectedRun");    }}

final

在写子类Man的时候,明白了final的意思(平时大家也知道是不能修改了,我一般觉得是一个值不能变而已),在这里就是模板Man也不能重写run()方法了,不能改变他了,根本没有代码其实。如果没有final,我们还是可以更改这个方法的,有代码提示敲出来这个方法。

客户要用我们的模板**Man的时候,只让他用那个final修饰的模板方法**run(被final修饰后不能更改的即使模板方法),其他的方法用protected修饰了就不能用了。(但是我们也知道protected是有default的属性的,但是客户类是没有和我们的抽象类SuperAbstract类和模板Man在一个包路径里面的,如果Company和SuperAbstract或Man任意一个在同一包的话,还是想办法可以用protected方法的(注意想办法意思:跟哪个在一起,就用哪个做引用才可以,跟SupAbstract在一起,new Man的时候要向上转型;跟Man在一个包,new Man就不要转型了。不过这种情况不常见。)),一般我们的客户类不可能和SuperAbstract抽象类在一个包路径里面,所以我们的客户类不能用protected修饰的方法。

public class Company {    public static void main(String[] args) {        SuberAbstract sa = new Man();        sa.run();        sa.publicRun();        ~~sa.protectedRun();//此处其实是报错的,为了方便演示写出来~~    }}

protected

个人感觉如果没有Template Method Pattern,虽然感觉按照概念吧,我也懂protected,知道在一个包,大家可以用,不在一个包,继承了后还是可以用可以复写。但是对不能复写的情况,不太清楚,现在真正理解了protected修饰的方法,不能用的地方的情况(Company和SuperAbstract、Man都不在同一个包,这时候,我们在Company里面new Man的时候,我们是不可以用protected修饰的方法的。)

基本概念还是要弄清楚

0 0
原创粉丝点击