1. final关键字
1.概述
为了避免子类出现随意改写父类的情况,java提供了关键字final
,用于修饰不可改变内容
- final:不可改变,可以修饰类,方法和变量
- 类:被修饰的类,不能用于继承
- 方法:被修饰的方法,不能被重写
- 变量:被修饰的变量,不能重新赋值
2.使用方式
修饰类
格式如下:
public final class 类名{ } 含义: 当前这个类不能拥有任何的子类. (太监类) 注意: 一个类如果是final的, 那么其中的所有的成员方法都无法进行覆盖重写(没有儿子)
String,Math,Scanner这些类都是被final修饰的,目的是供我们使用,而不让我们改变内容
修饰方法
格式:
修饰符 final 返回值类型 方法名(参数列表){ //方法体 } //注意: 对于类,方法来说, abstract关键字和关键字final 不能同时使用,矛盾
重写final
修饰的方法,编译时就会报错
修饰变量
1.局部变量—基本类型
基本类型的局部变量,被final
修饰后,只能赋值一次,不能再更改.
public class FianlDemo{ public static void main(String[] args){ // 声明变量,被final修饰 final int a; //第一次赋值 a = 10; //第二次赋值直接报错 final int b = 10; } }
写法一 final int c = 0; for(int i=0;i<10;i++){ c = i; System.out.println(c); }
写法二 for(int i=0;i<10;i++){ final int c = i; System.out.println(c); }
写法二不会报错,因为每一次循环都是一个新的变量
2.局部变量--引用类型数据
引用类型的局部变量,被final修饰之后,只能指向一个对象,地址不可以更改.但是不影响对象内部的成员变量值得修改
public class FinalDemo2{ public static void main(String[] args){ // 创建User对象 final User u = new User(); // 创建另一个对象 u = new User(); //报错 //调用方法 u.setName("张三"); //可以修改 } }
3.成员变量
成员变量设计到初始化的问题,初始化两种二选一:
-
显示初始化
public class User{ final String UserName = "张三"; private int age; }
-
构造方法初始化
public class User{ final String UserName; private int age; public User(String username, int age){ this.UserName = username; this.age = age; } } // 注意: 被final修饰的常量名称,一般全部大写
2.权限修饰符
在java中四种访问权限,使用不同的权限修饰符修饰时,被修饰的内容会有不同的访问权限
- public: 公共的
- protected:受保护的
- default:默认的
- private:私有的
1.不同权限的访问能力
public | protected | default | private | |
---|---|---|---|---|
同一个类中 | yes | yes | yes | yes |
同一个包中(子类与无关类) | yes | yes | yes | |
不同包的子类 | yes | yes | ||
不同包的无关类 | yes |
public是最大权限,private是最小权限
编译代码建议:
- 成员变量使用 private, 隐藏细节
- 构造方法使用 public,方变创建对象
- 成员方法使用 public ,方便调用
不加修饰符,其访问能力就是default相同
3.引用数据用法总结
1.class作为成员变量
类作为成员变量的时候,对他进行的赋值操作,实际上是赋值给类的一个对象
2.interface作为成员变量
接口作为成员变量的时候,对他进行的赋值操作,事假上,就是赋值给借口的一个子类对象
3.interface作为方法参数和返回值类型
接口作为参数的,传递的是子类对象
接口作为返回值类型的时候,返回它的子类对象
来源:https://www.cnblogs.com/liudemeng/p/11357081.html