摘要:可以直接用接口名訪問。其他類也稱為外部類。汽車外部類發動機內部類內部類的分類內部類分為成員內部類與局部內部類。我們定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符繼承與實現關系等。并且日常項目的分工也是以包作為邊界。
01final關鍵字概念
* A: 概述 繼承的出現提高了代碼的復用性,并方便開發。但隨之也有問題,有些類在描述完之后,不想被繼承, 或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之后, 就可以對其中的方法進行重寫,那怎么解決呢? 要解決上述的這些問題,需要使用到一個關鍵字final,final的意思為最終,不可變。 final是個修飾符,它可以用來修飾類,類的成員,以及局部變量。02final修飾類義
* A: final 修飾類 final修飾類不可以被繼承,但是可以繼承其他類。 * B: 案例 class Yy {} final class Fu extends Yy{} //可以繼承Yy類 class Zi extends Fu{} //不能繼承Fu類03final修飾方法
* A: final修飾方法 ? final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋后可以加final。 * B: 案例 class Fu { // final修飾的方法,不可以被覆蓋,但可以繼承使用 public final void method1(){} public void method2(){} } class Zi extends Fu { //重寫method2方法 public final void method2(){} }04final修飾局部變量
* A:修飾基本數據類型變量 ??final修飾的變量稱為常量,這些變量只能賦值一次 * B:案例1 final int i = 20; i = 30; //賦值報錯,final修飾的變量只能賦值一次 * C: 修飾引用數據類型 ? 引用類型的變量值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改 * D: 修飾引用數據類型 final Person p = new Person(); Person p2 = new Person(); p = p2; //final修飾的變量p,所記錄的地址值不能改變 p.name = "小明";//可以更改p對象中name屬性值 p不能為別的對象,而p對象中的name或age屬性值可更改。05final修飾成員變量
* A: 修飾成員變量 ? 修飾成員變量,需要在創建對象前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要為其賦值。) * B: 案例 class Demo { //直接賦值 final int m = 100; //final修飾的成員變量,需要在創建對象前賦值,否則報錯。 final int n; public Demo(){ //可以在創建對象時所調用的構造方法中,為變量n賦值 n = 2016; } }06static的概念
* A:概念 當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。 當在調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多余。 可是不創建對象,方法又調用不了,這時就會想,那么我們能不能不創建對象,就可以調用方法呢? 可以的,我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。
==============================第二節課開始====================================
07static修飾的對象特有數據* A:特點1: 被static修飾的成員變量屬于類,不屬于這個類的某個對象。 (也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改, 其他對象中的static成員變量值跟著改變,即多個對象共享同一個static成員變量) * B: 代碼演示 class Demo { public static int num = 100; } class Test { public static void main(String[] args) { Demo d1 = new Demo(); Demo d2 = new Demo(); d1.num = 200; System.out.println(d1.num); //結果為200 System.out.println(d2.num); //結果為200 } }08static的內存圖
* A: 略 參考day13_source 靜態的內存圖.jpg09static注意事項_靜態不能直接調用非靜態
* A: 注意事項? 被static修飾的成員可以并且建議通過類名直接訪問。 * B: 訪問靜態成員的格式: 類名.靜態成員變量名 類名.靜態成員方法名(參數) 對象名.靜態成員變量名 ------不建議使用該方式,會出現警告 對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告 * C: 代碼演示 class Demo { //靜態成員變量 public static int num = 100; //靜態方法 public static void method(){ System.out.println("靜態方法"); } } class Test { public static void main(String[] args) { System.out.println(Demo.num); Demo.method(); } }10static靜態的使用場景
* A: 使用場景 static可以修飾成員變量和成員方法。 什么時候使用static修飾成員變量? 加static修飾成員的時候,這個成員會被類的所有對象所共享。一般我們把共性數據定義為靜態的變量 什么時候使用static修飾成員方法? 靜態的方法只能訪問靜態的成員,如果靜態方法中引用到了靜態的其他成員,那么這個方法需要聲明為靜態的方法。11對象中的靜態調用
* A: 對象的靜態調用 在多態中,非靜態編譯看父類,運行看子類,父類沒有編譯失敗。 但多態中的靜態方法,編譯看父類,運行仍然看父類。因為靜態和對象沒有關系,屬于靜態綁定。 * B: 舉例 public class Test{ public static void main(String[] args){ Fu f = new Zi(); f.show(); //父類的引用和父類的方法綁定,和對象無關,不會在運行時動態的執行子類特有的方法。 } }12定義靜態常量
* A: 靜態常量 開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變量來完成定義。 此時變量名用全部大寫,多個單詞使用下劃線連接。 * B: 定義格式: public static final 數據類型 變量名 = 值; * C: 如下演示: class Company { public static final String COMPANY_NAME = "傳智播客"; public static void method(){ System.out.println("一個靜態方法"); } } 當我們想使用類的靜態成員時,不需要創建對象,直接使用類名來訪問即可。 System.out.println(Company.COMPANY_NAME); //打印傳智播客 Company.method(); // 調用一個靜態方法 * D: 注意: 接口中的每個成員變量都默認使用public static final修飾。 所有接口中的成員變量已是靜態常量,由于接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。 interface Inter { public static final int COUNT = 100; } 訪問接口中的靜態變量 Inter.COUNT
==============================第三節課開始====================================
13匿名對象* A:匿名對象的概述 * 匿名對象是指創建對象時,只有創建對象的語句,卻沒有把對象地址值賦值給某個變量。 * B:案例 public class Person{ public void eat(){ System.out.println(); } } 創建一個普通對象 Person p = new Person(); 創建一個匿名對象 new Person(); * C: 匿名對象的特點 a:創建匿名對象直接使用,沒有變量名。 new Person().eat() //eat方法被一個沒有名字的Person對象調用了。 b:匿名對象在沒有指定其引用變量時,只能使用一次。 new Person().eat(); 創建一個匿名對象,調用eat方法 new Person().eat(); 想再次調用eat方法,重新創建了一個匿名對象 c:匿名對象可以作為方法接收的參數、方法返回值使用 class Demo { public static Person getPerson(){ //普通方式 //Person p = new Person(); //return p; //匿名對象作為方法返回值 return new Person(); } public static void method(Person p){} } class Test { public static void main(String[] args) { //調用getPerson方法,得到一個Person對象 Person person = Demo.getPerson(); //調用method方法 Demo.method(person); //匿名對象作為方法接收的參數 Demo.method(new Person()); } }14內部類
* A: 內部類的概述 將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。 其他類也稱為外部類。 * B: 什么時候使用內部類 在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含這發動機, 這時發動機就可以使用內部類來描述。 class 汽車 { //外部類 class 發動機 { //內部類 } } * C: 內部類的分類 內部類分為成員內部類與局部內部類。 我們定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實現關系等。 在內部類中可以直接訪問外部類的所有成員。15成員內部類的調用格式
* A: 格式 成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問 * B: 定義格式 class 外部類 { 修飾符 class 內部類 { //其他代碼 } } * C: 訪問方式 外部類名.內部類名 變量名 = new 外部類名().new 內部類名(); * D: 成員內部類代碼演示 class Body {//外部類,身體 private boolean life= true; //生命狀態 public class Heart { //內部類,心臟 public void jump() { System.out.println("心臟噗通噗通的跳") System.out.println("生命狀態" + life); //訪問外部類成員變量 } } } 訪問內部類 public static void main(String[] args) { //創建內部類對象 Body.Heart bh = new Body().new Heart(); //調用內部類中的方法 bh.jump(); }16成員內部類的同名變量調用
* A: 代碼實現 public class Outer { int i = 1; class Inner { int i = 2; public void inner(){ int i = 3; System.out.println(Outer.this.i); } } }17局部內部類
* A 局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量相似,可通過調用方法進行訪問. * B 定義格式 class 外部類 { 修飾符 返回值類型 方法名(參數) { class 內部類 { //其他代碼 } } } * C 訪問方式 在外部類方法中,創建內部類對象,進行訪問 * D 局部內部類代碼演示 定義類 class Party {//外部類,聚會 public void puffBall(){// 吹氣球方法 class Ball {// 內部類,氣球 public void puff(){ System.out.println("氣球膨脹了"); } } //創建內部類對象,調用puff方法 new Ball().puff(); } } 訪問內部類 public static void main(String[] args) { //創建外部類對象 Party p = new Party(); //調用外部類中的puffBall方法 p.puffBall(); }
==============================第四節課開始====================================
18匿名內部類* A: 概述 內部類是為了應對更為復雜的類間關系。查看源代碼中會涉及到,而在日常業務中很難遇到,這里不做贅述。 最常用到的內部類就是匿名內部類,它是局部內部類的一種。 定義的匿名內部類有兩個含義: 臨時定義某一指定類型的子類 定義后即刻創建剛剛定義的這個子類的對象 * B: 本質 匿名內部類的本質是一個實現了接口或繼承了某個類的子類匿名對象. * C: 案例 public interface Smoking { public abstract void smoking(); } /* * 實現類,實現接口 重寫接口抽象方法,創建實現類對象 * class XXX implements Smoking{ * public void smoking(){ * * } * } * XXX x = new XXX(); * x.smoking(); * Smoking s = new XXX(); * s.smoking(); * * 匿名內部類,簡化問題: 定義實現類,重寫方法,建立實現類對象,合為一步完成 */ 測試類: public class Test { public static void main(String[] args) { //使用匿名內部類 /* * 定義實現類,重寫方法,創建實現類對象,一步搞定 * 格式: * new 接口或者父類(){ * 重寫抽象方法 * }; * 從 new開始,到分號結束 * 創建了接口的實現類的對象 */ new Smoking(){ public void smoking(){ System.out.println("人在吸煙"); } }.smoking(); } }19匿名內部類_2
* A: 匿名內部類案例演示 public abstract class Animal { public abstract void eat(); public abstract void sleep(); } 測試代碼 /* * new Animal(){ public void eat(){ System.out.println("在吃飯"); } public void sleep(){ System.out.println("在睡覺"); } }; 以上代碼,就是Animal的子類的對象 多態性, 父類引用 = 子類的對象 */ public class Test2 { public static void main(String[] args) { Animal a= new Animal(){ public void eat(){ System.out.println("在吃飯"); } public void sleep(){ System.out.println("在睡覺"); } }; a.eat(); a.sleep(); } }20包的概念
* A: 概念 java的包,其實就是我們電腦系統中的文件夾,包里存放的是類文件。 當類文件很多的時候,通常我們會采用多個包進行存放管理他們,這種方式稱為分包管理。 在項目中,我們將相同功能的類放到一個包中,方便管理。并且日常項目的分工也是以包作為邊界。 類中聲明的包必須與實際class文件所在的文件夾情況相一致,即類聲明在a包下,則生成的.class文件必須在a文件夾下,否則,程序運行時會找不到類。 * B 聲明格式 通常使用公司網址反寫,可以有多層包,包名采用全部小寫字母,多層包之間用”.”連接 類中包的聲明格式: package 包名.包名.包名…; 如:黑馬程序員網址itheima.com那么網址反寫就為com.itheima 傳智播客 itcast.cn 那么網址反寫就為 cn.itcast 注意:聲明包的語句,必須寫在程序有效代碼的第一行(注釋不算) 代碼演示: package cn.itcast; //包的聲明,必須在有效代碼的第一行 import java.util.Scanner; import java.util.Random; public class Demo {} * C: 包的訪問 在訪問類時,為了能夠找到該類,必須使用含有包名的類全名(包名.類名)。 包名.包名….類名 如: java.util.Scanner java.util.Random cn.itcast.Demo 帶有包的類,創建對象格式:包名.類名 變量名 = new包名.類名(); cn.itcast.Demo d = new cn.itcast.Demo(); 前提:包的訪問與訪問權限密切相關,這里以一般情況來說,即類用public修飾的情況。 類的簡化訪問 當我們要使用一個類時,這個類與當前程序在同一個包中(即同一個文件夾中),或者這個類是java.lang包中的類時通常可以省略掉包名,直接使用該類。 如:cn.itcast包中有兩個類,PersonTest類,與Person類。我們在PersonTest類中,訪問Person類時,由于是同一個包下,訪問時可以省略包名,即直接通過類名訪問 Person。 類名 變量名 = new類名(); Person p = new Person(); 當我們要使用的類,與當前程序不在同一個包中(即不同文件夾中),要訪問的類必須用public修飾才可訪問。 package cn.itcst02; public class Person {}22導入包
* A:導入包 我們每次使用類時,都需要寫很長的包名。很麻煩,我們可以通過import導包的方式來簡化。 可以通過導包的方式使用該類,可以避免使用全類名編寫(即,包類.類名)。 導包的格式: import 包名.類名; 當程序導入指定的包后,使用類時,就可以簡化了。演示如下 //導入包前的方式 //創建對象 java.util.Random r1 = new java.util.Random(); java.util.Random r2 = new java.util.Random(); java.util.Scanner sc1 = new java.util.Scanner(System.in); java.util.Scanner sc2 = new java.util.Scanner(System.in); //導入包后的方式 import java.util.Random; import java.util.Scanner; //創建對象 Random r1 = new Random(); Random r2 = new Random(); Scanner sc1 = new Scanner(System.in); Scanner sc2 = new Scanner(System.in); import導包代碼書寫的位置:在聲明包package后,定義所有類class前,使用導包import包名.包名.類名;23權限修飾符
* A 權限修飾符有哪些 在Java中提供了四種訪問權限,使用不同的訪問權限時,被修飾的內容會有不同的訪問權限, 以下表來說明不同權限的訪問能力: public protected default private 同一類中 √ √ √ √ 同一包中(子類與無關類) √ √ √ 不同包的子類 √ √ 不同包中的無關類 √ * B: 小結 歸納一下:在日常開發過程中,編寫的類、方法、成員變量的訪問 要想僅能在本類中訪問使用private修飾; 要想本包中的類都可以訪問不加修飾符即可; 要想本包中的類與其他包中的子類可以訪問使用protected修飾 要想所有包中的所有類都可以訪問使用public修飾。 注意:如果類用public修飾,則類名必須與文件名相同。一個文件中只能有一個public修飾的類。24代碼塊
* A: 概述: 程序中用大括號括起來的代碼叫代碼塊 * B: 分類 局部代碼塊 構造代碼塊 靜態代碼塊 同步代碼塊 * C 局部代碼塊: 局部代碼塊是定義在方法或語句中 特點: 以”{}”劃定的代碼區域,此時只需要關注作用域的不同即可 方法和類都是以代碼塊的方式劃定邊界的 class Demo{ public static void main(String[] args) { { int x = 1; System.out.println("普通代碼塊" + x); } int x = 99; System.out.println("代碼塊之外" + x); } } 結果: 普通代碼塊1 代碼塊之外99 局部代碼塊作用:可以限定變量的聲明周期. * D: 構造代碼塊 構造代碼塊是定義在類中成員位置的代碼塊 特點: 優先于構造方法執行,構造代碼塊用于執行所有對象均需要的初始化動作 每創建一個對象均會執行一次構造代碼塊。 public class Person { private String name; private int age; //構造代碼塊 { System.out.println("構造代碼塊執行了"); } Person(){ System.out.println("Person無參數的構造函數執行"); } Person(int age){ this.age = age; System.out.println("Person(age)參數的構造函數執行"); } } class PersonDemo{ public static void main(String[] args) { Person p = new Person(); Person p1 = new Person(23); } } * E: 靜態代碼塊 靜態代碼塊是定義在成員位置,使用static修飾的代碼塊。 特點: 它優先于主方法執行、優先于構造代碼塊執行,當以任意形式第一次使用到該類時執行。 該類不管創建多少對象,靜態代碼塊只執行一次。 可用于給靜態變量賦值,用來給類進行初始化。 public class Person { private String name; private int age; //靜態代碼塊 static{ System.out.println("靜態代碼塊執行了"); } } * F: 同步代碼塊(多線程學習)25總結
* 把今天的知識點總結一遍。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67171.html
摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面對對象設計其實就是在管理和維護對象之間的關系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向對象思想,類與對象及其使用,對象的內存圖,成...
摘要:外部類要訪問內部類的成員,必須創建對象。前提存在一個類或者接口這里的類可以是具體類也可以是抽象類。 1.package關鍵字的概述及作用(了解) A:為什么要有包 將字節碼(.class)進行分類存放 包其實就是文件夾 B:包的概述 舉例: 學生:增加,刪除,修改,查詢 老師:增加,刪除,修改,查詢 ... 方案1:按照功能分 com.heima.add ...
摘要:構造器沒有返回值一個對象變量并沒有實際包含一個對象,而僅僅引用一個對象,如有兩個部分。子類重寫方法的返回值范圍必須小于等于父類方法的返回值。枚舉類型中可以添加一些構造器方法和域。 第三章 Java是一種強類型語言。 https://blog.csdn.net/qq_3619... 在Java中,整型的范圍與機器無關。 int 4字節 short 2字節 long ...
摘要:在那里,可以理解為指針。局部變量不能夠被訪問控制符及修飾都可以被修飾變量的傳遞與語言相似調用對象方法時要傳遞參數。內部類內部類是所在類的成員。大體上相當于其他語言的匿名函數或函數指針。 1. 變量及其傳遞 基本類型變量(primitive type)和引用類型變量(reference type) 基本類型(primitive type):其值直接存于變量中。在這里 引用型(refer...
摘要:即使抽象類里不包含抽象方法,這個抽象類也不能創建實例抽象類可以包含成員變量方法普通方法和抽象方法構造器初始化塊內部類接口枚舉種成分。 抽象類 當編寫一個類時,常常會為該類定義一些方法,這些方法用以描述該類的行為方式,那么這些方法都有具體的方法體。但在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確地知道這些子類如何實現這些方法。使用抽象方法即可滿足該要求:抽象方法是只有...
閱讀 3197·2021-11-08 13:18
閱讀 1353·2021-10-09 09:57
閱讀 1182·2021-09-22 15:33
閱讀 3960·2021-08-17 10:12
閱讀 5053·2021-08-16 11:02
閱讀 2676·2019-08-30 10:56
閱讀 962·2019-08-29 18:31
閱讀 3251·2019-08-29 16:30