Java基础学习 Day 15
1. final关键字
-
final字意义:关键字用来代表最终的,不可改变
-
常见四种用法
-
final可用来修饰类
//定义一个final类 /* * 当final关键字用来修饰一个类的时候, * 格式:public final class 类名称{ * //... * } * 含义:当前这个类不能有任何子类 * */ public final class MyClass { String name; public void method(){}; } //不能被任何类继承这个final类,但该类可继承别的类(也就同时说明final类的方法不能被任何类重写和覆盖) public class MySonClass extends MyClass{ //报错 Cannot inherit from final 'com.kou.oop.demo12.MyClass }
-
final可用来修饰一个方法
//定义一个普通父类有一个final方法 /* * 当final修饰一个方法时,这个方法就是最终方法,也就是不能被覆盖重写 * 格式: * 修饰符 final 返回值类型 方法名(参数列表){ * //方法体 * } * */ public class BasicDemo { public final void method(){ System.out.println("父类final方法执行"); } } //定义一个类继承该父类 重写方法时发现报错 public class DerivedDemo extends BasicDemo { public final void method(){ //报错'method()' cannot override 'method()' in 'com.kou.oop.demo12.BasicDemo'; overridden method is final System.out.println("父类final方法执行"); } }
※对于类,方法来说,abstract和final不能同时出现,因为他们本身是具有矛盾意义的
-
final可用来修饰一个局部变量
//简单定义一个Student类,有name,age属性和get,set方法等 public static void main(String[] args) { int num0 = 10; System.out.println(num0); num0 = 20; System.out.println(num0); //一旦用final来修饰局部变量,那么这个变量就不能进行更改(保证唯一一次赋值) final int num1 = 30; //num1 = 31; 报错 //Cannot assign a value to final variable 'num1' //当final修饰基本型变量时,数据不能改变 //当final修饰的局部变量是引用类型时,该引用指向的地址值不能变 Student stu1 = new Student("Karen",21); System.out.println(stu1);//com.kou.oop.demo02.Student@677327b6 System.out.println(stu1.getName());//Karen stu1 = new Student("Kate",32); System.out.println(stu1.getName());//Kate System.out.println(stu1);//com.kou.oop.demo02.Student@14ae5a5 //如果对象用final修饰时,则不能再改变该地址值了 final Student stu2 = new Student("Karen",21); System.out.println(stu2);//com.kou.oop.demo02.Student@7f31245a System.out.println(stu2.getName());//Karen //stu2 = new Student("Kate",32);报错 Cannot assign a value to final variable 'stu2' //地址值不变,但是可以调用set方法给其中的成员变量改变值 stu2.setAge(33); stu2.setName("Kyle"); System.out.println(stu2.getAge() +stu2.getName());//33Kyle }
-
final可用来修饰一个成员变量
/* * 对于成员变量来说:如果使用final关键字来修饰,那么这个变量也照样不可变 * 1.由于成员变量有默认值,用了final之后就必须手动赋值,不会再有默认值了。 * 2.对于final的成员变量,要么使用直接赋值要么就通过构造方法赋值 * */ //构造方法赋值 public class Person { private final String name; //Variable 'name' might not have been initialized //必须保证类中的所有的重载构造方法堆该成员变量进行赋值,并且之后的setter方法不可用,因为只能赋值一次 //private String name; public Person() { this.name = name; } public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { //this.name = name;//报错 //Cannot assign a value to final variable 'name' } } //手动赋值 public class Person { private final String name = "Karen";//Variable 'name' might not have been initialized //必须保证类中的所有的重载构造方法堆该成员变量进行赋值,并且之后的setter方法不可用,因为只能赋值一次 //private String name; public Person() { } public Person(String name) { } public String getName() { return name; } public void setName(String name) { // this.name = name;//报错 //Cannot assign a value to final variable 'name' } }
-
2. 权限修饰符
Java中有四种权限修饰符,从大到小依次为:
※(default)不是关键字default,而是什么也不写叫做默认的权限
访问分类 | public > | protected> | (default)> | private |
---|---|---|---|---|
同一个类(自己) | Yes | Yes | Yes | Yes |
同一个包(邻居) | Yes | Yes | Yes | No |
不同包子类(儿子) | Yes | Yes | No | No |
不同包非子类(陌生人) | Yes | No | No | No |