二、final和static关键字,接口和抽象类
fianl關鍵字的作用
-
final代表最終的意思,可以修飾成員方法,成員變量,類
final修飾類、方法、變量的效果
-
final修飾類:該類不能被繼承(不能有子類,但是可以有父類)
-
final修飾方法:該方法不能被重寫
-
final修飾變量:表明該變量是一個常量,不能再次賦值
-
變量是基本類型,不能改變的是值
-
變量是引用類型,不能改變的是地址值,但地址里面的內容是可以改變的
-
舉例
-
1 final修飾類:該類不能被繼承
-
2final修飾方法:該方法不能被重寫
-
3final修飾變量:表明該變量是一個常量,不能再次賦值
變量是引用類型,不能改變的是地址值,但地址里面的內容是可以改變的
final ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add("fdsfds"); //list 保存的是地址 所以添加數據沒有問題 地址并沒有改變 System.out.println(list);//下面的代碼會改變list的地址 所以不允許 list = new ArrayList(); list = null;static靜態的
-
static 關鍵字是靜態的意思,是Java中的一個修飾符
-
static可以用來修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來優化程序性能。
static修飾的特點
-
被類的所有對象共享
-
隨著類的加載而加載,優先于對象存在
-
對象需要類被加載后,才能創建
-
-
可以通過類名調用,也可以通過對象名調用
-
被static關鍵字修飾的方法或者變量不需要依賴于對象來進行訪問,只要類被加載了,就可以通過類名去進行訪問。
-
體驗練習
public class Student {String name;int age = 10;static String country = "中國";public Student(String name, int age) {this.name = name;this.age = age;}public static void eat() {System.out.println("吃肉夾饃");} }static關鍵字注意事項
-
靜態方法只能訪問靜態的成員
-
非靜態方法可以訪問靜態的成員,也可以訪問非靜態的成員
-
靜態方法中是沒有this關鍵字
代碼
-
Student類 有成員變量name和age 有靜態變量country
-
有成員方法drink有靜態的方法eat
-
eat方法里只能調用靜態的成員
子類可以繼承父類中的靜態成員
-
注意不能夠重寫靜態方法,如果寫了一樣的靜態方法,只是把父類靜態方法隱藏了,并不是重寫(可以用Override檢查 )
如何確定一個屬性和方法是否要聲明為static
屬性:
-
屬性可以被多個對象所共享,不會隨著對象的不同而不同
-
類中的常量也常常聲明為static
方法:
-
操作靜態屬性的方法,通常設置為static的
-
具類中的方法,習慣上聲明為static的,比如Math,Arrays,Collections
接口
-
接口就是一種公共的規范標準,只要符合規范標準,大家都可以通用。
-
Java中接口存在的兩個意義
-
用來定義規范
-
用來做功能的拓展
接口語法
-
接口用關鍵字interface修飾
public interface 接口名 {} -
類實現接口用implements表示
public class 類名 implements 接口名 {} -
接口不能實例化
-
我們可以創建接口的實現類對象使用
-
-
接口的子類
-
要么重寫接口中的所有抽象方法
-
要么子類也是抽象類
-
接口語法練習代碼
-
1接口 Inter1 有一個抽象方法eat
-
2實現類 Inter1Impl 實現了接口Inter1,也實現了方法eat
-
3測試代碼 注意接口不能實例化
代碼
-
接口 Inter1代碼
-
實現類 Inter1Impl 實現了接口Inter1,也實現了方法eat
-
測試
接口的成員特點
-
1 成員變量
-
只能是常量
-
默認修飾符:public static final
-
-
2 構造方法
-
沒有,因為接口主要是擴展功能的,而沒有具體存在
-
-
3 成員方法
-
只能是抽象方法
-
默認修飾符:public abstract
-
關于接口中的方法,jdk8和jdk9中有一些新特性,如下
-
接口的jdk8、9新增功能
-
默認方法(Java 8)
-
靜態方法(Java 8)
-
私有方法(Java 9)
jdk8默認方法
-
格式
public default 返回值類型 方法名(參數列表) { } -
作用
-
解決接口升級的問題
-
-
注意事項
-
1默認方法不是抽象方法,可以被繼承,可以被重寫,重寫的時候去掉default關鍵字
-
2public可以省略,default不能省略
-
3如果實現了多個接口,多個接口中存在相同的方法聲明,子類就必須對該方法進行重寫
-
接口代碼
-
接口Inter 有 抽象方法 jump, 默認方法drink, eat
實現類代碼
-
實現接口Inter 實現jump方法, 重寫drink方法
測試代碼
package com.heima.test4;public interface Jumping {public abstract void jump();public default void drink() {System.out.println("喝水");}public default void eat() {System.out.println("吃點啥");} }class Cat implements Jumping {@Overridepublic void jump() {System.out.println("貓跳了5米高");}@Overridepublic void drink() {System.out.println("喝豆漿");} }class Dog implements Jumping {@Overridepublic void jump() {System.out.println("狗跳了2米高");}@Overridepublic void drink() {System.out.println("喝可樂");} }public class Demo02 {public static void main(String[] args) {new Cat().drink();new Dog().drink();} }一個類可以實現多個接口(多個接口逗號分開)
多個實現的接口中有相同的抽象方法,實現類只實現一次就可以了
多個實現的接口中有相同的默認方法,實現類 必須重寫這個默認方法,否則報錯
接口代碼
-
兩個接口中 有相同的抽象方法 jump,還有相同的默認方法play
實現類(實現上面的兩個接口)
-
jump實現一次就好
-
play方法這時候必須實現,因為兩個接口中都有默認方法play
測試
public class Demo02 {public static void main(String[] args) {MyInterImpl a = new MyInterImpl();a.drink();a.jump();a.play();} }jdk8靜態方法
-
語法 public static void 方法名() {} public可以省略
-
靜態方法只能通過接口名調用,不能通過實現類名或者對象名調用
接口代碼
public interface Inter {//靜態方法eat }測試代碼
-
接口名字調用靜態方法
-
實現類名或者對象 不能調用
實現類寫同名方法的代碼
-
實現類也寫一個靜態方法eat,這個eat和接口中的無關,屬于A這個類
jdk9私有方法
-
接口中的私有方法 和類中的定義方式一樣,也是只能在接口內部使用
-
一般在接口內部,多個默認方法或者多個靜態方法,有很多共性的代碼時,就可以抽取出來放到私有方法中
類和接口有同樣的方法名
-
父類Fu和接口Inter1 有同樣的方法,子類優先使用繼承的父類的方法
接口代碼
-
有一個默認方法 eat
類代碼
-
也有一個方法eat
子類代碼 繼承了類Fu 同時也實現了接口Inter1
//子類 繼承了Fu 同時實現了接口Inter1 //父類Fu和接口Inter1 有同樣的方法eat,子類優先使用繼承的父類的eat class Zi extends Fu implements Inter1 {}測試
public class Test1 {public static void main(String[] args) {Zi z = new Zi();z.eat();//吃北京烤鴨} }接口和接口之間可以繼承,并且可以多繼承
-
當繼承的多個接口,有相同的默認方法時,子接口必須重寫這個方法,如下面案例中的method
接口InterA代碼和接口InterB代碼
public interface InterA {public abstract void showA();public default void method(){System.out.println("InterA...method方法");} }public interface InterB {public abstract void showB();public default void method(){System.out.println("InterB...method方法");} }接口InterC代碼
-
1 接口InterC繼承了接口InterA和InterB
-
2 繼承了showA和showB兩個抽象方法
-
3 因為InterA和InterB都有默認方法method,所以InterC必須重寫method方法
測試
-
類TestA實現接口InterC,必須實現showA和showB方法,同時可以使用InterC里的默認方法method
抽象類和接口區別
-
語法上
-
1實現 extends implements2構造 有構造 沒有
-
3抽象方法權限修飾 public protected 默認 public
-
4多繼承 繼承一個 實現多個
-
-
思想上
-
類抽象的是 屬性和方法 接口 抽象方法
-
飛機 鳥
-
直升機繼承飛機 肯定不能繼承鳥 和父類有一種 "是不是" 的關系
-
直升機和啄木鳥 都實現了接口FLY,有飛的功能,和接口有一種 "有沒有" 的關系
-
接口練習
超市管理系統”,設計三個類:收銀員(Cashier)、銷售員(Sales)、會計(Accountant)
-
1). 三類人員都需要有“工作(work)”,而且每個類必須要有自己的工作內容。
-
2). 收銀員(Cashier)、會計(Accountant)都要有“統計(count)”的功能,而且兩個類也必須要有自己統計的方式 請設計以上的類結構,并編寫測試類。
Worker類代碼
public abstract class Worker{public abstract void work(); }Finance類代碼 ?fa?n?ns 財政 金融
public interface Finance{void count(); }子類代碼
class Sales extends Worker{public void work(){System.out.println("銷售產品")} } class Cashier extends Worker implements Finance{@Overridepublic void work(){System.out.println("收銀")}@Overridepublic void count(){System.out.println("統計今日金額")} } class Accountant extends Worker implements Finance{@Overridepublic void work(){System.out.println("計算賬單")}@Overridepublic void count(){System.out.println("統計公司總金額")} }總結
以上是生活随笔為你收集整理的二、final和static关键字,接口和抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter Visibility W
- 下一篇: LabVIEW如何打开Acrobat P