1.final修饰成员变量,意为不可改变;也可以修饰局部变量,使用前先初始化(较少使用)。
两种方式初始化:
-声明时初始化
-构造方法时初始化(在声明变量时,不知道具体赋值什么,可以在构造方法中"最后一次"赋值)
想让外界只能读不能改,private修饰,再配读取方法;而final关键字是用来防止内部和外部修改(程序员疏忽等)
2.final修饰的方法,不能被修改;禁止子类方法修改来自于父类的final方法
3.final修饰的类无法被继承,用来保护重要类。
/*
* 封装手机属性和功能的类
*/
public class Iphone {
//定义一个只读的手机型号属性
//想让外界只能读不能改,private修饰,再配读取方法
private final String type;
public String getType(){
return type;
}
//声明一个手机系统
static final String OS = "ios";//static final常量,声明时必须初始化且后期不允许修改,也不必private因为常量就定义了不能修改
public Iphone(String type){
this.type = type;
}
/*
* 恢复出厂设置的方法
*/
public void reset(){
System.out.println("清空内存");
//type = "5s";//final修饰的成员变量不能赋值
System.out.println("恢复操作系统");
}
/*
* mobile 手机号 方法内不能改
* msg 消息内容 方法内不能改
*/
public void send(final String mobile,final String msg){
//mobile = "78"+mobile;//编译错误,final修饰的局部变量不能被修改
System.out.println("给"+mobile+"发"+msg);
}
//重载网络发送消息的发送
public void send(String ip,int port,String msg){
System.out.println("向"+ip+"上的"+port+"端口发送"+msg);
}
}
public class NewIphone extends Iphone{
//重写父类的构造方法
public NewIphone(String type) {
super(type);
}
/*
* 子类重写父类的send方法,重写和final无关,仅关注方法名和参数类型列表
*
*/
public void send(String mobile,String msg){
//在父类send方法添加final后,子类send方法立即保持,这样就杜绝某一重要方法被子类重写了,
//添加final后不会影响该方法重载,重载是并存关系
//调用父类正常send方法发短信
super.send(mobile, msg);
//调用父类send方法再给老婆发一次
super.send("我老婆手机号", msg);
}
}
public class Test {
public static void main(String[] args) {
Iphone p = new Iphone("5C");
System.out.println(p.getType());
p.reset();
System.out.println(p.getType());
p = new NewIphone("5C");
p.send("23q4134", "taxiang");
p.send("sd",123,"234");
System.out.println(Iphone.OS);
}
}
static和final的区别:
单独使用
只要多个对象共享一个对象,就用static
只要不让改的,就要final
连用
static final表示静态常量,存储在方法区