日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二、final和static关键字,接口和抽象类

發布時間:2023/12/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二、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方法里只能調用靜態的成員

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("吃肉夾饃");//System.out.println(this.name);//靜態方法里沒有this//System.out.println(name);//靜態方法里不能調用成員 變量System.out.println(country);}public void drink() {System.out.println("喝豆漿");System.out.println(this.name);//可以調用成員變量 System.out.println(country);//可以調用靜態變量 } }

子類可以繼承父類中的靜態成員

  • 注意不能夠重寫靜態方法,如果寫了一樣的靜態方法,只是把父類靜態方法隱藏了,并不是重寫(可以用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代碼

public interface Inter1 {//寫一個抽象方法public abstract void eat() }
  • 實現類 Inter1Impl 實現了接口Inter1,也實現了方法eat

public class Inter1Impl implements Inter1{@Overridepublic void eat() {} }
  • 測試

public class Demo01 {public static void main(String[] args) {//接口不能創建對象//Inter1 i1 = new Inter1();//用接口的實現類 創建對象Inter1Impl i1 = new Inter1Impl();i1.eat();} }

接口的成員特點

  • 1 成員變量

    • 只能是常量

    • 默認修飾符:public static final

public class Demo01 {public static void main(String[] args) {//用接口直接調用System.out.println(Inter1.age);//Inter1.age = 20; //不可以修改} }interface Inter1 {public static final int age = 10;double PI = 3.1415;//默認有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

public interface Inter1 {void eat();void jump();public default void play() {System.out.println("打王者");} }public interface Inter2 {void drink();void jump();public default void play() {System.out.println("去吃雞");} }

實現類(實現上面的兩個接口)

  • jump實現一次就好

  • play方法這時候必須實現,因為兩個接口中都有默認方法play

class MyInterImpl implements Inter1, Inter2 {@Overridepublic void eat() {System.out.println("chichichci");}@Overridepublic void drink() {System.out.println("heheheheheh");}@Overridepublic void jump() {System.out.println("跳 啊跳");}@Overridepublic void play() {System.out.println("好好學習");} }

測試

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 }

測試代碼

  • 接口名字調用靜態方法

  • 實現類名或者對象 不能調用

public class Demo02 {public static void main(String[] args) {Inter.eat();//A.eat(); 實現類無法調用//new A().eat();實現類的對象也不能 調用} }class A implements Inter {}interface Inter {//靜態方法eat 默認是public的static void eat() {System.out.println("吃");} }

實現類寫同名方法的代碼

  • 實現類也寫一個靜態方法eat,這個eat和接口中的無關,屬于A這個類

public class Demo02 {public static void main(String[] args) {Inter.eat();A.eat();} }class A implements Inter {static void eat() {System.out.println("吃");} }interface Inter {//靜態方法eat 默認是public的static void eat() {System.out.println("吃");} }

jdk9私有方法

  • 接口中的私有方法 和類中的定義方式一樣,也是只能在接口內部使用

  • 一般在接口內部,多個默認方法或者多個靜態方法,有很多共性的代碼時,就可以抽取出來放到私有方法中

package com.heima.test6;public class Demo01 {public static void main(String[] args) {MyInterImpl myInter = new MyInterImpl();myInter.play1();myInter.play2();myInter.play3();} }class MyInterImpl implements Inter1 {}interface Inter1 {private void playall() {System.out.println("打王者");System.out.println("吃雞");System.out.println("打cf");}public default void play1() {playall();System.out.println("睡覺");System.out.println("出去浪");}public default void play2() {playall();System.out.println("出去浪");System.out.println("睡覺");}public default void play3() {playall();System.out.println("出去睡覺");System.out.println("回來浪");}//接口中定義的私有靜態方法private static void check() {System.out.println("權限校驗 ( 模擬 )");}public static void open() {check();System.out.println("open方法執行了");}public static void close() {check();System.out.println("close方法執行了");} }

類和接口有同樣的方法名

  • 父類Fu和接口Inter1 有同樣的方法,子類優先使用繼承的父類的方法

接口代碼

  • 有一個默認方法 eat

public interface Inter1 {public default void eat() {System.out.println("吃周黑鴨");} }

類代碼

  • 也有一個方法eat

class Fu {public void eat() {System.out.println("吃北京烤鴨");} }

子類代碼 繼承了類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方法

interface InterC extends InterA, InterB {@Overridedefault void method() {System.out.println("interc...method");} }

測試

  • 類TestA實現接口InterC,必須實現showA和showB方法,同時可以使用InterC里的默認方法method

public class TestInterface {public static void main(String[] args) {TestA a = new TestA();a.showA();a.showB();a.method();} }class TestA implements InterC {@Overridepublic void showA() {System.out.println("showAshowAshowAshowA");}@Overridepublic void showB() {System.out.println("showBshowBshowBshowBshowB");} }

抽象類和接口區別

  • 語法上

    • 1實現 extends implements2構造 有構造 沒有

    • 3抽象方法權限修飾 public protected 默認 public

    • 4多繼承 繼承一個 實現多個

  • 思想上

    • 類抽象的是 屬性和方法 接口 抽象方法

    • 飛機 鳥

    • 直升機繼承飛機 肯定不能繼承鳥 和父類有一種 "是不是" 的關系

    • 直升機和啄木鳥 都實現了接口FLY,有飛的功能,和接口有一種 "有沒有" 的關系

interface FLY{void fly(); }interface Sport{void jump();void run(); }abstract class airplane{String color;int length; } class Zhishengji extends airplane implements FLY{}abstract class bird{String color;String type;void eat(); } class Zhuomnuniao extends bird implements FLY,Sport{}

接口練習

超市管理系統”,設計三個類:收銀員(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关键字,接口和抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。