內部類 內部類可以直接訪問外部類,但是外部類要訪問內部類中的成員變數,就必須要創建內部類的對象。 外部類如果不創建外部類對象,就不能直接創建內部了對象 內部類可訪問外部類,而且不破壞封裝 內部類的分類: 1. 靜態內部類 2. 局部內部類 3. 成員內部類 4. 匿名內部類 成員內部類: 在成員變數 ...
內部類
// 外部類
class Demo{
private int num = 3;
// 定義內部類
class Int{
void show(){
System.out.println("num="+num);
}
}
void method(){
Int int = new Int();
int.show();
}
}
class Inner{
public static void main(Stirng[] args){
Demo demo = new Demo();
demo.method();
}
}
內部類可以直接訪問外部類,但是外部類要訪問內部類中的成員變數,就必須要創建內部類的對象。
class Outer{
…
class Inner{
….
}
}
外部類如果不創建外部類對象,就不能直接創建內部了對象
內部類可訪問外部類,而且不破壞封裝
內部類的分類:
- 靜態內部類
- 局部內部類
- 成員內部類
- 匿名內部類
成員內部類:
在成員變數的位置上定義的類為成員內部類。如果要使用成員內部類就要使用外部類.內部類來訪問。
使用外部類的名字來訪問,是因為一個內部類可能有不同的外部類。要有一個內部類,必須要有外部類的對象,因為成員內部類要用外部類訪問。
成員內部類可以訪問外部類的所有屬性,成員內部類不能定義有靜態屬性。
靜態內部類:
在成員位置上用static修飾的內部類為靜態內部類。靜態內部類只能訪問外部類的靜態成員和本內部類的成員;且不能訪問外部類的非靜態成員。
局部內部類:
局部,在一個方法中內的類,為局部內部類,局部內部類不能用訪問修飾符,作用域在定義的它的區域內。
局部內部類可以訪問外部類的成員屬性和靜態屬性,也可以訪問final修飾的局部變數,但不能訪問非final的局部變數。
匿名內部類:
是一種特殊的局部內部類。
訪問外部類中的內部類,非靜態
Outer.Inner int = new Outer().new Innter();
對靜態內部類中的非靜態成員
Outer.Inner int = new Outer().new Innter();
非靜態內部類中不允許定義靜態成員,內部類被靜態修飾後,隨著外部類的載入而載入。
內部類
內部類:
在類Out
的內部中定義一個類為Int
,此時的Int
類為內部類,Out
則為外部類。內部類可被修飾為public
或private
,當對其訪問的限制和成員變數和方法相同。
內部類格式:
標識符 class 外部類的名稱 {
// 外部類的成員
標識符 class 內部類的名稱{
//內部類的成員
}
}
實例:
class Student{
int score = 100;
void add(){
Shu shu = new Shu();
shu.show();
}
class Shu{
void show(){
System.out.println("成績"+score);
}
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
stu.add();
}
}
用static
聲明的內部類,則內部類變成外部類,用static
聲明的內部類不能訪問非static
的外部類屬性,外部類的屬性要用static
才能訪問。
內部類用static
修飾的,無法訪問外部類的非static
類型的屬性。
// 下方代碼出錯
class Student{
int score = 100;
void add(){
Shu shu = new Shu();
shu.show();
}
static class Shu{
void show(){
System.out.println("成績"+score);
}
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
stu.add();
}
}
在類外部引用內部類
class Student{
int score = 100;
void add(){
Shu shu = new Shu();
shu.show();
}
public class Shu{
void show(){
System.out.println("成績"+score);
}
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
Student.Stu inner = stu.new Shu();
// Stuent.Stu inner = new Student().new Shu();
inner.show();
}
}
在方法中定義內部類
class Student{
int score = 100;
void add(){
class Shu{
void show(){
System.out.println("成績"+score);
}
}
Shu shu = new Shu();
shu.show();
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
stu.add();
}
}
final類型的局部變數
在內部類中的final
類型的局部變數,可以被訪問,用final
修飾的相當於一個常量,可以訪問。
// 錯誤
class Student{
int score = 100;
void add(final int s){
int t = 20;
class Shu{
void show(){
System.out.println("成績"+score+s+t);
}
}
Shu shu = new Shu();
shu.show();
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
stu.add();
}
}
改:final int t = 20;
class Student{
int score = 100;
void add(final int s){
final int t = 20;
class Shu{
void show(){
System.out.println("成績"+score+s+t);
}
}
Shu shu = new Shu();
shu.show();
}
}
// 測試
public class Demo{
public static void main(String[] args){
Student stu = new Student();
stu.add();
}
}
內部類
內部類可以使用外部類所有的方法和變數,就算被私有化也一樣可以,如:
class Outer{
private int x;
// 創建內部類的實例
Inner inner = new Inner();
public void do(){
// 調用內部類的方法
inner.go();
}
// 內部類
class Inner{
void go(){
x = 30;
}
}
}
結語
- 本文主要講解 Java基礎-內部類
- 下麵我將繼續對
Java
、Android
中的其他知識 深入講解 ,有興趣可以繼續關註 - 小禮物走一走 or 點贊