Java---内部类的定义与用法

目录

一. 内部类概述 

二. 成员内部类

2.1 普通内部类

2.2 静态内部类

三. 局部内部类 

四.匿名类

五.对象的打印


一. 内部类概述 

内部类是定义在另一个类中的类,内部类也是封装的一种的体现。为什么要使用内部类,主要有两个原因:

· 内部类可以对同一个包的其他类进行隐藏。

· 内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据。

格式:

public class OutClass {
    class InnerClass {
      
    }              //Outclass是外部类    Innerclass是内部类

 注意事项:

1. 定义在class类名花括号外的,即使是在一个文件里,都不能称为内部类,例:

public class OutClass {
    
}
class InnerClass {      //不是内部类,它在花括号外
    
}

2. 内部类和外部类共用一个java源文件,但是经过编译之后,内部类会单独形成字节码文件 

先看一下内部类都可以在一个类的哪些位置可以定义:

public class OutClass {
    public class InnerClass1{     //未被static修饰,普通内部类
    }

    static class InnerClass2{     //被static修饰,静态内部类
    }

    public void method(){
        class InnerClass3{      //在方法中定义,局部内部类
        }
    }

    {
        class InnerClass4{      //实例代码块中,局部内部类
        }
    }

    static {
        class InnerClass5{        //静态代码块中,局部内部类
        }
    }
}

二. 成员内部类

内部类定义的位置与外部类成员所处的位置相同,称为成员内部类

2.1 普通内部类

未被static修饰的内部类称为普通内部类

想了解普通内部类的用法,看完下面的代码和注释,所有问题就迎刃而解了 

public class OutClass {
    private int a;
    static int b;
    int c;

    public void method1() {
        a = 1;
        System.out.println(a);
    }
    public static void method2(){
        b = 2;
        System.out.println(b);
    }
    
    public class InnerClass1 {
        int c;
        public void innerMethod(){
            a = 10;
            b = 20;
            method1();       //内部类中可以直接访问外部类任何访问限定符修饰的成员
            method2();
            c = 30;           //访问的是内部类自己的成员c
            innerMethod();
            
            OutClass.this.c = 300;    //通过访问 外部类.this.同名成员名字 来访问外部类中与内部类同名的成员
            System.out.println(OutClass.this.c);
        }
    }

    public static void main(String[] args) {
        //普通内部类的成员创建以及访问
        OutClass oc = new OutClass();
        System.out.println(oc.a);
        System.out.println(oc.b);
        System.out.println(oc.c);
        oc.method1();
        oc.method2();
        //要访问普通内部类中的成员,必须先构造普通内部类对象
        //构造普通内部类对象方法:
        OutClass.InnerClass1 ic = new OutClass().new InnerClass1();
        //也就是说想构造内部类对象必须借助外部类
        System.out.println(ic.c);
        ic.innerMethod();
    }
}

 注意事项:

1. 外部类的任何成员都可以被在普通内部类方法中直接访问

2. 普通内部类所处的成员与外部类成员位置相同,因此受public private 等访问限定符约束

3. 在内部类方法中访问同名的成员时,优先访问自己的,如果访问外部类同名的成员必须以:外部类名称.this.成员变量 来访问

4. 普通内部类对象必须在先有外部类前体下才能创建

5. 普通内部类的非静态方法中包含了一个指向外部类对象的引用

6. 外部类中,不能直接访问内部类中的成员,如果要访问必须先创建外部类对象

2.2 静态内部类

被static修饰的内部成员类称为静态内部类

想了解静态内部类的用法,看下面的代码和注释

public class OutClass {
    private int a;
    static int b;
    int c;
    public void method1(){
        a = 1;
        System.out.println(a);
    }
    public static void method2(){
        b = 2;
        System.out.println(b);
    }
    static class InnerClass{
        public void methodInner(){
            //  a = 10;    编译器会报错,因为静态内部类中只能访问外部类的静态成员
            b = 20;    //这一编译器不会报错,因为b是静态成员
           // method1();   编译器报错,因为method1不是静态成员方法
            method2();    //这里编译器正常通过
        }
    }

    public static void main(String[] args) {
        //静态内部类对象创建及成员访问
        OutClass.InnerClass ic = new OutClass.InnerClass();
        ic.methodInner();
    }
}

注意事项:

1.在内部类中只能访问外部类中静态成员

2.在创建内部类对象时不需要创建外部类成员

3.成员内部类经过编译之后会产生独立的字节码文件,命名格式为:外部类名称$内部类名称

三. 局部内部类 

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般用的较少。

看以下代码:

public class OutClass {
    int a = 10;
    public void method(){
        int b = 20;
        class InnerClass{      //不能被public static等访问修饰符修饰
            public void methodInner(){
                System.out.println(a);
                System.out.println(b);
            }
        }
        InnerClass ic = new InnerClass(); //只能在该方法体内部使用,其他位置都不能用
        ic.methodInner();
    }

    public static void main(String[] args) {
      //  InnerClass ic = new InnerClass();    在这里变异错误
    }
}

 注意事项:
1.局部内部类只能在定义本方法体中内部使用

2.不能被public,static修饰

3.编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是一个整数

四.匿名类

该类会在后面详细介绍

五.对象的打印

public class Student {
    String name;
    String gender;
    int age;
    public Student(String name,String gender,int age){
        this.name = name;
        this .gender = gender;
        this.age = age;
    }

    public static void main(String[] args) {
        Student st = new Student("XiaoHua","男",10);
        System.out.println(st);
    }
}

 打印结果:

 那该如何打印呢?重写toString方法即可


public class Student {
    String name;
    String gender;
    int age;
    public Student(String name,String gender,int age){
        this.name = name;
        this .gender = gender;
        this.age = age;
    }
    public String toString(){
        return name+"-"+gender+"-"+age;
    }
    
    public static void main(String[] args) {
        Student st = new Student("XiaoHua","男",10);
        System.out.println(st);
    }
}

 打印结果:

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X_H学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值