final关键字的用法
final关键字代表最终,不可改变的。
常见的四种用法:
1.可以用来修饰一个类
2.可以用来修饰一个方法
3.可以用来修饰一个局部变量
4.可以用来修饰一个成员变量
当final关键字用来修饰一个类的时候,格式:
public final class 类名称{
//‘’‘’‘
}含义是这个类不能有子类
注意:一个类如果是final的,那么其中所有成员方法都无法进行覆盖重写(因为没有子类)
但是final关键字所在的类可以对继承的父类进行覆盖重写
当final关键字修饰一个方法的时候,这个方法就是最终方法,也就是不能覆盖重写
格式:修饰符 final 返回值类型 方法名称(参数列表){
//方法体
}
对于类,方法来说,abstract关键字和final关键字不能同时使用,因为抽象方法必需重写,然而final修饰的方法不能重写
final修饰变量时,一次赋值就不能改变,所以一次赋值终生使用,格式 final int a=100;
定义一个学生类student
public class student {
private String name;
public student (){
}
public student(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
定义一个类
public class demo01Final {
public static void main(String[] args) {
int num1=10;
System.out.println(num1);
num1=20;
System.out.println(num1);
final int num2=200;
System.out.println(num2);//如果再写num2=520;这是错误的,一次赋值就不能在改变
final int num3;
num3=30;
//对于基本类型来说,不可变说的是不可变的是变量当中的数据不可改变
//对于引用类型来说,不可变说的是变量当中的地址值不可变
student stu=new student("赵丽颖");
System.out.println(stu);
System.out.println(stu.getName());
stu=new student("霍建华");
System.out.println(stu);
System.out.println(stu.getName());
System.out.println("=========");
final student stu2=new student("高圆圆");
System.out.println(stu2);
System.out.println(stu2.getName());
stu2.setName("高圆圆与赵又廷");
System.out.println(stu2.getName());
}
}
final关键字修饰成员
对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。
1.由于成员变量具有默认值,所以用了final之后必需手动赋值,不会再给默认值了。
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一
3.必须保证类当中所有重载的构造方法都最终会对final的成员变量进行赋值。
public class person {
private final String name/*="赵又廷"*/;
public person(){
name="关晓彤";
}
public person(String name){
this.name=name;
}
/* public void setName(String name){
this.name=name;
}*/
public String getName(){
return name;
}
}
关于四种权限修饰符
Java中有四种权限修饰符public>protect>(defualt)>private
同一个类四种权限修饰符都能使用
public class Myclass {
private int num=10;
public int num3=30;
protected int num2=20;
public void method(){
System.out.println(num);//可以访问num
System.out.println(num2);//可以访问num,protect就是给子类使用的
System.out.println(num3);//可以访问
}
}
同一个包只有private不能使用
Myclass和MyAnther在一个包中
public class MyAnther {
public void methodAnother(){
System.out.println(new Myclass().num2);
System.out.println(new Myclass().num3);
//System.out.println(new Myclass().num1);不能访问
}
}
在上一个类中创建一个子包名为sub
import demo02.Myclass;
public class Myson {
public class MyAnther {
public void methodAnother(){
//System.out.println(new Myclass().num2);不能访问
System.out.println(new Myclass().num3);
//System.out.println(new Myclass().num1);不能访问
}
}
}
不同包下的子类只有public和default可以使用
不同包下非子类只有public可以使用