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

2 篇文章 0 订阅
2 篇文章 0 订阅

 什么是内部类 ?

将一个类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();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值