java内部类2

java内部类2

1.定义:在一个类中定义另外一个类,这个类就叫做内部类或内置类 (inner class)
2几个特性
1.可以访问其外部类用private修饰的变量或是方法
    例子:

    class Outer
   {
     private String str="kingtoon";
      class Inner
      {
        void printInner()
       {
         System.out.println(str);
       }
      }
    Inner getInner()
    {
       return new Inner();
    }
}
class InnerClassTest
{
public static void main(String []args)
{
   Outer outer=new Outer();
   Outer.Inner inner=outer.getInner();
   inner.printInner();
}
}
2.this关键字
    “当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员”(包括private变量和方法)。

例子:

class Outer
{
private String str="kingtoon";
class Inner
{
   String str="hjd";
   void printInner()
   {
    String str="kingtoon_hjd";
   System.out.println(str);
    System.out.println(this.str);
    System.out.println(Outer.this.str);
   }
}

Inner getInner()
{
   return new Inner();
}
}
class InnerClassTest
{
public static void main(String []args)
{
   Outer outer=new Outer();
   Outer.Inner inner=outer.getInner();
   inner.printInner();
}
}
   3.外部类访问内部类成员变量或其函数的两种方法
      第一种:

     class Outer
    {
      private String str="kingtoon";
      class Inner
     {
        void printInner()
        {
          System.out.println(str);
       }
   }
}
class InnerClassTest
{
public static void main(String []args)
{
   Outer outer=new Outer();
  Outer.Inner inner= outer.new Inner();
   inner.printInner();
}
}

    第二种

class Outer
{
private String str="kingtoon";
class Inner
{
   void printInner()
   {
    System.out.println(str);
   }
}

Inner getInner()
{
   return new Inner();
}
}
class InnerClassTest
{
public static void main(String []args)
{
   Outer outer=new Outer();
  Outer.Inner inner=outer.getInner();
   inner.printInner();
}
}

4.在外部类的某方法内部定义内部类,内部类的某方法里只能访问外部类方法里由final声明的变量或参数。例子:

class Outer
{

     void printOuter(final int n)
     {
     final String str="kingtoon";
      class Inner
      {
       void printInner()
       {
        System.out.println(str);
        System.out.println(n);
       }
      }
     }
}

5.其实,使用内部类,主要和接口同时使用,可以让java实现多继承。

例如:

interface A
{
void printA();
}
class B
{
void printB()
{
   System.out.println("b");
}
}
class C extends B
{
A getA()
{
   return new A()
   {
    public void printA()
    {
     System.out.println("a");
    }
   };
}
}
class Interface_extends_inner
{
static void fn1(A a)
{
     System.out.println("A");
}
static void fn2(B b)
{
   System.out.println("B");
}
public static void main(String []args)
{
  
   C c=new C();
   A a=c.getA();
   a.printA();
   c.printB();
   fn1(a);//fn1(c.getA());  

   fn2(new B());
}
}

6.内部类可以解决方法同名的情况

例如:

interface Machine
{
void run();
}
class Person
{
void run()
{
   System.out.println("现在,我可以跑了");
}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
   public void run()
   {
    System.out.println("机器引擎启动了");
   }
}
MachineHeart getMachinHeart()
{
   return new MachineHeart();
}
}
class Fangfatongming_inner
{
public static void main(String [] args)
{
   Robot robot=new Robot();
   Machine machine=robot.getMachinHeart();
   machine.run();
   robot.run();
}
}
     此外,内部类可以声明为private或protected;还可以声明为abstract或final(类似于方法的访问权限)。
     还有,内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员.

一点说明:参考资料《java无难事》Author孙鑫

你可能感兴趣的:(java内部类2)