1.   内部类

(1)   什么叫内部类:在一个类的内部还存在一个类。如果在类Outer的内部在定义一个类Inner,此时类Inner就称为内部类,而类          Outer则称为外部类

(2)  内部类可以声明成public 或private。而当内部类声明成public 或private时,对其访问限制与成员变量和成员方法完全相同。

(3)  内部类的定义格式

标识符  class  外部类的名称{

//外部类成员
 标识符  class  内部类的名称{
 //内部类的成员
 }

}

2.以下的程序中,InnerDemo类作为Outer类的内部类存在,并且在外部类的fun()方法中直接实例化内部类的对象,并调用了print()方法。

代码如下:

public class Inner {
 public static void main(String[] args) {
 new Outer().fun();//调用外部类的fun()方法
 }
 }
 class Outer{//定义外部类
 private String info = "hello,nishui";//定义外部类的私有属性
 class InnerDemo{//定义内部类
 public void print(){//定义内部类的的方法
 System.out.println(info);//直接访问外部类的私有属性
 }
 }
 public void fun(){//外部类的方法
 new InnerDemo().print();//调用内部类的方法
 }
 }

运行结果:

hello,nishui

3.内部类存在的优点,缺点

(1) 缺点:正常的一个类操作时,在类中最好只定义属性或者方法,如果定义一个类的话,则肯定破坏了程序的一个结构。

(2) 优点:是可以方便的访问 外部类中的私有属性!

4.内部类是无法在外部直接调用的,是无法按照外部类的形式使用的。

笔者在前面说过static静态声明属性或者方法,这里同样使用static来声明内部类。

如果一个内部类使用static关键字声明的话,则此内部类就可以被称之为外部类!可以直接通过“外部类.内部类”进行访问。

举例:

public class Inner3 {
 public static void main(String[] args) {
 new Outer2.InnerDemo2().print();//调用外部类的fun()方法
 }
 }
class Outer2{//定义外部类 private static String info = "hello,nishui";//定义外部类的私有属性
 static class InnerDemo2{//使用static定义内部类为外部类
 public void print(){//定义内部类的的方法
 System.out.println(info);//直接访问外部类的私有属性
 }
 }
 public void fun(){//外部类的方法
 new InnerDemo2().print();//调用内部类的方法
 }
 }

总结:使用static可以声明一个内部类,声明的内部类就成为外部类,可以直接在类的外部调用,但是如果要想访问外部类中的属性,则此属性必须是static访问权限的。

5.  在外部访问内部类,不使用static

一个内部类除了可以通过外部类访问,也可以直接在其他类中调用,但是调用的格式为:

外部类.内部类   内部类对象  =    外部类实例.new   内部类();

举例:

public class Inner5 {
 public static void main(String[] args) {
 Outer11 out = new Outer11();//外部类的实例化
 Outer11.Inner11 in = out.new Inner11();
 in.print();
 }
 }
 class Outer11{//定义外部类
 private String info = "hello,nishui";//定义外部类的私有属性
 class Inner11{//定义内部类
 public void print(){//定义内部类的的方法
 System.out.println(info);//直接访问外部类的私有属性
 }
 }
 public void fun(){//外部类的方法
 new Inner11().print();//调用内部类的方法
 }
 }

运行结果:hello,nishui

6.在方法中定义内部类

一个内部类可以在任意的位置上定义,下面来了解一下在方法中定义内部类

举例:

public class Inner1 {
 public static void main(String[] args) {
 new OuterTest().fun();
 }
 }
 class OuterTest{//外部类
 private String info = "hello";
 public void fun(){//在方法中定义内部类
 class InnerTest{
 public void print(){//定义内部类的的方法
 System.out.println(info);//直接访问外部类的私有属性
 }
 }
 new InnerTest().print();
 }
 }

7.在一个方法中定义内部类,而这个内部类想要访问这个方法中的参数的方法是加上final关键字!

举例:

public class Inner6{
 public static void main(String[] args) {
 new OuterTest1().fun(30);
 }
 }
 class OuterTest1{//外部类
 private String info = "hello";
 public void fun(final int temp){//在方法中定义内部类
 class InnerTest1{
 public void print(){//定义内部类的的方法
 System.out.println(info);//直接访问外部类的私有属性
 System.out.println(temp);
 }
 }
 new InnerTest1().print();
 }
 }

运行结果:

hello
30

8.   内部类在实际开发中作用很大,常用到,所以建议读者熟记。

在java系统中也会常看见使用static声明内部类的情况,一定要记住,使用static声明的内部类是外部类,操作的时候要使用“外部类.内部类”的形式访问!