权限修饰词的基本介绍
修饰符 | 本类 | 同一个包下的类(包括子类) | 不同包下的子类 | 其他类 |
---|---|---|---|---|
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | 不可以访问 |
default | 可以访问 | 可以访问 | 不可以访问 | 不可以访问 |
private | 可以访问 | 不可以访问 | 不可以访问 | 不可以访问 |
总结
protected:被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问
default:只允许在同一个包中进行访问
final关键字
final修饰类:这个类无法被继承
final修饰方法:这个方法不可以重写
abstract和final不能同时使用一个方法。原因:抽象方法里面没有方法体,常量始终不变,两个关键字相互矛盾,该方法就无意义了
final修饰变量:分类讨论局部变量、成员变量
局部变量:分为基本数据类型与引用数据类型
基本数据类型被修饰时,数值保持不变
引用数据类型被修饰时,地址保持不变,但内容会通过构造器发生改变
成员变量:被其修饰时,因为自身就有初始值,要么直接赋初始,要么在无参构造器中赋初值,否则系统报错
代码演示:final关键字的使用
public class Demo {
public static void main(String[] args) {
final int age = 10; // 局部变量:从始至终数值不变
Student student = new Student();
System.out.println("对象的地址:" + student); // 引用数据类型的地址
System.out.println(student.name);
System.out.println("====================================");
student.name = "莎莎";
System.out.println(student.name);
System.out.println("对象的地址:" + student); // 引用数据类型的地址
// 上下两个student对象的地址都相同
}
}
class Student {
String name;
final String name1 = "文文"; // 1.直接为常量成员变量赋初值
final String name2;
int age;
public Student() {
this.name2 = "丫丫"; // 2.必须在无参构造方法中给成员方法赋值
}
}
static关键字
static修饰成员变量成为静态变量或类变量:存储在方法区的静态常量池中,用于类的所有对象共享
static修饰成员方法成为静态方法或类方法:存储在方法区静态常量池中
static块:类被加载时只执行一次,用来初始化静态成员变量
代码演示:static关键字的使用
通过学生支付的信息累加,并算出结果
public class Demo {
public static void main(String[] args) {
Student student1 = new Student("tom");
Student.payFee(100);
Student student2 = new Student("mary");
Student.payFee(200);
Student.totalFee();
}
}
class Student {
private String name;
public static double fee = 0;
public Student(String name) {
this.name = name;
}
public static void payFee(double fee) {
Student.fee += fee;
}
public static void totalFee() {
System.out.println("一共支付:" + Student.fee + "元");
}
}
代码演示:代码块的应用
public class Demo {
public static void main(String[] args) {
Student student1 = new Student("小明");
System.out.println("-----------------------------");
Student student2 = new Student("小工",10);
// 构造器与代码块相比,代码块优先执行
}
}
class Student {
private String name;
private int age;
public Student(String name) {
this.name = name;
System.out.println("一个属性初始化成功");
}
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("两个属性初始化成功");
}
{
System.out.println("这位同学来自一班");
System.out.println("都很热爱学习");
}
}
运行顺序(静态块、代码块、构造方法)
/**
* 运行机制从快到慢:静态块、代码块、构造器。下面的排序顺序不影响运行机制
* 静态块,它属于类,在类加载时就执行
* 代码块,创建对象立刻执行。对象每创建一次,它就只执行一次
* 构造器,创建对象时执行
*/
public class Demo {
static {
System.out.println("这是静态块!");
}
{
System.out.println("这是代码块!");
}
public Demo() {
System.out.println("这是构造器");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}