how2j.cn


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

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

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


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



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



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

示例 1 :

类之间的关系

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

private 私有的

edit
使用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 不写

edit
没有修饰符即代表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 受保护的

edit
受保护的修饰符
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) { } }
公共的修饰符
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) { } }
总结
示例 7 :

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

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

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

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


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


问答区域    
2021-06-18 static protected访问问题?
hl-

两个包文件,第一个包下User类,第二个包Hu类,在Hu类中的main方法中通过User.访问静态方法,static protected属性能够被访问




1 个答案

Syk159357666
答案时间:2023-11-28
不能



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-12-27 明明我用的继承,但是使用protected,不知道为什么不行
991015




按理来说,即使是不同包的类,我用了继承后,使用protected应该可以。 但是它却报错,提示“字段不可视” 改成public后正常
加载中
package heross ;      //这是在heross包下的hero
public class Hero {
	protected String name ;
	float hp ;
	float armor ;
	int moveSpeed ;
	
	public void recovery(float hp){
		this.hp += hp ;
	}
}

//这是在另一个包的Support
package charactor1;
import heross.Hero; ;

public class Support extends Hero{


	public void heal(){
		System.out.println(this.name+"对某位英雄进行了治疗");
	}
	public void heal(float hp,Hero ...heros){
		for(int i=0;i<heros.length;i++){
			heros[i].recovery(hp);
			System.out.println(name+"为"+heros[i].name+"进行了治疗,"+heros[i].name+"回血"+hp);
			}
	}
	public static void main(String[] args) {
		Support naima = new Support() ;
		naima.name = "奶妈";
		Hero h1 = new Hero();
		h1.name = "盖伦" ;
		Hero h2 = new Hero() ;
		h2.name = "提莫" ;
		naima.heal();
		naima.heal(20, h1,h2);
	}
}
字段Hero.name不可视。
只能改成public才正常


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 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 基础-类和对象-访问修饰符 的提问

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

上传截图