java高級類_Java高級類特性(一)

權限類內同包不同包子類不同包非子類

private

×

×

×

default

×

×

protected

×

public

四、super關鍵字的使用

package com.test.java;

/*

* super可以用來修飾屬性、方法、構造器

* 1)當子類與父類中有同名的屬性時,可以通過"super.屬性"顯式的調用父類中聲明的屬性。用"this.屬性"調用子類中聲明的屬性

* 2)當子類重寫父類的方法以后,在子類中想再顯式的調用父類的被重寫的方法,需要用"super.方法來調用"

* 3)super修飾構造器:通過在子類中使用"super(形參列表)"來顯式的調用父類的構造器

* >在構造器內部,"super(形參列表)"必須要聲明在首行

* >在構造器內部,"this.(形參列表)"與"super(形參列表)"只能出現一個

* >當構造器中,不顯式的調用this()或者super()其中任何一個,默認調用的是父類的空參構造器

* 如果父類沒有聲明空參構造器,或者只聲明了帶參數的構造器(這時空參構造器自動作廢),在子類

* 中會報錯

* 建議:在設計一個類時,盡量提供一個空參構造器。

*/

public class Person {

public String name;

public Person() {//父類構造器

this.name = "Father";

System.out.println(this.name);

}

public void eat() {

System.out.println("父類吃飯");

}

}

class Student extends Person{

public String name;

public Student() {//子類構造器,經過main方法測試,調用子類構造器之前會自動調用父類構造器

//相當于這里有一個 Super();

this.name = "Son";

super.name = "SuperFather";//在子類中調用父類的

System.out.println(this.name+super.name);

}

public void eat() {

System.out.println("子類吃飯");

super.eat();//在子類中用super調用父類的重名方法,重寫(覆蓋)并不等于將父類的方法刪除掉。

}

}

五、子類對象實例化

class Creature{

public Creature(){

System.out.println("Creature無參數的構造器");

}

}

class Animal extends Creature{

public Animal(String name){

System.out.println("Animal帶一個參數的構造器,該動物的name為" + name);

}

public Animal(String name , int age){

this(name);

System.out.println("Animal帶兩個參數的構造器,其age為" + age);

}

}

public class Wolf extends Animal{

public Wolf(){

super("灰太狼", 3);

System.out.println("Wolf無參數的構造器");

}

public static void main(String[] args){

new Wolf();

} }

從創建Wolf對象開始,調用Wolf構造器,Wolf構造器調用父類Animal的兩個參數的構造器,兩個參數的構造器再調用一個參數的構造器,一個參數的構造器再調用父類Creature的構造器,Creature構造器調用Object類中的構造器,然后再逆向執行回來,最后一個被調用的構造器最先執行,依次向下執行構造器中的內容,像對象中的toString方法等就是再Object類中的某個方法,任何一個類調用構造器都會以最后一個Object類結束。

六、多態性

package com.xijian.java;

/*

* 多態的應用舉例

* 總結:通過向上轉型來引用父類方法(在子類未重寫方法的前提下),通過向下轉型來引用子類獨有的方法

* 向下轉型實際就是在棧空間聲明一個子類引用類型的變量指向棧空間的父類引用對象,通過父類引用對象進而指向堆空間,對對象進行操作。

* 訪問權限是由引用變量類型決定的。

*/

public class TestAnimal {

public static void main(String[] args) {

Animal a = new Dog();//可以擴大對象被調用的權限

Animal b = new Cat();//可以擴大對象被調用的權限

TestAnimal test = new TestAnimal();

test.func(a);

test.func(b);

}

public void func(Animal a) {

a.eat();

a.jump();

if(a instanceof Dog) {

Dog d = (Dog)a;//向下轉型,用新的引用類型去引用子類存在而父類不存在的方法

d.say();

}

if(a instanceof Cat) {

Cat c = (Cat)a;//向下轉型,用新的引用類型去引用子類存在而父類不存在的方法

c.say();

c.name = "1";

System.out.println(a.name);//通過測試可以看出,向下轉型使用新的引用類型可以對子類對象進行操作

}

}

}

class Animal{

String name;

int age;

public void eat() {

System.out.println("進食");

}

public void jump() {

System.out.println("jump");

}

}

