【Java】修饰符

169 阅读5分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

目录

0E82878E.gif 今天阿文介绍的内容为:

  • 四大访问修饰符:publicdefaultprotectedprivate
  • 三大非访问修饰符:staticfinalabstract

Java修饰符

在Java中修饰符主要分为两种:

  • 访问修饰符
  • 非访问修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端

例如:

public class ClassName{
    //...
}
public int age;
private String name;
public static String gender;
protected void method() {
    //方法体
}

1访问控制修饰符

在Java中,访问修饰符分为4种:publicprotecteddefault(即没有使用访问修饰符)private

它们的修饰的元素和可访问范围都不相同,具体看下表格:

访问修饰符修饰的元素可访问范围
public类、字段、方法、接口所有类
protected字段、方法同一个包下的类、所有子类
default类、字段、方法、接口同一个包中的类
private字段、方法本类

1.1默认访问修饰符-不适用任何关键字

  • 使用默认访问修饰符声明的变量和方法,对同意该包的类都是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public

例子:

interface Animal {
    //为public static final修饰
    String breed = "animal";

    void cry();//默认为public访问权限

    public void eat();//public访问权限
}

1.2私有访问修饰符

私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。

例子:

public class Animal {
    private String breed;
    private void color() {
        //方法体
    }
    //通过getter方法间接访问私有属性
    public String getBreed() {
        return breed;
    }
}

1.3公有访问修饰符

被声明为public的类、方法、构造方法、接口能够被任何其他类访问

我们所熟悉的main()方法就是使用了公有访问修饰符

public static main(String[] arguments){
    //...
}

Java程序中的main()方法必须声明为public,否则,Java解释器将不能运行该类

1.4保护访问修饰符

保护访问修饰符可以分为两种情况:

  • 子类和父类在同一个包中: 被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。

例如:创建两个包package1和package2

Java访问修饰符1.png

在package1包中创建父类ClassObjectFarther

并且声明一个保护方法method

Java访问修饰符2.png

在package2包中,创建一个子类ClassObejectSon继承package1包中ClassObejectFarther类,在创建一个测试类Text2,在Text2类中创建一个ClassObjectSon对象并调用父类的保护方法

Java访问修饰符3.png

可以看到报错了,显示不能调用保护方法,那如果我们在子类中覆写该保护方法呢?

Java访问修饰符4.png

可以看到编译器是通过的,我们运行一下。

Java访问修饰符5.png

可以看到调用的是子类覆盖的保护方法。

总之,先确定出该protected成员来自哪里,再确定其可见范围,就可以判断出当前用法是否可行。

2.非访问修饰符

在类及其成员除了要考虑其可见性还需要考虑其生命周期作用域的问题,因此,Java提供了三种非访问修饰符。

非访问修饰符修饰元素含义
static字段、方法、内部类静态的,类的
final字段、方法、类、局部变量最终的,不可改变的
abstract类、方法抽象的、非具体的

2.1static

使用关键字static修饰的成员变量,称为静态成员变量,也称类变量。无论类实例化多少对象,静态变量只有一份拷贝。静态变量存放在内存静态存储区,可以通过类名.静态变量直接访问,也可以通过类的对象访问。static修饰的成员为类所有,优先于对象的构造方法被执行,同一类型的局部变量的不同对象共享此成员。

没有使用static修饰的成员变量(简称实例变量)在对象创建时被实例化,存放在堆内存,可能作为垃圾被回收。

例子:

public class Animal {
    //静态公有变量
    public static int sum = 0;
    //实例变量
    public String breed;
}

2.2final

使用final 修饰的类称为终结类,不能够被继承。使用final修饰的方法可以被继承,但不能被子类重新定义(覆盖或重写)。使用final修饰的变量是不可修改的常量

例子:

创建父类ClassFarther

package package1;
class ClassFarther {
    public static final String name = "zhangsan";
    public final void method(){
        System.out.println("Hello Java!");
    }
}
class ClassSon extends ClassFarther {
    @Override
    public void method(){
        System.out.println("Hello Java!");
    }
}
public class Text1 {
    public static void main(String[] args) {
        ClassFarther.name = "lisi";
    }
}

我们在测试类中试着修改常量name

Java访问修饰符6.png

可以看到是出现报错的,重写final方法是不可以的,修改常量也是不可以的。

public final class ClassObeject{
    //...
}

final类是不可以被继承的,没有类能够继承 final 类的任何特性。

2.3abstract

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被 abstractfinal 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

总结

  • 四种访问修饰符的可见范围是不同的,在编程时一定需要注意
  • 三种非访问修饰符,它们修饰的作用各不相同,常常与访问修饰符一起使用

好了,今天阿文就介绍到这了... byebye

0E81EC19.png