Java 的修饰符大礼包

261 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

语法知识不难,难点在于如何在项目中合理运用。

作为一名即将毕业的应届生,非常期待能够在项目中去运用看视频的这些知识。

看视频学过的知识点,学得快忘得快。所以,在模仿高老师的课程案例之前,我先复习一下类那里的知识点。其中,修饰符有两种,一种是访问修饰符,一种是非访问修饰符。

非访问修饰符常见的包括:

非访问修饰符基本含义
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();
    }
}

运行结果:

image.png

有且只有这个 public 级别的 getInfo() 方法可以被调用。

如果我把 glassCup.getInfo(); 这一行换成glassCup.getGoods(); image.png 就会出现编译器检查到的错误,也就是 CheckedException。提醒我们这个是不能从包的外部去用的。

在不同包里,调那个 protected 对应的 getMaterial() 方法呢:

image.png

在父类所在的包里建新类

一模一样的代码,只是在变量名字后面加了 1: image.png

除了 private 以外,都调成功了。

!记住了:同一个包里面,随你怎么闹腾,只要没标 private,都可以用。

测一下子类:

image.png 尽管我在子类里,试图重写父类的私有方法:

image.png 但还是在编译阶段就不通过了。

Protected 重点说明

1 不在同一个包里面,搞父类对象的 Protected 方法就报错了:

image.png

glassCup4 是外包下的类建的父类对象,没有办法用 Protected 方法了。

运行结果:

image.png

2 在同一个包里呢?

有图有真相:

image.png 你会发现,在同一个包就可以了。

  1. 若父类和子类在同一个包中, 子类可访问父类的 protected 成员,也可访问父类对象的 protected 成员。
  2. 若子类和父类不在同一个包中,子类可访问父类的 protected 成员,不能访问父类对象的 protected 成员。

小白错误收藏:

1 default 是不用加在类前面的。 什么也不加就已经是“默认”了。

image.png

2 emm,总是想把方法包在 print 里面是怎么回事。 image.png

3 在不同包下测 protected 的时候,建子类,然后无法被初始化: image.png 然后按照 IDEA 提示加了构造器,就不报错了。

4 在测子类的时候,因为经常复制粘贴,忘了改建子类的那一行,所以虽然我 new 了子类,但是前面的没改完,还是父类。大家在复制的时候还是要谨慎的过一遍的,看看该改的地方有没有改。