目录
final
修饰范围:
类,属性,方法,局部变量
作用:
修饰类:
当final修饰类的时候,表示这个类不能被继承
修饰属性:
1. 当final修饰属性的时候,表示常量,只能被复制一次,赋值后不再改变
2.当final修饰基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生改变
3.当final修饰引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但是所指向对象的内容是可以发生变化的,例如可以修改类的属性值
4.因为只能赋值一次,所以必须对final修饰的成员变量初始化,有两种方法
1.在变量声明的时候初始化
public final class Test01 {
public final int a=12; //直接初始化
}
2.在声明变量的时候不赋初值,然后再类的所有构造函数中对这个变量初始化
public final class Test01 {
public final int a;
public Test01(int a) { //构造函数初始化
this.a = a;
}
}
修饰方法:
final修饰方法代表这个类可以被继承,但是这个类中用final修饰的方法不能被重写,但是可以被重载
注意:重写的前提是子类在父类中能继承此方法,如果final修饰的方法同时权限是private,会导致子类不能继承到此方法,这时子类可以定义同名和同形参的方法,这里不会产生矛盾,因为根本就没有被重写
成员变量赋值方法
实例变量:
1.通过代码块赋值
public class Test04 {
final int b;
{
b=10;
}
}
2.通过构造函数赋值
public class Test04 {
final int b;
public Test04(int b) {
this.b = b;
}
}
3.直接赋值
public class Test04 {
final int b = 10;
}
类变量:
1.通过静态代码块赋值
public class Test04 {
final static int b;
static {
b=10;
}
}
2.直接赋值
public class Test04 {
final static int b=10;
}
3.类常量无法通过构造器赋值,因为被加载早于被实例
局部变量赋值方法
1.在创建时赋值
public class Test04 {
public void run(){
final int c=10;
}
}
2.在使用之前一定要赋值!
public class Test04 {
public void run(){
final int c;
c=10; //使用之前赋值
System.out.println(c);
}
}
static
修饰范围:
属性,方法,代码段,内部类(静态内部类或嵌套内部类)
作用:
修饰属性:
1.让属性随着类的加载而加载,是类变量,加载早于对象,不需要new即可加载
2.类变量所在的类的所有对象共用这一个属性,存放在方法区中
3.调用通过类名.类变量名
4.不赋初值的话默认为0
修饰方法:
1.让方法随着类的加载而加载,是类变量,加载早于对象,不需要new即可加载
2.类方法所在的类的所有对象共用这一个方法
3.类方法内部可以创建临时变量,不能调用非静态的实例方法和实例变量,只能调用静态的实例方法和变量
4.调用通过类名.类变量名
修饰代码段:
1.被static修饰的代码块,较静态代码块
2.位置定义在方法之外,随着类加载执行且执行一次,优先于main方法和构造方法的执行
class test001{
static {
System.out.println("123");
}
public static void main(String[] args) {
Test01 test01 = new Test01();
System.out.println(test01.a);
}
}
//先输出123再执行main方法
修饰类:
static不能修饰普通类
修饰内部类:
如果不用static修饰,就需要通过外部类的对象来创建内部类
class test001{
class In { //没有static
public void Print(){
System.out.println("5");
}
}
public static void main(String[] args) {
test001 t = new test001();
In in = t.new In(); //通过test001的对象t间接创建In类的对象in
in.Print();
}
}
如果用static修饰,就可以直接创建内部类
class test001{
static class In { //有static
public void Print(){
System.out.println("5");
}
}
public static void main(String[] args) {
In in = new In(); //可以直接创建
in.Print();
}
}
1.被修饰的内部类可以直接作为一个普通类来用,而不需要一个外部类