Java基础-学习笔记(十)——内部类(嵌套类)

1、内部类的含义

在一个类的内部再定义一个类,就叫做嵌套类。被嵌套的类(内部类)可以直接访问嵌套它的类(外部类)的成员函数和属性,哪怕是私有的。但是反过来就不行,外部的类不能直接访问内部类的成员。

也就是说:

1)内部类可以直接访问外部类的成员

2)外部类不可以直接访问内部类的成员,需要先创建内部类的对象,又该对象来调用内部类的成员和方法。

内部类的定义和普通类没什么区别,不过和外部类不一样的是,它可以被protected和private进行修饰

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         Inner in = new Inner();
 7         in.display();
 8     }
 9     class Inner
10     {
11         void display()
12         {
13             System.out.println("the out_i is "+out_i);
14         }
15     }
16 }
17 class TestOuter
18 {
19     public static void main(String [] args)
20     {
21         Outer obj=new Outer();
22         obj.test();
23     }
24 }
25 /*
26 F:java_example>java TestOuter
27 the out_i is 33*/
View Code

首先调用这个display()函数打印出out_i时,它首先会在display()函数中找是否有该变量,没有就到Inner类中去找,最后再到Outer类中找该变量

2、内部类的用途

内部类使程序代码更为紧凑,更具模块化。

当A类中的程序代码要用到B类的实例对象,而B类中的程序代码又要访问A类中的成员.将B类作为A的内部类,代码要容易编写很多。

如果我们把内部类Inner,直接拿到外面来,还是要实现这个功能,通过在Outer类中生成Inner对象来调用其display方法,输出outer类的成员变量out_i。代码如下所示:

class Outer
{
    int out_i=33;
    void test()
    {
        Inner in = new Inner(this);
        in.display();
    }
    
}
class Inner
    {
        
        Outer outer;
        public Inner(Outer outer)
        {
            this.outer=outer;
        }
        void display()
        {
            System.out.println("the out_i is "+outer.out_i);
        }
    }
class TestOuter
{
    public static void main(String [] args)
    {
        Outer obj=new Outer();
        obj.test();
    }
}
/*
F:java_example>java TestOuter
the out_i is 33*/
View Code

3、外部程序引用内部类

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         Inner in = new Inner();
 7         in.display();
 8     }
 9 public class Inner
10     {
11         int inner_i=3;
12         void display()
13         {
14             System.out.println("the out_i is "+out_i);
15         }
16     }
17 }
18 class TestOuter
19 {
20     public static void main(String [] args)
21     {
22         Outer obj=new Outer();
23         //obj.test();
24         Outer.Inner in = obj.new Inner();
25         System.out.println("the inner_i_i is "+in.inner_i);
26     }
27 }
28 /*
29 F:java_example>java TestOuter
30 the inner_i_i is 3*/
View Code

内部类声明为public,在外部可以创建其外部类Outer的实例对象,再通过外部类Outer的实例对象创建Inner类的实例对象,最后通过Inner类的实例对象来调用其成员。

4、内部类用static修饰

内部类用static修饰后,就相当于是外部类了,不再是内部类

5、内部类并非只能在类中定义,也可以在几个程序块的范围之类定义内部类。例如,在方法中,甚至在for循环体内部都可以嵌套

在方法中定义的内部类只能访问方法中的final类型的局部变量,因为局部变量的作用域只在这个方法内,我们在外部程序调用时,这个局部变量内存已经被收回,所以需要用final修饰,final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         final int x=2;
 7         class Inner
 8         {
 9             int inner_i=3;
10             void display()
11             {
12                 System.out.println("the out_i is "+out_i+" and x is "+x);
13             }
14         }
15         Inner in = new Inner();
16         in.display();
17     }
18 
19 }
20 class TestOuter
21 {
22     public static void main(String [] args)
23     {
24         Outer obj=new Outer();
25         obj.test();
26     }
27 }
28 /*
29 F:java_example>java TestOuter
30 the out_i is 33 and x is 2*/
View Code
原文地址:https://www.cnblogs.com/tiantianxiangshang33/p/4943941.html