本人已参与「新人创作礼」活动,一起开启掘金创作之路。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
目录
今天阿文介绍的内容为:
- 四大访问修饰符:
public、default、protected、private - 三大非访问修饰符:
static、final、abstract
Java修饰符
在Java中修饰符主要分为两种:
- 访问修饰符
- 非访问修饰符
修饰符用来定义类、方法或者变量,通常放在语句的最前端。
例如:
public class ClassName{
//...
}
public int age;
private String name;
public static String gender;
protected void method() {
//方法体
}
1访问控制修饰符
在Java中,访问修饰符分为4种:public、protected、default(即没有使用访问修饰符)、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
在package1包中创建父类ClassObjectFarther
并且声明一个保护方法method
在package2包中,创建一个子类ClassObejectSon继承package1包中ClassObejectFarther类,在创建一个测试类Text2,在Text2类中创建一个ClassObjectSon对象并调用父类的保护方法
可以看到报错了,显示不能调用保护方法,那如果我们在子类中覆写该保护方法呢?
可以看到编译器是通过的,我们运行一下。
可以看到调用的是子类覆盖的保护方法。
总之,先确定出该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
可以看到是出现报错的,重写final方法是不可以的,修改常量也是不可以的。
public final class ClassObeject{
//...
}
final类是不可以被继承的,没有类能够继承 final 类的任何特性。
2.3abstract
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
总结
- 四种访问修饰符的可见范围是不同的,在编程时一定需要注意
- 三种非访问修饰符,它们修饰的作用各不相同,常常与访问修饰符一起使用
好了,今天阿文就介绍到这了... byebye