how2j.cn


工具版本兼容问题
成员变量有四种修饰符
private 私有的
package/friendly/default 不写
protected 受保护的
public 公共的

比如public 表示公共的
public String name;

而maxHP 没有修饰符即代表package/friendly/default
float maxHP

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



18分51秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



示例 1 : 类之间的关系   
示例 2 : private 私有的   
示例 3 : package/friendly/default 不写   
示例 4 : protected 受保护的   
示例 5 : public 公共的   
示例 6 : 总结   
示例 7 : 那么什么情况该用什么修饰符呢?   

示例 1 :

类之间的关系

类和类之间的关系有如下几种:
以Hero为例
自身:指的是Hero自己
同包子类:ADHero这个类是Hero的子类,并且和Hero处于同一个包下
不同包子类:Support这个类是Hero的子类,但是在另一个包下
同包类: GiantDragon 这个类和Hero是同一个包,但是彼此没有继承关系
其他类:Item这个类,在不同包,也没有继承关系的类
类之间的关系
示例 2 :

private 私有的

使用private修饰属性
自身:是可以访问的
同包子类:不能继承
不同包子类:不能继承
同包类:不能访问
其他包类:不能访问
private 私有的
package charactor; import property.Weapon; public class Hero { //属性id是private的,只有Hero自己可以访问 //子类不能继承 //其他类也不能访问 private int id; String name; float hp; float armor; int moveSpeed; public void equip(Weapon w) { } }
示例 3 :

package/friendly/default 不写

没有修饰符即代表package/friendly/default
float maxHP; 血量上限
package/friendly/default 不写
package charactor; import property.Weapon; public class Hero { private int id; String name; // 无修饰符的属性 hp // 自己可以访问 // 同包子类可以继承 // 不同包子类不能继承 // 同包类可以访问 // 不同包类不能访问 float hp; float armor; int moveSpeed; public void equip(Weapon w) { } }
示例 4 :

protected 受保护的

受保护的修饰符
protected float hp; 血量
protected 受保护的
package charactor; import property.Weapon; public class Hero { private int id; String name; // protected饰符的属性 hp // 自己可以访问 // 同包子类可以继承 // 不同包子类可以继承 // 同包类可以访问 // 不同包类不能访问 protected float hp; float armor; int moveSpeed; public void equip(Weapon w) { } }
示例 5 :

public 公共的

公共的修饰符
public String name; 姓名
任何地方,都可以访问
public 公共的
package charactor; import property.Weapon; public class Hero { private int id; // public的属性 name // 自己可以访问 // 同包子类可以继承 // 不同包子类可以继承 // 同包类可以访问 // 不同包类可以访问 public String name; protected float hp; float armor; int moveSpeed; public void equip(Weapon w) { } }
示例 6 :

总结

总结
示例 7 :

那么什么情况该用什么修饰符呢?

那么什么情况该用什么修饰符呢?
从作用域来看,public能够使用所有的情况。 但是大家在工作的时候,又不会真正全部都使用public,那么到底什么情况该用什么修饰符呢?

1. 属性通常使用private封装起来
2. 方法一般使用public用于被调用
3. 会被子类继承的方法,通常使用protected
4. package用的不多,一般新手会用package,因为还不知道有修饰符这个东西

再就是作用范围最小原则
简单说,能用private就用private,不行就放大一级,用package,再不行就用protected,最后用public。 这样就能把数据尽量的封装起来,没有必要露出来的,就不用露出来


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-03-29 package、protected修饰的属性在非同包子类中不能访问
rebortyang



看的头晕,咨询一下我的想法是否钻牛角尖了。 在例子中的辅助类(非同包子类)里面,main方法里面不能通过new Hero().xxx 访问package、protected修饰的属性。

							

							


3 个答案

暄染 答案时间:2018-04-20
package(default)是同一个包下可以调用,support类和hero类不同包,不能调用。 support类继承hero类,所以可以调用protected修饰的属性

有梦想的小白 答案时间:2018-04-06
上边讲了在不同包其他类中不能访问,把实例化Hero改成Support就可以了

有梦想的小白 答案时间:2018-04-06
当用protected修饰属性的时候,不同包的子类可继承得到这个属性,继承就是子类实例化后可以获取父类的属性,而你依然用父类Hero实例化自然不能访问得到,上边讲了在不同包子类中不能访问




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2017-12-27 继承和访问的区别是什么,属性可以继承不能访问时什么意思?
srz
意思是只有属性应用是叫做继承,其他的都叫做访问吗




4 个答案

123456SHY 答案时间:2018-04-30
继承就是子类里是否有父类的那个属性。 访问就是如果在其它地方实例化一个对象,那么这个对象是否能访问那个属性。 所以这两个根本没有毛线关系。要分开讨论

暄染 答案时间:2018-04-20
package(default)是同一个包下可以调用,support类和hero类不同包,不能调用。 support类继承hero类,所以可以调用protected修饰的属性

xwlsgdsg 答案时间:2018-03-18
如果不是子类,那么想要访问属性必须得有该类的实体,如果是子类,那么属性是直接继承来的。

AKZ 答案时间:2018-03-11
如果类跟类是父类和子类的关系的话,这层关系就是继承,没有关系的叫访问




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-09-14 关于private field的一点疑惑
2017-08-03 示例4:protected代码的注释有问题
2016-12-29 不同包的子类继承了另一包的Hero类,可以继承protected修饰的属性name,但为什么却不能使用Hero h=new Hero(),然后使用h.name 呢,提示一定要用public修饰
2016-04-22 protected属性被同包子类继承之后的访问权限




提问之前请登陆
关于 JAVA 基础-类和对象-访问修饰符 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图