public、private、default、protected总结

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一休日记

csdn打赏扣费20点,这

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值