内部类的应用

 

        一、内部类的概念:

1.将一个类定义在另一个类的里面,对里面那个类就称为内部类,或者叫做内置类,嵌套类。

2.访问特点:内部类可以直接访问外部类中的成员,包括成员变量和成员方法,也包括私有成员;而外部类要访问内部类中的成员必须要建立内部类的的对象:代码体现如下:

class InnerclassDemo
{
 public static void main(String[] args)
 {
   Outer ou=new Outer();
   ou.method();
 }
}
class Outer
{
 private int age=25;
 class Inner
 {
  int age=19;
  void show()
  {
   System.out.println("age="+Outer.this.age);//直接访问内部类中成员
   //如果本类中有局部变量,就访问本类,如果没有就访问父类中
  //成员变量,因为有一条默认语句Outer.this.age
  }
 }
 void method()
 {
  System.out.println("Outer method");3
  Inner in=new Inner();//建立内部类对象,访问内部类方法
  in.show();

Outer.Inner in=new Outer().new Inner();

in.show();//直接访问内部类的方法
 }
}

         二、内部类的位置

1、成员变量位置上,那么可以被private static成员修饰符修饰,具体功能属性等可以参考成员变量。而且被static修饰后的内部类只能访问外部类中的静态变量,就是你是静态的,你只能访问静态的,因为静态的是随着类的加载而被加载的,而非静态的是随着对象的建立而被封装的,所以它优先于静态而存在。

static:访问受到限制:

private:将内部类封装在了外部类中,不能为外部其他类之间访问

如果没有私有化,外部类可以直接访问到内部类,格式如下:

外部类名、内部类名变量名=外部类对象、内部类对象;

Outer.Inner in=new Outer().new Inner();

外部类直接访问静态内部类中的非静态成员:

new Outer.Inner.function();注意创建的是内部类的对象

外部类直接访问静态内部类中的静态变量:

Outer.Inner.function();可以直接用类名访问静态成员;

注意:该内部类中的成员是静态的,那么类也应该是静态的。

如果外部类静态成员访问该内部类成员时,内部类必须是静态的,否则无法访问;

2.在局部位置上,可以直接访问外部类中的成员,同时可以访问所有局部中的局部变量,但必须是被final修饰的,具体代码如下:

class InnerDemo
{
 public static void main(String[] args)
 {
   Outer ou=new Outer();
   ou.show();
 }
}
class Outer
{
 private int age;
 public void show()
 {
  
  class Inner
  {
   final int num=9;
   void method(){
   System.out.println("num="+num);
   }

  }
  new Inner().method();
 }
}

//程序执行过程:首先main主函数、外部类Outer()构造方法,创建一个对象,将地址给引用ou,然后该对象调用Outer中的方法show();然后程序执行show(),内部类创建了一个对象,然后调用里面的method()方法,然后method()方法用调用被final修饰的局部变量。

也可以向show(final int a)传递一个final类型的参数,一样打印,因为都是局部变量:

3.匿名内部类,其实就是一种简写形式,它的前提是内部类必须继承一个其他外部父类或者接口,它是一个带内容的对象。代码体现如下:

class InnerclassDemo1
{
 public static void main(String[] args)
 {
  Outer ou=new Outer();
  ou.method();
 }
}
abstract class Abs
{
 abstract void show();
 abstract void abs();
}
class Outer
{
 private int age;
 
 public void method()
 {
  
  
  Abs b=new Abs()
  {
   int num=9;
   void show()
   {
    System.out.println("show1");
   }
   void abs()
   {
    System.out.println("abs 1");
   }
  };//这是一个带内容的匿名对象,使用父类的名称创建。
  b.show();//自己在创建对象的同时又重写了父类中的内容,然后自己再调用
  b.abs();
 }
}

原文地址:https://www.cnblogs.com/warrior4236/p/6055734.html