第一章 权限修饰符

1.权限修饰符

1.2权限修饰符的使用规则

实际开发中,一般只用private和public

  • 成员变量私有
  • 方法公开

特例:如果方法中的代码是抽取其他方法中的共性代码,这个方法一般也私有。


  • public:公共的,所有地方都可以访问。
  • protected:本类 ,本包,其他包中的子类都可以访问。
  • 默认(没有修饰符):本类 ,本包可以访问。

    注意:默认是空着不写,不是default

  • private:私有的,当前类可以访问。 public > protected > 默认 > private

2.不同权限的访问能力

publicprotected默认private
同一类中
同一包中的类
不同包的子类(通过导包导入子类)
不同包中的无关类

可见,public具有最大权限。private则是最小权限。

编写代码时,如果没有特殊的考虑,建议这样使用权限:

  • 成员变量使用private ,隐藏细节。
  • 构造方法使用public ,方便创建对象。
  • 成员方法使用public ,方便调用方法。
小贴士:不加权限修饰符,就是默认权限

第二章 final关键字

1.概述

学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。

如果有一个方法我不想别人去改写里面内容,该怎么办呢?

Java提供了final 关键字,表示修饰的内容不可变。

  • final不可改变,最终的含义。可以用于修饰类、方法和变量。

    • 类:被修饰的类,不能被继承。
    • 方法:被修饰的方法,不能被重写。
    • 变量:被修饰的变量,有且仅能被赋值一次,当常量即可。

2.使用方式

2.1 修饰类

final修饰的类,不能被继承

格式如下:

final class 类名 {  
}

代码:

final class Fu {  
}  
// class Zi extends Fu {} // 报错,不能继承final的类

查询API发现像 public final class Stringpublic final class Mathpublic final class Scanner 等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。

2.2 修饰方法

final修饰的方法,不能被重写。 格式如下:

修饰符 final 返回值类型 方法名(参数列表){  
    //方法体  
}

代码:

class Fu2 {  
    final public void show1() {  
        System.out.println("Fu2 show1");  
    }  
    public void show2() {  
        System.out.println("Fu2 show2");  
    }  
}  
​  
class Zi2 extends Fu2 {  
//  @Override  
//  public void show1() {  
//  System.out.println("Zi2 show1");  
//  }  
    @Override  
    public void show2() {  
        System.out.println("Zi2 show2");  
    }  
}

2.3 修饰变量-局部变量

  1. 局部变量——基本类型 基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下:
public class FinalDemo1 {  
    public static void main(String[] args) {  
        // 声明变量,使用final修饰  
        final int a;  
        // 第一次赋值   
        a = 10;  
        // 第二次赋值  
        a = 20; // 报错,不可重新赋值  
​  
        // 声明变量,直接赋值,使用final修饰  
        final int b = 10;  
        // 第二次赋值  
        b = 20; // 报错,不可重新赋值  
    }  
}

思考,下面两种写法,哪种可以通过编译?

写法1:

final int c = 0;  
for (int i = 0; i < 10; i++) {  
    c = i;  
    System.out.println(c);  
}

写法2:

for (int i = 0; i < 10; i++) {  
    final int c = i;  
    System.out.println(c);  
}

根据 final 的定义,写法1报错!写法2,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家需要注意的地方。

2.局部变量——引用类型

final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。

例如数组:

final int[] ARR = {1,2,3,4,5,6};//用final修饰了  
//ARR = new int[10];为这个变量赋予另一个数组(地址值)的操作,是不允许的。  
ARR[0] = 10;//是允许修改其内部数值的  
ARR[1] = 20;  
//遍历数组  
for (int i = 0; i < ARR.length; i++) {  
    System.out.println(ARR[i]);  
}  
/*  
输出:10 20 3 4 5 6  
表现:可以看出,修改是生效的。  
*/

2.4 修饰变量-成员变量

成员变量涉及到初始化的问题,初始化方式有显示初始化和构造方法初始化,只能选择其中一个:

  • 显示初始化(在定义成员变量的时候立马赋值)(常用);
public class Student {  
    final int num = 10;  
}
  • 构造方法初始化(在构造方法中赋值一次)(不常用,了解即可)。

    注意:每个构造方法中都要赋值一次!

public class Student {  
    final int num = 10;  
    final int num2;  
​  
    public Student() {  
        this.num2 = 20;  
//     this.num2 = 20;  
    }  
      
     public Student(String name) {  
        this.num2 = 20;  
//     this.num2 = 20;  
    }  
}

3.fina修饰的量——常量

被final修饰的常量名称,称为常量

实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。

常量的命名规范:

  • 单个单词:全部大写
  • 多个单词:全部大写,单词之间用下划线隔开。

3.1使用:

改造之前写过的学生管理系统

  • 设置常量来代替case中的判断条件1,2..提高可读性

image-20231119162515832

最后修改:2023 年 11 月 20 日
如果觉得我的文章对你有用,请随意赞赏