语法知识不难,难点在于如何在项目中合理运用。
作为一名即将毕业的应届生,非常期待能够在项目中去运用看视频的这些知识。
看视频学过的知识点,学得快忘得快。所以,在模仿高老师的课程案例之前,我先复习一下类那里的知识点。其中,修饰符有两种,一种是访问修饰符,一种是非访问修饰符。
非访问修饰符常见的包括:
非访问修饰符 | 基本含义 |
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 在同一个包里呢?
有图有真相:
你会发现,在同一个包就可以了。
小白错误收藏:
1 default 是不用加在类前面的。 什么也不加就已经是“默认”了。
2 emm,总是想把方法包在 print 里面是怎么回事。
3 在不同包下测 protected 的时候,建子类,然后无法被初始化:
然后按照 IDEA 提示加了 构造器 ,就不报错了。
4 在测子类的时候,因为经常复制粘贴,忘了改建子类的那一行,所以虽然我 new 了子类,但是前面的没改完,还是父类。大家在复制的时候还是要谨慎地过一遍的,看看该改的地方有没有改。