class Dog extends Animal{

public void eat() {

System.out.println("狗進食");

}

public void jump() {

System.out.println("狗急跳墻");

}

public void say() {

System.out.println("狗叫");

}

}

class Cat extends Animal{

public void eat() {

System.out.println("貓進食");

}

public void jump() {

System.out.println("貓跳");

}

public void say() {

System.out.println("貓叫");

}

}

多態性:多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。

1)如果我們定義了一個指向子類的父類引用類型,那么它除了能夠引用父類的共性外,還可以使用子類強大的功能,這就是向上轉型。

父類名稱 引用對象名稱 = new 子類對象名稱();

指向子類的父類引用由于向上轉型了,它只能訪問父類中擁有的方法和屬性,而對于子類中存在而父類中不存在的方法,該引用是不能使用的,盡管是重載該方法。若子類重寫了父類中的某些方法,在調用該些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。()

2)如果在向上轉型之后想訪問子類中獨有的方法,需要向下轉型,向下轉型實際就是在棧空間聲明一個子類引用類型的變量指向棧空間的父類引用對象,通過父類引用對象進而指向堆空間,對對象進行操作。

子類名稱 新引用對象名稱 = (子類名稱)需轉型的對象名;

3)子類對象的多態性,并不適用于屬性!

在調用屬性的時候,只是看的是調用對象的引用類型,如果這個對象的引用類型是父類的,那么調父類的屬性,如果是個子類的引用類型,則調子類對應的屬性,并不存在多態性。

4)判斷對象屬于哪種類型的

if(obj instanceof class){}

其返回true情況如下

1.obj是class類的對象

2.obj是class類子類的對象

多態性在Java上有兩種體現

①方法的重載和重寫:同名方法可以通過形參列表的不同和子父類的繼承關系來同時顯示。

②對象的多態性:子類的對象可以賦給父類/父接口的引用。

七、所有的類的頂級類Object

package com.xijian.java;

public class Testequals {

public static void main(String[] args) {

//==

//1.基本數據類型:根據基本數據類型的值判斷是否相等。相等返回true,否則返回false

//注:兩端數據類型可以不同,在不同的情況下也可以返回true

int i = 12;

int j = 12;

System.out.println(i==j);//true

char c = 12;

System.out.println(i==c);//true

float f = 12.0F;

System.out.println(i==f);//true

int k = 65;

char a = 'A';

System.out.println(k==a);//true

//2.引用數據類型:比較引用類型變量的地址值是否相等。

Object obj1 = new Object();

Object obj2 = new Object();

Object obj3 = new Object();

obj3 = obj1;

System.out.println(obj1==obj2);//false

System.out.println(obj1==obj3);//true

//equals():①只能處理引用類型對象,并且比較的是兩個對象的地址值是否相等

System.out.println(obj1.equals(obj2));

System.out.println(obj1.equals(obj3));

//像String類 包裝類 File類 Date類重寫了Object類里的equals方法

//比較的是兩個對象中的具體內容是否相同

String str1 = new String("AA");

String str2 = new String("AA");

System.out.println(str1.equals(str2));//true

}

}

Object是Java中所有類的頂級類。

①在Java中,==表示等于,=表示賦值。

當==兩側比較的是基本數據類型時,由基本數據類型的值判斷二者是否相等,相等則返回true,不等在返回false。需要注意的是,兩側的基本數據類型即使類型不同,也會返回true,如:int i =65,char j=12;char a ='A';則i==j==a全部返回true。

當兩側是引用數據類型時,兩側比較的是引用變量的地址值,相等返回true,不等返回false。

②equals方法

equals方法只可以處理引用數據類型的變量,在object類中,equals方法仍然是比較兩個引用變量的地址值是否相同;所以要想用equals方法比較object類子類的實體內容,就必須要重寫object類的equals方法。

③String類在內存中的分析

翻看String類的源代碼我們可以知道:它是不可繼承的(final修飾類),線程安全的(?????),值不可變(兩個成員變量都有final修飾,指針可變),本質上是一個字符數組。

我們知道創建string類對象的時候,一般由三種方式:

使用關鍵字new,如:String s1 = new String(“myString”);

直接定義,如:String s1 = “myString”;

串聯生成,如:String s1 = “my” + “String”

