本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
18分51秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 示例 1 : 类之间的关系 示例 2 : private 私有的 示例 3 : package/friendly/default 不写 示例 4 : protected 受保护的 示例 5 : public 公共的 示例 6 : 总结 示例 7 : 那么什么情况该用什么修饰符呢?
类和类之间的关系有如下几种:
以Hero为例 自身:指的是Hero自己 同包子类:ADHero这个类是Hero的子类,并且和Hero处于同一个包下 不同包子类:Support这个类是Hero的子类,但是在另一个包下 同包类: GiantDragon 这个类和Hero是同一个包,但是彼此没有继承关系 其他类:Item这个类,在不同包,也没有继承关系的类
使用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) {
}
}
没有修饰符即代表package/friendly/default
float maxHP; 血量上限 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) {
}
}
受保护的修饰符
protected float hp; 血量 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) {
}
}
公共的修饰符
public String name; 姓名 任何地方,都可以访问 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) {
}
}
那么什么情况该用什么修饰符呢?
从作用域来看,public能够使用所有的情况。 但是大家在工作的时候,又不会真正全部都使用public,那么到底什么情况该用什么修饰符呢? 1. 属性通常使用private封装起来 2. 方法一般使用public用于被调用 3. 会被子类继承的方法,通常使用protected 4. package用的不多,一般新手会用package,因为还不知道有修饰符这个东西 再就是作用范围最小原则 简单说,能用private就用private,不行就放大一级,用package,再不行就用protected,最后用public。 这样就能把数据尽量的封装起来,没有必要露出来的,就不用露出来了
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2021-06-18
static protected访问问题?
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-12-27
明明我用的继承,但是使用protected,不知道为什么不行
8 个答案
加长版海贼 跳转到问题位置 答案时间:2023-08-09 通过heros[i]调用的name这个属性仍然属于Hero类的对象,并不是继承给support类的name,其他包类不能访问Hero类的protected属性name。(复制前面的,为了mark)
song1005 跳转到问题位置 答案时间:2021-11-19 因为不同包的子类,只能继承属性,不能调用属性
灯火葳蕤 跳转到问题位置 答案时间:2021-09-30 因为你定义的继承的并不是你定义的 name,而是整个Hero,先引用了Hero,再去调用其中的name
qingkongyuluo 跳转到问题位置 答案时间:2021-03-17 使用protected String name;的话Hero h1,h2;在其他包中的类定义是没有访问权限的,有访问权限的是继承Hero的子类Support
懒懒的喵喵咪 跳转到问题位置 答案时间:2021-01-26 子类的实例化对象或者父类的实例化对象好像都是不能访问父类的protected对象的
若风1 跳转到问题位置 答案时间:2021-01-25 上边写了protected ,不同包下是可以继承的,但不能访问。 所以你是没法在本包中去访问Hero中的name的。
Mordekaiser 跳转到问题位置 答案时间:2021-01-15 通过heros[i]调用的name这个属性仍然属于Hero类的对象,并不是继承给support类的name,其他包类不能访问Hero类的protected属性name。
我灰灰凭啥输 跳转到问题位置 答案时间:2020-12-31 我也遇到一样的问题,在网上找到一篇帖子https://bbs.csdn.net/topics/390821994,看的迷迷糊糊的
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-05-30
有关属性的访问修饰符在类,方法,属性之间可以通用?
2020-05-03
private是说对任何其他类都不可见,而不是不能继承吧?
2020-02-16
Spider和Cat类使用super调用父类构造方法报错
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 17 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|