final关键字
final:
Java
提供了
fifinal
关键字, 用于修饰不可改变
内容。
final的特点:
final类不能被继承,但可以继承其他类
final修饰的方法不可以被覆盖,但是可以被继承使用
final修饰的基本数据类型变量称为常量,只能赋值一次
final修饰的引用数据类型变量值为地址值,地址值不能改变,但是地址内的属性对象可以改变
final修饰成员变量,需要在创建对象前赋值,否则报错(定义时直接赋值,如果在构造方法赋值,多个构造方法的均需赋值)
final修饰的方法不可以被覆盖,但是可以被继承使用
final修饰的基本数据类型变量称为常量,只能赋值一次
final修饰的引用数据类型变量值为地址值,地址值不能改变,但是地址内的属性对象可以改变
final修饰成员变量,需要在创建对象前赋值,否则报错(定义时直接赋值,如果在构造方法赋值,多个构造方法的均需赋值)
修饰类:格式
final class 类名{
}
修饰方法 格式:
修饰符 final 返回值类型 方法名(参数列表){
方法体
}
修饰变量 : 修饰基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改
修饰引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改,但是不影响对象内部成员变量类的修改
修饰成员变量设计初始化的问题,初始化方式有两种: 显示初始化,构造方法初始化,只能二选一
多态: 一个事物在不同时刻的不同状态
多态的前提条件:
1.必须有继承关系(产生一个extends关系)
2.必须有方法重写:
子类继承父类的时候,需要使用子类的功能,需要将父类的功能覆盖掉
3.必须有父类引用指向子类对象(向上转型)
Fu f=new Zi(); 在内存中使用子类实例化(创建对象),但是子类继承父类,通过构造方法,让父类初始化
多态的成员访问特点
Fu f=new Zi();
1)成员变量(非静态变量):编译看左,运行看左边(看父类)
2)构造方法
Fu f=new Zi();
内存创建的是子类对象,但是存在继承关系,执行构造方法先让父类初始化完毕,然后在初始化子类
3)成员方法(非静态): 方法重写 说的非静态的方法
编译看左,运行看右(因为存在方法重写,运行就看的右边)
4)静态的成员方法:
编译看左,运行看左(静态方法算不上方法重写,跟类相关,优先父类进行初始化
父类引用.静态方法名()-->调用父类的方法
以下是代码范例:
class Fu{
public Fu(){}
public int num1=100;
public int num2=200;
public void lbr(){
System.out.println("lbr");
}
public void lbr1(){
System.out.println("lbrlbr");
}
public static void lrslbr(){
System.out.println("lrslbr");
}
}
class Zi extends Fu{
public Zi(){}
public int num1=1000;
public int num2=2000;
public void lbr1(){
System.out.println("lbr........");
}
public static void lrslbr(){
System.out.println("lrslbr........");
}
}
class DuoTai1{
public static void main(String[] args){
Fu f=new Zi();
System.out.println(f.num1);//100
System.out.println(f.num2);//200
f.lbr1();//lbr.....
f.lrslbr();//lrslbr
f.lbr();//lbr
}
}
首先运行 Fu f=new Zi(); 正常来说应该直接进入Zi类,但是由于运用了多态,所以首先多态中的成员变量首先需要调用父类中的变量,
所以输出100 200. 接着调用非静态的成员方法因为存在的方法重写所以运行是运行调用的子类,所以输出的是lbr..........
但是如果是静态成员方法,就需要编译左边,运行右边,所以输出的是 lrslbr ,所以如果不是非静态的成员方法 就需要编译左边
运行子类,所以会输出lbr所以输出lbrlbrlbrlbr,如果子类没存在这个方法 就会去父类寻找.