第一種使用關鍵字new創建的String類對象時,編譯程序回先在字符串常量池中查看有沒有“myString”這個字符串,若有,則在堆中開辟一塊空間存放new出來的實例,指向常量池中的"myString",在棧中開辟一塊區域存放s1這個引用變量,指向堆中的new出來的實例;若沒有,則在常量池中創建一個"myString"字符串。

第二種方式直接定義過程:在程序編譯期,編譯程序先去字符串常量池檢查,是否存在“myString”,如果不存在,則在常量池中開辟一個內存空間存放“myString”;如果存在的話,則不用重新開辟空間。然后在棧中開辟一塊空間,命名為“s1”,存放的值為常量池中“myString”的內存地址

第三種,改變的不是字符串,而是相當于重新創建了一個新的字符串,重新有一個地址值。

相對于new出來的字符串來說,直接賦值的方式效率好,因為它只在字符串常量池開辟了一個內存空間,而new出來的相當于開辟了兩個內存空間,耗費內存。

④toString()方法的使用

當我們打印一個引用變量的對象時,默認會調用這個對象的toString方法。

如果對象所在的類沒有重寫Object中的toString方法,那么調用的就是Object中的toString方法,打印出全類名+@+首地址值。

八、包裝類

將8個基礎數據類型包裝成類之后,就可以調用類中的方法來處理這些數據了。

基本數據類型、包裝類、String類之間的轉換問題

原則:轉換成誰,去誰里邊找轉換方法或者構造器。

① 基本數據類型和包裝數據類型之間的轉換:JDK5.0之后加入了自動裝箱和拆箱的功能。

②基本/包裝數據類型和String數據類型之間的轉換

String-->包裝數據類型:Integer.parseInt(str)

包裝數據類型-->String:i+“ ”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android.對話框(AlertDialog/Toast/Snackbar)

1、資料: 1.1、Android提醒微技巧,你真的了解Dialog、Toast和Snackbar嗎? - CSDN博客.html(https://blog.csdn.net/guolin_blog/article/details/51336415) 1.2、Android界面設計之對話框——定制Toast、AlertDialog -…

第4次作業

轉載于:https://www.cnblogs.com/wzh2920330283/p/11027254.html

基于Docker搭建Percona XtraDB Cluster數據庫集群

本文實驗的環境參數 阿里云ECS Centos7.5Docker version 18.06.0-cepercona/percona-xtradb-cluster:5.7Percona XtraDB Cluster的鏡像下載地址:https://hub.docker.com/r/percona/percona-xtradb-cluster/ 怎么使用Docke和下載鏡像,請查看Docker的官方文…

java publickey_數字證書中讀取PublicKey

1. 讀取https簽發證書中的key1) 在下面的代碼中,是實現讀取證書字符串來讀取key的,CERTIFICATE 就是一個證書的字符串, 而方法cf.generateCertificate() 接受的是一個InputStream 流,當然這個地方也可以讀取一個文件 new FileInputSream("file path")即可!public Str…

UIViewController 小結

1 生命周期 init方法中view仍然是nil,此時,如果寫了self.view,直接調用loadView。看名字也知道,loadView在viewDidLoad之前。initWithNibName:bundle:,designated初始化方法2 代碼組織 init,只有需要傳一些…

多核學習方法介紹

通過上篇文章的學習,我們知道,相比于單個核函數,多核模型可以具有更高的靈活性。經過多個核函數映射后的高維空間是由多個特征空間組合而成的組合空間,而顯然組合空間可以組合各個子空間不同的特征映射能力,能夠將異構…

java注解類型_Java注解類型

本篇文章幫大家學習java注解類型,包含了Java注解類型使用方法、操作技巧、實例演示和注意事項,有一定的學習價值,大家可以用來參考。標記注解類型標記注解類型是沒有元素的注解類型,甚至沒有默認值。標記注解由注解處理工具使用。…

linux go環境安裝和基本項目結構

最近項目中要用到Go語言,所以簡單總結一下安裝和配置,Go這個語言本身就限定了很多規范,比如項目設置,編程風格等,開發中就不需要再因為各種規范問題糾結了,直接用官方規定的能避免很多坑,下面直…

運輸層

