Java - Final、权限修饰符、接口
-
成员位置是指 类中方法外。
-
类也是一种引用类型的数据,可以用在返回值,方法参数,其他类的成员等地方。
-
如果类中某个成员属性是一种事物,具备属性与行为,那么需要先将其定义成一个类。
-
加修饰符都是加在 返回值 前面。
-
final 关键字
- Java提供了final 关键字,用于修饰不可改变内容。
- 修饰类:被 final 修饰的类,不能被继承(例如:String类、Math类、Scanner类…)。
- 修饰方法:被 final 修饰的方法,不能被重写。
- 修饰变量:被 final 修饰的变量,一旦赋值,不能被重新赋值,从而被称为常量(自定义常量,所有字母大写)。
- 修饰局部变量:使用前必须赋值。
- 修饰成员变量:没有默认值,对象创建好之前必须明确赋值,也就是要么声明时就赋值,要么在所有的构造方法里都有给它赋值,后者会比较灵活。
-
权限修饰符
范围 | 同一类中 | 同一包中 | 不同包的子类 | 不同包无关类 |
---|---|---|---|---|
公共的:public | √ | √ | √ | √ |
受保护的:protected | √ | √ | √ | |
默认的 (也就是不写) | √ | √ | ||
私有的:private | √ |
~ 常用规则
- 类:public、默认 ,一般用public,为什么不能用 protected 修饰类呢,因为别的类要使用protected的父类需要已经是它的子类,但是子类还未继承,准备要继承它,结果它说你不是我的子类,所以矛盾了。
- 类中成员:public protected 默认 private 四种都可以使用。
- 成员内部类 :一般用 private,隐藏细节。
- 修饰成员变量 :一般用 private,隐藏细节。
- 修饰成员方法:一般用public,方便调用方法。
- 修饰构造方法:一般用public ,方便创建对象。
-
静态修饰符 - static
- static是静态修饰符,表示静态的意思,可以修饰类中成员(成员方法、成员变量、代码块等)。
- 被修饰的变量是放在方法区中的,所以对象可共享,而非静态的变量是存在于堆内存中的。
- static 修饰的成员变量是有默认值的。
- 如果有一个对象改变了静态变量的值,那么之后所有对象用的都是改过之后的值。
- 静态方法推荐使用 类名 来调用。
~ 注意事项
- 静态方法可以直接访问静态变量和静态方法。
- 静态方法不能直接访问普通成员变量或成员方法。 (因为字节码文件的加载早于对象的创建,静态内容的在字节码中存在,所以已经加载好了,可以直接访问,但是普通的还没加载好,因为此时对象还没有创建。)
- 成员方法可以直接访问类变量或静态方法。
- 静态方法中,不能使用this关键字。(也是因为还没有创建对象,因为 this 需要有对象才能使用)
~ 类中的方法到底该不该定义成 static 呢?
-
要从合理角度来看方法是不是更适合需要一个对象来调用才合理,比如 人 这个类中 吃 的这个方法就需要有对象才去调用才合理,所以不定义成static 的,所以实体类一般不会用到static 关键字。
- 工具类的构造方法定义成private ,因为已经说了调用工具类的属性与方法直接使用类名调用,不要创建对象浪费空间,所以为了防止还是有人搞鬼,将其定义成私有的,别的类没法创建对象。
-
构造代码块
-
一对大括号,即理解为一个代码块。
-
代码块可以独立存在于成员位置。
-
-
根据是否有 static 修饰分为静态代码块、构造代码块。
- 注意事项
- 执行时机:每次创建对象都会执行构造代码块,优先于任意一种构造方法执行,所以在构造代码块中可以写所有构造方法都要做的事比如常量的赋值,因为声明的常量是必须要赋值的,与其每个构造方法都写,不如在构造代码块里写,先把值赋好,防止报错。
-
-
静态代码块
- 格式 : static { //执行语句 }
- 执行时机:随着类的加载而执行且执行一次,优先本类中的main方法、构造方法和构造代码块的执行
- 用于加载Java 中的没有的第三方类库
-
接口
-
类与类之间的继承就像是亲爹与儿子的关系,类与接口的实现就像干爹与儿子的关系。
-
接口编译后也是 .class 文件,所以反过来说, .class 文件不一定是类编译过来的。
-
接口随着JDK版本更新,越来越靠近 抽象类的特点。
-
- 类与接口的实现
实现默认方法时要把default 关键字去掉。
-
单实现 - 也就是只实现了一个接口
-
当一个类实现了多个接口:
- 1 多个接口中存在同名的静态常量和静态方法,要用不同的接口分别调用
- 2 多个接口中存在同名的抽象方法和默认方法,都只需要重写一次属于自己的,默认方法必须重写
-
当一个类既继承又实现-基本上是优先用的父类的,毕竟是亲爹!!
-
父类的静态方法,子类对象竟然 也能直接调用,并且如果在子类中重新写一遍,加上@Override 注解,结果却报错,说明编译器根本不认为这是继承过来的,因为重写失败,有争议;所以暂时不推荐子类对象直接调用
-
理解 接口 - 它是一种标准、规范、约束,或者说是一个统一的、特殊的功能的要求。比如电脑的USB接口,其他的U盘厂商必须要实现电脑厂商的USB接口,因为我不可能你们每个人自己定义一个,我电脑厂商还要针对性的去记,而且肯定是你USB厂商要顺着我电脑厂商的要求,所以要想和我联通,都得按照我的规矩来。
-
一般的类与接口设计思路
-
父类: 抽取了子类共同属性和行为的类。
-
抽象类: 有子类实现各不相同的方法的父类。
-
接口: 有事物可能具备的特殊方法。
-
-
接口与接口之间是继承关系,且支持多继承;如果父接口中的默认方法有重名的,那么子接口需要重写一次
-
面试题