java 内部类的学习总结(一)

mac2022-10-07  38

 什么是内部类 ?

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。可以把内部类理解成寄生,外部 类理解成宿主。

如果一个事物的内部包含了另一个事物,那么这就是一个类内部包含另一个类(面对对象思想)

eg:身体和心脏的关系,汽车和发动机

内部类是Java类的五大成份之一,也是我们后一个需要学习的成份。 

 什么时候使用内部类 

一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用 1. 人里面有一颗心脏。

2. 汽车内部有一个发动机。

3. 为了实现更好的封装性

内部类的分类  按定义的位置来分 1. 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)

2. 实例内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)

3. 局部内部类,类定义在方法内

4. 匿名内部类。一般定义在方法中,或者可执行代码中 

静态内部类  静态内部类特点: 有static修饰的内部类,属于外部类本身的。

总结:静态内部类与其他类的用法完全一样。只是访问的时候需要加上外部类.内部类。

拓展:静态内部类可以直接访问外部类的静态成员。

静态内部类对象的创建格式: 外部类.内部类  变量 = new  外部类.内部类构造器; 

eg: // 外部类:Outer01 class Outer01{     private static String sc_name = "外部类";     // 内部类: Inner01  

    public static class Inner01{       // 这里面的东西与类是完全一样

      private String name;       public Inner01(String name) {          this.name = name;    

     }         public void showName(){    

       System.out.println(this.name);           // 拓展:静态内部类可以直接访问外部类的静态成员。                    System.out.println(sc_name);    

  }  

}

}

public class InnerClassDemo01 {

  public static void main(String[] args) {  

    // 创建静态内部类对象。      

// 外部类.内部类  变量 = new  外部类.内部类构造器;    

  Outer01.Inner01 in = new Outer01.Inner01("张三");    

  in.showName();   } 

实例成员内部类

特点

无static修饰的内部类,属于外部类对象的。

宿主:外部类对象

成员内部类的定义格式:

修饰符 class 外部类名称{

    修饰符 class 内部类名称{

        //.........

    }

//...

}

如何使用成员内部类?有两种方式:

1.间接方式:在外部类的方法中,使用内部类

//外部类 public class Body { //外部类的成员属性 private String name;

//外部类的构造方法

public Body(String name) { this.name = name; } //成员内部类(类中方法外) public class Heart{ public void innerShow(){ //内部类可以随意访问外部类的属性与方法 System.out.println("我是内部类:外面类的名称:"+name); } } public void methodBody(){ System.out.println("我是外部类的方法,我要调用内部类的方法:"); //在外部类的方法中,使用内部类 Heart heart=new Heart(); heart.innerShow(); } }

2.直接方式:公式:外部类名称.内部类名称 对象名=new 外部类().new 内部类()

public class BodyTest { public static void main(String[] args) { //1.间接方式使用内部类 Body body=new Body("大壮"); body.methodBody(); //2.直接方式使用内部类 //公式:外部类名称.内部类名称. 对象名=new 外部类名称().new内部类(); Body.Heart heart=new Body("小壮").new Heart(); heart.innerShow(); } }

运行生成的Class文件:

Body.classt和Body$Heart.class和BodyTest.class

注意:内部类访问外部类,随意访问    外部类访问内部类,需要通过内部类的对象来进行访问

成员内部类的变量与外部类的变量重名分别调用的例子:

//如果出现重名现象,得到外部类的重名变量:外部类名称.this.变量名 public class Outer { //外部类的重名成员变量 private int num=20; public class Inner{ //内部类的重名成员变量 public int num=10; public void methodInner(){ //内部类方法的局部重名变量 int num=30; System.out.println("局部重名变量:"+num);//就近原则 System.out.println("内部类的重名成员变量:"+this.num); System.out.println("外部类的重名成员变量"+Outer.this.num); } } } /** * 测试外部类与内部类重名属性的调用 * 内部类使用外部类的重名属性的公式:外部类名称.this.属性名 */ public class OuterDemo { public static void main(String[] args) { //直接方式使用内部类:外部类名称.内部类名称 对象名=new 外部类名称().new内部类名称() Outer.Inner inner=new Outer().new Inner(); inner.methodInner(); } }

 

 

最新回复(0)