小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
语法知识不难,难点在于如何在项目中合理运用。
作为一名即将毕业的应届生,非常期待能够在项目中去运用看视频的这些知识。
看视频学过的知识点,学得快忘得快。所以,在模仿高老师的课程案例之前,我先复习一下类那里的知识点。其中,修饰符有两种,一种是访问修饰符,一种是非访问修饰符。
非访问修饰符常见的包括:
| 非访问修饰符 | 基本含义 |
|---|---|
| static | 静态的、非实例的(本质) 、类的 |
| final | 最终的、不可改变的 |
| abstract | 抽像的,不可实例的 |
访问控制修饰符,权限由宽松到严格分别是:
- public 最常见的一种了,哪里都能访问,不管是包里包外,子类、孙子类无关类等等。
- protected 只有同一个包里的才能访问,或者是子类也可以访问。
- default(package only) 只有在同一个包下面才可以正常访问
- private 就给自己用,子类也用不着。
为了生动的理解记忆,可以跟着我下面描述的场景进行想象和演练:
package HomeGoods;
public class KitchenGoods {
String tag;
String material;
double price;
public KitchenGoods(String tag,String material, double price) {
this.material = material;
this.tag = tag;
this.price = price;
}
public KitchenGoods() {
}
private void getPrice() { // 价格信息这么敏感,当然不能随便打印了。只有我这个类才可以。
System.out.println("private: " + price);
}
void getGoods() { // default 关键字是不用加的
System.out.println("default: " + tag);
}
protected void getMaterial() { // 材质就保护起来,我的子类或者包里的,可以查看
System.out.println("proteced: " + material);
}
public void getInfo() {
System.out.println("public: " + tag + "\t" + price);
}
}
父类 KitchenGoods class,位于 HomeGoods包:
在 HomeGoods 包 里的 KitchenGoods 是这样定义的:
- getPrice()的级别是 private;
- getGoods()的级别是 default;
- getMaterial() 的级别是 protected;
- getInfo() 的级别是 public。
建一个新包,叫 Cups
在一个新的杯子包里,new 一个厨具类。
package Cups;
import HomeGoods.KitchenGoods;
public class Test {
public static void main(String[] args) {
KitchenGoods glassCup = new KitchenGoods("KT001", "glass", 5.00);
glassCup.getInfo();
}
}
运行结果:
有且只有这个 public 级别的 getInfo() 方法可以被调用。
如果我把 glassCup.getInfo(); 这一行换成glassCup.getGoods();
就会出现编译器检查到的错误,也就是 CheckedException。提醒我们这个是不能从包的外部去用的。
在不同包里,调那个 protected 对应的 getMaterial() 方法呢:
在父类所在的包里建新类
一模一样的代码,只是在变量名字后面加了 1:
除了 private 以外,都调成功了。
!记住了:同一个包里面,随你怎么闹腾,只要没标 private,都可以用。
测一下子类:
尽管我在子类里,试图重写父类的私有方法:
但还是在编译阶段就不通过了。
Protected 重点说明
1 不在同一个包里面,搞父类对象的 Protected 方法就报错了:
glassCup4 是外包下的类建的父类对象,没有办法用 Protected 方法了。
运行结果:
2 在同一个包里呢?
有图有真相:
你会发现,在同一个包就可以了。
- 若父类和子类在同一个包中, 子类可访问父类的 protected 成员,也可访问父类对象的 protected 成员。
- 若子类和父类不在同一个包中,子类可访问父类的 protected 成员,不能访问父类对象的 protected 成员。
小白错误收藏:
1 default 是不用加在类前面的。 什么也不加就已经是“默认”了。
2 emm,总是想把方法包在 print 里面是怎么回事。
3 在不同包下测 protected 的时候,建子类,然后无法被初始化:
然后按照 IDEA 提示加了构造器,就不报错了。
4 在测子类的时候,因为经常复制粘贴,忘了改建子类的那一行,所以虽然我 new 了子类,但是前面的没改完,还是父类。大家在复制的时候还是要谨慎的过一遍的,看看该改的地方有没有改。