內部類
// 外部類
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;
}
}
小編每天會定期更新論文及視頻,希望大家多多關注與支持 每天晚上20:00會在騰訊課堂上分享免費往期乾貨QQ:561487941
閱讀更多 java高級面試 的文章