自学java--4

1.内部类:

new产生的对象在堆内存中,内部类可以放在任何地方,比如方法中,if语句等。

非静态内部类是不能够定义静态的成员。

静态内部类只能访问静态的外部成员。

在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final。(重要)
 
内部类可以声明为private或protected;还可以声明为abstract或final。
 
内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;
 
非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。
 
内部类可以继承其他类,也可以被其他类继承(此时要写出他的层次结构,如extends outer.inner)。
 
内部类常用以匿名类的形式。
 
我们为什么使用内部类

1、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。

2、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。

内部类可以访问外部类的所有方法和变量(原因:内部类含有个Outer.this保存了外部类的引用)

class outer
{
  int index=100;
  class inner
  {
   int index=50;
   void print()
   {
    int index=25;
    System.out.println(index);
    System.out.println(this.index);
    System.out.println(outer.this.index);
    }
   }
   void print()
   {
   inner inner1=new inner();
   inner1.print();
   }
  inner getinner()
  {
   return new inner();
  }
  public static void main(String[] args)
  {
   outer outer1=new outer();
   inner inner1=outer1.getinner();
   inner1.print();
  // inner inner2=new inner();
//因为main方法为outer类的静态成员,所以无法引用inner这个非静态

成员,无法直接new一个内部类。
   //inner2.print();
  }
}

输出结果:25

              50

            100

特别提示上例中的getinner()方法只能用在outer类的内部。外部不可以引用。

另一种方法是:先new一个外部类,然后用outer类对象new一个内部类。例如:

class outer
{
  int index=100;
  class inner
  {
   int index=50;
   void print()
   {
    int index=25;
    System.out.println(index);
    System.out.println(this.index);
    System.out.println(outer.this.index);
    }
   }
   void print()
   {
   inner inner1=new inner();
   inner1.print();
   }
  inner getinner()
  {
   return new inner();
  }
 
}

public class test
{
 public static void main(String[] args)
 {
  //outer.inner inner1=new out.inner()// false
  outer outer1=new outer();
  outer.inner inner1=outer1.new inner();
  inner1.print();
}
}

结果和上例相同。

看一个private内部类好处的例子:

interface Machine
{
    void run();
}

class Person
{
    void run()
    {
        System.out.println("run");
    }
}

class Robot extends Person
{
    private class MachineHeart implements Machine
    {
        public void run()
        {
            System.out.println("heart run");
        }
    }
    Machine getMachine()
    {
        return new MachineHeart();
    }
}

class Test
{
    public static void main(String[] args)
    {
        Robot robot=new Robot();
        Machine m=robot.getMachine();
        m.run();
        robot.run();
    }
}
原文地址:https://www.cnblogs.com/lovelifeloveme/p/3176435.html