2020/7/8 JAVA總結之:匿名物件/內部類/包的宣告與訪問/訪問修飾符/程式碼塊
一、匿名物件
1、匿名物件的概念:
匿名物件是指建立物件時,只有建立物件的語句,卻沒有把物件地址值賦值給某個變數。
如:已經存在的類:
public class Person{ public void eat(){ System.out.println(); } } //建立一個普通物件 Person p = new Person(); //建立一個匿名物件 new Person();
2、匿名物件的特點:
//1.建立匿名物件直接使用,沒有變數名。 new Person().eat() //eat方法被一個沒有名字的Person物件呼叫了。//2.匿名物件在沒有指定其引用變數時,只能使用一次。 new Person().eat(); 建立一個匿名物件,呼叫eat方法 new Person().eat(); 想再次呼叫eat方法,重新建立了一個匿名物件 //3.匿名物件可以作為方法接收的引數、方法返回值使用 class Demo { public static Person getPerson(){ //普通方式 //Person p = new Person(); //return p; //匿名物件作為方法返回值 return newPerson(); } 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(newPerson()); } }
二、內部類
1、什麼是內部類:
將類寫在其他類的內部,可以寫在其他類的成員位置和區域性位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
2、內部類的分類:內部類分為成員內部類與區域性內部類。
成員內部類:成員內部類,定義在外部類中的成員位置。與類中的成員變數相似,可通過外部類物件進行訪問。
//定義格式 class 外部類 { 修飾符 class 內部類 { //其他程式碼 } } //訪問方式 外部類名.內部類名 變數名 = new 外部類名().new 內部類名();
區域性內部類:定義在外部類方法中的區域性位置。與訪問方法中的區域性變數相似,可通過呼叫方法進行訪問
//定義格式 class 外部類 { 修飾符 返回值型別 方法名(引數) { class 內部類 { //其他程式碼 } } } //訪問方式 在外部類方法中,建立內部類物件,進行訪問
3、匿名內部類
最常用到的內部類就是匿名內部類,它是區域性內部類的一種。
定義的匿名內部類有兩個含義:
臨時定義某一指定型別的子類
定義後即刻建立剛剛定義的這個子類的物件
定義匿名內部類的作用與格式:
作用:匿名內部類是建立某個型別子類物件的快捷方式。
//格式: new 父類或介面(){ //進行方法重寫 };
三、包的宣告與訪問
1、包的概念:
java的包,其實就是我們電腦系統中的資料夾,包裡存放的是類檔案。
當類檔案很多的時候,通常我們會採用多個包進行存放管理他們,這種方式稱為分包管理。
類中宣告的包必須與實際class檔案所在的資料夾情況相一致,即類宣告在a包下,則生成的.class檔案必須在a資料夾下,否則,程式執行時會找不到類。
2、包的宣告格式:
類中包的宣告格式:
package 包名.包名.包名…;
如:Oracle網址oracle.com那麼網址反寫就為com.oracle
注意:宣告包的語句,必須寫在程式有效程式碼的第一行(註釋不算)
程式碼演示:
package com.oracle; //包的宣告,必須在有效程式碼的第一行 import java.util.Scanner; import java.util.Random; public class Demo {}
3、包的訪問
在訪問類時,為了能夠找到該類,必須使用含有包名的類全名(包名.類名)。
包名.包名….類名 如: java.util.Scanner java.util.Random com.oracle.Demo 帶有包的類,建立物件格式:包名.類名 變數名 = new包名.類名(); com.oracle.Demo d = new com.oracle.Demo();
4、import導包
可以通過導包的方式使用該類,可以避免使用全類名編寫(即,包類.類名)。
導包的格式:import 包名.類名;
四、訪問修飾符
public |
protected |
default |
private |
|
同一類中 |
√ |
√ |
√ |
√ |
同一包中(子類與無關類) |
√ |
√ |
√ |
|
不同包的子類 |
√ |
√ |
||
不同包中的無關類 |
√ |
l要想僅能在本類中訪問使用private修飾;
l要想本包中的類都可以訪問不加修飾符即可;
l要想本包中的類與其他包中的子類可以訪問使用protected修飾
l要想所有包中的所有類都可以訪問使用public修飾。
l注意:如果類用public修飾,則類名必須與檔名相同。一個檔案中只能有一個public修飾的類。
五、程式碼塊
1、區域性程式碼塊:區域性程式碼塊是定義在方法或語句中
特點:
以”{}”劃定的程式碼區域,此時只需要關注作用域的不同即可
方法和類都是以程式碼塊的方式劃定邊界的
class Demo{ public static void main(String[] args) { { int x = 1; System.out.println("普通程式碼塊" + x); } int y = 99; System.out.println("程式碼塊之外" + y); } } /*結果: 普通程式碼塊1 程式碼塊之外99*/
2、構造程式碼塊:構造程式碼塊是定義在類中成員位置的程式碼塊
特點:
優先於構造方法執行,構造程式碼塊用於執行所有物件均需要的初始化動作
每建立一個物件均會執行一次構造程式碼塊。
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); } }
3、靜態程式碼塊:靜態程式碼塊是定義在成員位置,使用static修飾的程式碼塊。
特點:
它優先於主方法執行、優先於構造程式碼塊執行,當以任意形式第一次使用到該類時執行。
該類不管建立多少物件,靜態程式碼塊只執行一次。
可用於給靜態變數賦值,用來給類進行初始化。
public class Person { private String name; private int age; //靜態程式碼塊 static{ System.out.println("靜態程式碼塊執行了"); } }