您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中如何使用關鍵字,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
使用在方法體中,用于:① 結束方法② 針對于返回值類型的方法,使用"return 數據"方法返回所要的數據。
return關鍵字后面不可以聲明執行語句。
在異常處理中try-catch-finally的結構中,如果try或catch中的結構中寫了return,但是finally中的結構仍會執行。
this理解為:當前對象 或 當前正在創建的對象,可以調用的結構:屬性、方法;構造器
在類的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前對象屬性或方法。但是,通常情況下,我們都擇省略"this."。特殊情況下,如果***方法的形參和類的屬性同名時***,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
在類的構造器中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前正在創建的對象屬性或方法。但是,通常情況下,我們都擇省略"this."。特殊情況下,如果***構造器的形參和類的屬性同名***時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
① 我們在類的構造器中,可以顯式的使用***"this(形參列表)"***方式,調用本類中指定的其他構造器
② 構造器中不能通過"this(形參列表)"方式調用自己
③ 如果一個類中有n個構造器,則最多有 n - 1構造器中使用了"this(形參列表)"
④ 規定:"this(形參列表)"必須聲明在當前構造器的首行
⑤ 構造器內部,最多只能聲明一個"this(形參列表)",用來調用其他的構造器
super 關鍵字可以理解為:父類的,可以用來調用的結構:屬性、方法、構造器
尤其當子父類出現同名成員時,可以用supe表明調用的是父類中的成員
super的追溯不僅限于直接父類
super和this的用法相像,this代表本類對象的引用, super代表父類的內存空間的標識
與this關鍵字使用方式相同,只不過調用的是父類的屬性
通過使用"super.屬性"或"super.方法"的方式,顯式的調用父類中聲明的屬性或方法。但是,通常情況下,我們習慣省略"super."
特殊情況
當子類和父類中定義了同名的屬性時,我們要想在子類中調用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調用的是父類中聲明的屬性。
當子類重寫了父類中的方法以后,我們想在子類的方法中調用父類中被重寫的方法時,則必須顯式的使用"super.方法"的方式,表明調用的是父類中被重寫的方法。
我們可以在子類的構造器中顯式的使用"super(形參列表)"的方式,調用父類中聲明的指定的構造器
"super(形參列表)"的使用,必須聲明在子類構造器的首行!
我們在類的構造器中,針對于"this(形參列表)"或"super(形參列表)"只能二選一,不能同時出現
在構造器的首行,沒顯式的聲明"this(形參列表)"或"super(形參列表)",則默認調用的是父類中空參的構造器:super()
在類的多個構造器中,至少一個類的構造器中使用了"super(形參列表)",調用父類中的構造器
區別點 | this | super |
---|---|---|
訪問屬性 | 訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續查找 | 直接訪問父類中的屬性 |
調用方法 | 訪問本類中的方法,如果本類沒有此方法則從父類中繼續查找 | 直接訪問父類中的方法 |
調用構造器 | 調用本類構造器,必須放在構造器的首行 | 調用父類構造器,必須放在子類構造器的首行 |
為了更好的實現項目中類的管理,提供包的概念
使用package聲明類或接口所屬的包,聲明在源文件的首行
包,屬于標識符,遵循標識符的命名規則、規范(xxxyyyzzz)、“見名知意”
每"."一次,就代表一層文件目錄。
MVC設計模式
java. lang--包含一些Java語言的核心類,如 String、Math、 integer、 System和Thread,提供常用功能
java. net--包含執行與網絡相關的操作的類和接口
java.io--包含能提供多種輸入/輸出功能的類
java util--包含一些實用工具類,如定義系統特性、接口的集合框架類、使用與日期日歷相關的函數。
java. text--包含了一些java格式化相關的類
java.sql--包含了java進行JDBC數據庫編程的相關類/接口
java. awt--包含了構成抽象窗口工具集 (abstract window toolkits)的多個類,這些類被用來構建和管理應用程序的圖形用戶界面GU)。 B/S C/S
在源文件中顯式的使用import結構導入指定包下的類、接口
聲明在包的聲明和類的聲明之間
如果需要導入多個結構,則并列寫出即可
可以使用"xxx.*"的方式,表示可以導入xxx包下的所結構
如果使用的類或接口是java.lang包下定義的,則可以省略import結構
如果使用的類或接口是本包下定義的,則可以省略import結構
如果在源文件中,使用了不同包下的同名的類,則必須至少一個類需要以全類名的方式顯示。
使用"xxx.*"方式表明可以調用xxx包下的所結構。但是如果使用的是xxx子包下的結構,則仍需要顯式導入
import static:導入指定類或接口中的靜態結構:屬性或方法。
主要用來修飾類的內部結構,如:屬性、方法、代碼塊、內部類
屬性是否使用static修飾,可分為:靜態屬性 vs 非靜態屬性(實例變量)
實例變量:我們創建了類的多個對象,每個對象都獨立的擁一套類中的非靜態屬性。當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改。
靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。當通過某一個對象修改靜態變量時,會導致其他對象調用此靜態變量時,是修改過了的。
static修飾屬性的其他說明:
靜態變量隨著類的加載而加載。可以通過"類.靜態變量"的方式進行調用
靜態變量的加載要早于對象的創建。
由于類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中。
類變量 | 實例變量 | |
---|---|---|
類 | yes | no |
對象 | yes | yes |
靜態屬性舉例:System.out; Math.PI;
靜態變量內存解析:
隨著類的加載而加載,可以通過"類.靜態方法"的方式進行調用
靜態方法中,只能調用靜態的方法或屬性
非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性
靜態方法 | 非靜態方法 | |
---|---|---|
類 | yes | no |
對象 | yes | yes |
使用的注意點:
在靜態的方法內,不能使用this關鍵字、super關鍵字
關于靜態屬性和靜態方法的使用,大家都從生命周期的角度去理解。
關于屬性:
屬性是可以被多個對象所共享的,不會隨著對象的不同而不同的。
類中的常量也常常聲明為static
關于方法:
操作靜態屬性的方法,通常設置為static的
工具類中的方法,習慣上聲明為static的。 比如:Math、Arrays、Collections
**使用舉例:**記錄創建的圓的個數
class Circle{ private double radius; private int id;//自動賦值 public Circle(){ id = init++; total++; } public Circle(double radius){ this(); // id = init++; // total++; this.radius = radius; } private static int total;//記錄創建的圓的個數 private static int init = 1001;//static聲明的屬性被所對象所共享 public double findArea(){ return 3.14 * radius * radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public int getId() { return id; } public static int getTotal() { return total; } }
設計模式是在大量的實踐中總結和理論化之后優的代碼結構、編程風格、以及解決問題的思考方式。
常用設計模式 --- 23種經典的設計模式 GOF
創建型模式,共5種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共7種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
所謂類的單例設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例。
代碼實現:
餓漢式1: class Bank{ //1.私化類的構造器 private Bank(){ } //2.內部創建類的對象 //4.要求此對象也必須聲明為靜態的 private static Bank instance = new Bank(); //3.提供公共的靜態的方法,返回類的對象 public static Bank getInstance(){ return instance; } } 餓漢式2:使用了靜態代碼塊 class Order{ //1.私化類的構造器 private Order(){ } //2.聲明當前類對象,沒初始化 //4.此對象也必須聲明為static的 private static Order instance = null; static{ instance = new Order(); } //3.聲明public、static的返回當前類對象的方法 public static Order getInstance(){ return instance; } } //懶漢式: class Order{ //1.私化類的構造器 private Order(){ } //2.聲明當前類對象,沒初始化 //4.此對象也必須聲明為static的 private static Order instance = null; //3.聲明public、static的返回當前類對象的方法 public static Order getInstance(){ if(instance == null){ instance = new Order(); } return instance; } }
兩種方式的對比:
餓漢式:上來就創建對象
壞處:對象加載時間過長。
好處:餓漢式是線程安全的
懶漢式:什么時候用什么時候造對象
好處:延遲對象的創建。
目前的寫法壞處:線程不安全。--->到多線程內容時,再修改
可以用來修飾:類、方法、變量
final 用來修飾一個類:此類不能被其他類所繼承。
比如:String類、System類、StringBuffer類
final 用來修飾方法:表明此方法不可以被重寫
比如:Object類中getClass();
final 用來修飾變量:此時的"變量"就稱為是一個常量
final修飾屬性:可以考慮賦值的位置:顯式初始化、代碼塊中初始化、構造器中初始化
final修飾局部變量:尤其是使用final修飾形參時,表明此形參是一個常量。當我們調用此方法時,給常量形參賦一個實參。一旦賦值以后,就只能在方法體內使用此形參,但不能進行重新賦值。
static final 用來修飾屬性:全局常量
abstract: 抽象的,可以用來修飾:類、方法
此類不能實例化
抽象類中一定有構造器,便于子類實例化時調用(涉及:子類對象實例化的全過程)
開發中,都會提供抽象類的子類,讓子類對象實例化,完成相關的操作 --->抽象的使用前提:繼承性
抽象方法只方法的聲明,沒方法體
包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象方法的。
若子類重寫了父類中的所的抽象方法后,此子類方可實例化
若子類沒重寫父類中的所的抽象方法,則此子類也是一個抽象類,需要使用abstract修飾
注意點:
abstract不能用來修飾:屬性、構造器等結構
abstract不能用來修飾私有方法、靜態方法(靜態方法不能被重寫,抽象方法不能調用)、final的方法、final的類
abstract的應用舉例:
舉例一
public abstract class Vehicle{//抽象類 public abstract double calcFuelEfficiency();//計算燃料效率的抽象方法 public abstract double calcTripDistance();//計算行駛距離的抽象方法 } public class Truck extends Vehiclel{ public double calcFuelEfficiency( ){//寫出計算卡車的燃料效率的具體方法} public double calcTripDistance( ){//寫出計算卡車行駛距離的具體方法} } public class River Barge extends Vehicle{ public double calcFuelEfficiency( ){//寫出計算駁船的燃料效率的具體方法} public double calcTripDistance( ){//寫出計算駁船行駛距離的具體方法} }
舉例二
abstract class GeometricObject{//抽象類 public abstract double findArea(); } class Circle extends GeometricObject{ private double radius; public double findArea(){ return 3.14 * radius * radius; }; }
舉例三:
IO流中設計到的抽象類:InputStream/OutputStream / Reader /Writer。在其內部定義了抽象的read()、write()方法。
在軟件開發中實現一個算法時,整體步驟很固定、通用,這些步驟已經在父類中寫好了。但是某些部分易變,易變 部分可以抽象出來,供不同子類實現。這就是一種模板模式。
abstract class Template{ //計算某段代碼執行所需要花費的時間 public void spendTime(){ long start = System.currentTimeMillis(); this.code();//不確定的部分、易變的部分 long end = System.currentTimeMillis(); System.out.println("花費的時間為:" + (end - start)); } public abstract void code(); } class SubTemplate extends Template{ @Override public void code() { for(int i = 2;i <= 1000;i++){ boolean isFlag = true; for(int j = 2;j <= Math.sqrt(i);j++){ if(i % j == 0){ isFlag = false; break; } } if(isFlag){ System.out.println(i); } } } }
模板方法設計模式是編程中經常用得到的模式。各個框架、類庫中都有他的影子,比如常見的有:
數據庫訪問的封裝
Junt單元測試
JavaWeb的 Servlet中關于 doGet/doPost方法調用
Hibernate中模板程序
Spring中 JDBCTemlate、 Hibernate Template等
接口使用interface來定義
Java中,接口和類是并列的兩個結構
如何定義接口:定義接口中的成員
接口中不能定義構造器的!意味著接口不可以實例化
Java開發中,接口通過讓類去實現(implements)的方式來使用.
如果實現類覆蓋了接口中的所抽象方法,則此實現類就可以實例化
如果實現類沒覆蓋接口中所的抽象方法,則此實現類仍為一個抽象類
Java類可以實現多個接口 --->彌補了Java單繼承性的局限性
格式:class AA extends BB implements CC,DD,EE
接口與接口之間可以繼承,而且可以多繼承
接口的具體使用,體現多態性
接口,實際上可以看做是一種規范
使用舉例:不同的設備通過USB口接入電腦
class Computer{ public void transferData(USB usb){//USB usb = new Flash(); usb.start(); System.out.println("具體傳輸數據的細節"); usb.stop(); } } interface USB{ //常量:定義了長、寬、最大最小的傳輸速度等 void start(); void stop(); } class Flash implements USB{ @Override public void start() { System.out.println("U盤開啟工作"); } @Override public void stop() { System.out.println("U盤結束工作"); } } class Printer implements USB{ @Override public void start() { System.out.println("打印機開啟工作"); } @Override public void stop() { System.out.println("打印機結束工作"); } }
使用總結
接口使用上也滿足多態性
接口,實際上就是定義了一種規范
開發中,體會面向接口編程!
面向接口編程:我們在應用程序中,調用的結構都是JDBC中定義的接口,不會出現具體某一個 數據庫廠商的API。
JDK7及以前:只能定義全局常量和抽象方法
全局常量:public static final的,書寫時可以省略不寫
抽象方法:public abstract的
JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態方法、默認方法
Java8中,可以為接口添加靜態方法和默認方法。從技術角度來說,這是完全合法的,只是它看起來違反了接口作為一個抽象定義的理念。
靜態方法:使用 static關鍵字修飾。
可以通過接口直接調用靜態方法,并執行其方法體。我們經常在相互一起使用的類中使用靜態方法。你可以在標準庫中找到像 Collection/co| ections或者Path/ Paths這樣成對的接口和類。
默認方法:默認方法使用 default關鍵字修飾。
可以通過實現類對象來調用。我們在已有的接口中提供新方法的同時,還保持了與舊版本代碼的兼容性比如:java8API中對 Collection、List、 Comparator等接口提供了豐富的默認方法。
JDK 8后接口使用總結
知識點1:接口中定義的靜態方法,只能通過接口來調用。
知識點2:通過實現類的對象,可以調用接口中的默認方法。
如果實現類重寫了接口中的默認方法,調用時,仍然調用的是重寫以后的方法
知識點3:如果子類(或實現類)繼承的父類和實現的接口中聲明了同名同參數的默認方法,那么子類在沒重寫此方法的情況下,默認調用的是父類中的同名同參數的方法。-->類優先原則
知識點4:如果實現類實現了多個接口,而這多個接口中定義了同名同參數的默認方法,
那么在實現類沒重寫此方法的情況下,報錯。-->接口沖突。
這就需要我們必須在實現類中重寫此方法
知識點5:如何在子類(或實現類)的方法中調用父類、接口中被重寫的方法
public void myMethod(){ method3();//調用自己定義的重寫的方法 super.method3();//調用的是父類中聲明的 //調用接口中的默認方法 CompareA.super.method3(); CompareB.super.method3(); }
抽象類和接口的異同? 相同點:都不能實例化;都可以被繼承;都可以包含抽象方法的。
不同點:
抽象類:有構造器。接口:沒有構造器
1)把抽象類和接口(java7,java8,java9)的定義、內部結構解釋說明
2)類:單繼承性 接口:多繼承
類與接口:多實現
代理模式是Java開發中使用較多的一種設計模式。代理設計就是為其他對象提供一種代理以控制對這個對象的訪問。
代碼示例
interface NetWork{ public void browse(); } //被代理類 class Server implements NetWork{ @Override public void browse() { System.out.println("真實的服務器訪問網絡"); } } //代理類 class ProxyServer implements NetWork{ private NetWork work; public ProxyServer(NetWork work){ this.work = work; } public void check(){ System.out.println("聯網之前的檢查工作"); } @Override public void browse() { check(); work.browse(); } }
安全代理:屏蔽對真實角色的直接訪問
遠程代理:通過代理類處理遠程方法調用(RM)
延遲加載:先加載輕量級的代理對象,真正需要再加載真實對象 比如你要開發一個大文檔查看軟件,大文檔中有大的圖片,有可能一個圖片有100MB,在打開文件時,不可能將所有的圖片都顯示出來,這樣就可以使用代理模式,當需要查看圖片時,用 proxy來進行大圖片的打開。
靜態代理(靜態定義代理類)
動態代理(動態生成代理類)JDK自帶的動態代理,需要反射等知識
解決的問題
實現了創建者與調用者的分離,即將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
具體模式:
簡單工廠模式:用來生產同一等級結構中的任意產品。(對于增加新的產品,需要修改已有代碼)
工廠方法模式:用來生產同一等級結構中的固定產品。(支持增加任意產品)
抽象工廠模式:用來生產不同產品族的全部產品。(對于增加新的產品,無能為力;支持增加產品族)
看完上述內容,你們對Java中如何使用關鍵字有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。