JavaSE学习笔记--内部类

 

一,什么是内部类?
将类定义在类中,该类就是类部类.

二,访问权限.
内部类可以直接访问外部类中的成员。
外部类想要访问内部类,需要建立内部类对象。

三,什么时候使用内部类。
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来访问A类中的成员。这时,就将A类定义成B类的内部类。
例子:孙悟空和牛魔王老婆
什么时候定义内部类呢?
当分析一个事物时,该事物的内部还有具体的事物,这个具体的事物在使用该事物中的其他成员。
这时就将这个具体的事物用内部类来描述。
比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。这时就将心脏定义在人体类中,作为内部类存在。
而且内部类通常都不会直接对外提供,都会封装到外部类中,外部类一般会通过对外提供方法的形式对其进行访问

记住只有内部类定义在成员位置上,才可以有这些成员修饰符。
class Body
{
 private class Heart
 {
  
 }
 public Heart getHeart()
 {

  if()
  return new Heart();
 }
}
class Main
{
 '''''''''''''
}

四, 内部类使用:在外部使用,必须标示出是哪个类的内部类.  格式:外部类名.内部类名 变量=new 外部类对象.内部类对象
 例:Outer.Inner in = new Outer().Inner();
 但是一般不会这么用,因为内部类都会被外部类隐藏,通常都是外部类提供方法获取内部类的对象。
 这样可以对获取对象可控。通常内部类都会被private私有化。

五,静态的情况:

 当内部类中如果有静态成员时,该内部类也必须是静态的。
 而静态内部类只能访问外部类中的静态成员。
  
 在执行static内部列方法时,两种情况。
 1,内部类静态,但是方法没静态。
 该方法需要被对象调用执行。

 Outer.Inner in = new Outer.Inner();//产生了一个静态内部类对象。
 in.show();

 2,内部类静态,而且方法也是静态的。
 静态内部类随着类文件的加载就已经存在了,静态方法随着内部类的加载也存在了。
 这时是不需要对象的。
 Outer.Inner.show();

六,内部类访问外部类成员细节
 记住只有内部类定义在成员位置上,才可以有这些成员修饰符。!!!!!
  
 非静态的内部类之所以可以直接访问外部类中的成员,
 那是因为内部类中都持有一个外部类对象引用:外部类名.this


 静态的内部类之所以可以直接访问外部类中的静态成员,其实持有的是外部类名。

 记住只有内部类定义在成员位置上,才可以有这些成员修饰符。

 例子:
 class Outer
 {
  int num = 3;
  static int num2 = 9;
  class Inner
  {
   //int num = 4;
   void show()
   {
    //int num = 5;
    System.out.println(Outer.this.num);
   }
  }
  static class Inner2
  {
   void function()
   {
    System.out.println(Outer.num2);
   }
  }
  public static void method2()
  {
   new Inner2().function();
  }
  public void method()
  {
   Inner in = new Inner();
   in.show();
  }
 }


七,内部类定义在局部位置上
 记住只有内部类定义在成员位置上,才可以有这些成员修饰符。!!!
 局部内部类不能被修饰符修饰


 内部类定义局部位置上,只能访问该局部中的被final修饰的常量

 例子:
 class Outer
 {
  int num = 4;
  class MyIn
  {
  }
  public void  method(final int y)
  {
   final int x = 3;
   class Inner
   {
    void show()
    {
     System.out.println("show run -"+Outer.this.num);
     System.out.println("x="+x);
     System.out.println("y="+y);
    }
   }

   new Inner().show();
  }
 }
 class InnerClassDemo4
 {
  public static void main(String[] args)
  {
   new Outer().method(5);
  }
 }

八,匿名内部类

 格式:
 匿名内部类的格式:
  new 父类名或者接口(){里面定义该父类或者接口的子类成员。}

 匿名内部类其实就是一个子类匿名对象。这是一个带有内容的对象,这个对象有点胖。
 
 例子:
 bstract class AbsDemo
 {
  abstract void show();
 }

 class Outer
 {
  private int num = 4;
  /*
  class Inner extends AbsDemo
  {
   void show()
   {
    System.out.println("num="+num);
   }
  }
  */
  public void method()
  {
   //new Inner().show();
   
   new AbsDemo()//创建了一个匿名内部类。
   {
    void show()
    {
     System.out.println("num==="+num);
    }
   }.show();

  }
 }

 

 class  NiMingInnerDemo
 {
  public static void main(String[] args)
  {
   new Outer().method();
  }
 }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值