您的位置:首页 > 编程语言 > Java开发

java学习日志(五)-- 一个可爱的访问控制符实验

2017-03-09 13:35 393 查看
下课前,老师给我们布置了一道作业,大意是这样的:

定义A、B、C、D、E(名称自定)四个类,满足下列条件:

(1)B类与A类同包,不是A类子类。

(2)C类与A类同包,是A类的子类。

(3)D类与A类不同包,是A类的子类。

(4)E类与A类不同包,不是A类子类。

观察当A类方法前的访问控制符分别为public/private/protected/default时,其余类是否能调用该方法。

按照老师这个要求,分别定义Mom(母亲)、Dad(父亲)、Son(儿子)、Daughter(女儿)、SonInLow(女婿)五个类,每个类单独放在一个源文件中,他们的具体定义及之间的关系如下。因为没有必要new对象,所以五个类中属性和方法均用static修饰。

说了这是一个可爱的访问控制符实验,所以下面会有一些可爱的剧情,各位观众,好戏开始。

参演人员介绍:

Mom类(对应题中A类)

类说明:一个贤惠的妻子,一位伟大的母亲。常常会给家里人做吃的(cookDishes),家务活一个人包揽(washClothes),常常很晚才休息(goSleep),一颗心全放在了孩子身上,给孩子营造课了良好的生活环境(home.one)。但最近遇上更年期,有时会因小事跟家人吵架(quarrel)。

package home.one;

public class Mom{
private static String name = "Mom";
public static void main(String[] args){

}
/**
Mom给某人烹饪了一桌好菜
@param name 吃货
*/
public static void cookDishes(String name){
System.out.println("Mom为" + name +"烹饪了一桌好菜");
}
/**
Mom与某人吵架
@param name 吵架对象
*/
protected static void quarrel(String name){
System.out.println("Mom和" + name + "吵架了");
}
/**
Mom为某人洗衣服
@param name 衣服的所有者
*/
static void washClothes(String name){
System.out.println("Mom把" + name + "的衣服洗了");
}
/**
Mom睡觉
*/
private static void goSleep(){
System.out.println("Mom开始睡觉");
}
}

Dad类(对应题中B类)
类说明:Dad和Mom很恩爱,执子之手,与子偕老,他们共同构建了一个美满的家庭(home.one)。

package home.one;

public class Dad{
private static String name = "Dad";
public static void main(String[] args){

}
}

Son类(对应题中C类)
类说明:是妈亲生的(extends Mom),不是马路边捡的,所以长得像妈。因为姐姐嫁人了,加上自己还是单身狗,所以暂时和妈住在一起(home.one)。

package home.one;

public class Son extends Mom{
private static String name = "Son";
public static void main(String[] args){

}
}
Daughter类(对应题中的D类)

类说明:人都说她遗传了妈妈的好基因(extends Mom),人长得美,还顾家。后来遇到了那个他(SonInLow),组建了自己的家庭(home.two)。

package home.two;
import home.one.Mom;

public class Daughter extends Mom{
private static String name = "Daughter";
public static void main(String[] args){

}
}

SonInLow类(对应题中的E类)
类说明:一次偶遇,让他找到了自己的幸福与余生的呵护(Daughter),他发誓要让妻子和孩子过上幸福的生活(home.two),所以每天都很努力的工作。

package home.two;
import home.one.Mom;

public class SonInLaw{
private static String name = "SonInLaw";
public static void main(String[] args){
}
}

剧情一:化妆时间 -- 编译

文本编辑器是EditPlus,配置后可以编译运行带包类,不知道怎么配置,可参考我的另一篇博文EditPlus中实现Java带包的类编译运行(两种方法)

先编译Mom,后编译其余四个类。编译后各个类在文件中的位置如图。






两个家庭home.one与home.two(两个package)



Mom、Dad、Son住在一起(同包)



Daughter和SonInLaw住在一起(与Mom不同包)



剧情二:做饭 -- Mom做的一手好菜,谁有这个口福呢

调用Mom类中方法:cookDishes(String name) --> 方法访问控制修饰符:public

在Mom(母亲)、Dad(父亲)、Son(儿子)、Daughter(女儿)、SonInLow(女婿)五个类的main方法中加入Mom.cookDishes(name)

Mom(本类):



Dad(同包类):



Son(同包子类):



Daughter(不同包子类):



SonInLow(不同包类):



总结:Mom说她手艺很好,所以不管是客人(不同包类)还是家人(同包类,子类),只要饿了,她都会为他们做上一桌好菜。(访问权限为public)

剧情三:吵架 -- 是谁惹怒了Mom

调用Mom类中方法:quarrel(String name) --> 方法访问控制修饰符:protected

在Mom(母亲)、Dad(父亲)、Son(儿子)、Daughter(女儿)、SonInLow(女婿)五个类的main方法中加入Mom.quarrel(name);编译运行。

Mom(本类):



Dad(同包类):



Son(同包子类):



Daughter(不同包子类):



[b]SonInLow(不同包类):[/b]



总结:Mom有时会因为自己不小心而埋怨自己(本类),有时也会因一些小事和家里人(同包类)或儿女(子类)吵架(访问权限为protected),但和SonInLow(不同包类)吵不起来,因为SonInLow就没那个胆。

剧情四:洗衣服 -- Mom会给谁洗衣服

调用Mom类中方法:washClothes(String name) --> 方法访问控制修饰符:default/无

在Mom(母亲)、Dad(父亲)、Son(儿子)、Daughter(女儿)、SonInLow(女婿)五个类的main方法中加入Mom.washClothes(name)

Mom(本类):



Dad(同包类):



Son(同包子类):



Daughter(不同包子类):



SonInLow(不同包类):



总结:Mom看见家里(同包类,同包子类)有脏衣服就会拿去洗(访问权限为protected),但Daughter(不同包类)和SonInLow(不同包子类)没和她住在一起,所以就不用帮他们洗衣服。

剧情五:睡觉-- 谁能替Mom休息

调用Mom类中方法:goSleep() --> 方法访问控制修饰符:private

在Mom(母亲)、Dad(父亲)、Son(儿子)、Daughter(女儿)、SonInLow(女婿)五个类的main方法中加入Mom.goSleep();编译运行。

Mom(本类):



Dad(同包类):



Son(同包子类):



Daughter(不同包子类):



SonInLow(不同包类):



总结:Mom当然只能自己替自己(本类)休息(访问权限为private)。

观后感:综合上面四个场景,果然当妈妈的儿子最幸福了。

The end:写了这么多,是想让大家更轻松的记住,实际上用下面的话及表格就可以简单表示。

Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。

private(当前类访问权限): Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类访问,其子类不能访问,更不能允许跨包访问。
default(包访问权限):即不加任何访问修饰符。该模式下,只同一个包中的类进行访问。
protected(子类访问权限): 一般称之为“保护的”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。同包类亦可访问。
public(公共访问权限): Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。

访问控制级别表
 privatedefaultprotectedpublic
本类
同包类 
子类  
不同包类   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息