運輸層-TCP 簡介 通俗點來說,運輸層是連接底層和用戶層的,運輸層向它上面的應用層提供通信服務,它屬于通信部分的最高層,同時也是用戶功能的最低層。 運輸層重要功能是復用和分用。復用:發送方不同應用進程可以使用同一…

對AI"出錯"零容忍?美國加強AI推理解釋能力研究

隨著硅谷私企引領人工智能(AI)爆發式發展,美國國防部曾發布報告稱,將“立即采取行動”加速AI和自動化技術研發。據《麻省理工技術評論》雜志網站近日報道,美國國防高級研究計劃局(DARPA)已經著手…

java調用指定瀏覽器_Java調用瀏覽器打開網頁完整實例

本文實例講述了java調用瀏覽器打開網頁的方法。分享給大家供大家參考。具體實現方法如下:package com.yifang.demo;import java.io.file;public class openpagedemo {public static void main(string[] args) {try {//string url "http://www.baidu.com"…

[HDU517] 小奇的集合

題目鏈接 顯然有貪心每次選擇最大的兩個數來做。 于是暴力地把最大的兩個數調整到非負(暴力次數不超過1e5),接下來使用矩陣乘法即可。 \[ \begin{pmatrix} B\\S\\T \end{pmatrix} \begin{pmatrix} 1&1&0\\ 1&0&0\\ 1&1&…

phpStudy

很多朋友在學習php的過程中會看到phpstudy這個東西,那么phpstudy是做什么的呢?有什么用?接下來的這篇文章將個大家來詳細的介紹一下phpstudy的內容。 首先在百度百科上對于phpstudy的定義是一個PHP調試環境的程序集成包。 該程序包集成最新的…

殺入共享汽車市場的PonyCar,是下一個犧牲者還是引領者?

曾幾何時,汽車是財富、地位的象征,擁有一輛汽車就感覺自己處處高別人一等。但如今,汽車已然成為一件隨處可見的商品,甚至已經到車來車往、熙熙攘攘的地步。根據中商產業研究院發布的《2018-2023年中國汽車行業市場前景及投資機會研…

python圖片內容長度識別_Python實現識別圖片內容的方法分析

本文實例講述了Python實現識別圖片內容的方法。分享給大家供大家參考,具體如下:python識別圖片內容。這里我的環境為windows64位,python2.7.14需要用到PIL模塊和tesseract模塊。首先需要安裝pip包管理,安裝方法可參考附錄windows下…

AJAX工具

代碼如下 var AppAjax {baseUrl:AppConfig.apiUrl//【POST請求】,post:function(pUrl,pData,pSuccessFun){pUrl AppAjax.baseUrl pUrl;$.ajax({headers: {token: AppConfig.token},url:pUrl,type:POST,data:JSON.stringify(pData),//pData,//JSON.stringify(),contentType:&q…

厲害了!Intel第九代酷睿參數曝光

2019獨角獸企業重金招聘Python工程師標準>>> 導讀上周有消息稱,Intel第九代酷睿處理器最快于8月1日發布,共有三款主打產品,分別是i9-9900K、i7-9700K和i5-9600K。其中,i9-9900K設計為8核16線程,基礎主頻3.6…

java 連接kafka_設置多個kafka連接接收器

我正在研究從postgreSQL到HDFS的數據流 . 我在HDP 2.6沙箱上設置了融合環境 . 我對postgreSQL的jdbc源配置是namejdbc_1connector.classio.confluent.connect.jdbc.JdbcSourceConnectortasks.max1connection.urljdbc:postgresql://host:port/db?currentSchemaschema&useru…

Web應用性能分析工具—HAR文件

Web應用性能分析工具—HAR文件 來源 https://raynorli.com/2018/06/11/web-performance-analysis-har-file/ 客戶經常有的一個問題就是,我的網頁服務通過你的設備之后,訪問變慢了,這類直觀感受的故障很不好量化,而且基于Web應用的…

【mybatis】mybatis多表聯查,存在一對多關系的,實體中使用List作為字段接收查詢結果的寫法...

實體如下: IntegralGoods  積分商品 IntegralGoodsImg  積分商品圖片 ShelfLog    積分商品自動上架記錄 IntegralGoods :IntegralGoodsImg:ShelfLog   1:n:1 1:1的多表聯查或者m:n的多表聯查 很簡…