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
    评论
Java是一种非常流行的面向对象编程语言,它的核心概念之一就是类与对象。 类是用来描述具有相同属性和行为的一组对象的模板。可以把类看作是一种自定义的数据类型。在类中,我们可以定义各种属性和方法来描述对象的特征和行为。属性是对象的状态,而方法则是对象的行为。 对象是类的具体实例化,在内存中占有一定的空间。可以把对象看作是类的变量,通过实例化类来创建对象。对象可以访问类中定义的属性和方法,并且每个对象都有自己独立的状态。 通过类和对象的组合使用,我们可以实现面向对象编程的核心思想:封装、继承和多态。 封装是指将数据和操作数据的方法封装在类的内部,隐藏内部实现细节,只提供公共的访问方法。这样可以保证数据的安全性和一致性,提高代码的可维护性和重用性。 继承是指通过已有的类创建新的类,提供新类所具有的属性和方法,并且可以重写或扩展父类的方法。继承可以减少代码的冗余,提高代码的复用性和可扩展性。 多态是指同一类型的对象在调用同一个方法时,可以有不同的行为表现。它通过方法重载和方法重写实现。多态可以提高代码的灵活性和扩展性,让我们能够编写更加通用和可复用的代码。 总之,类与对象是Java面向对象编程的基石,它们的灵活组合使用可以让我们编写出高质量、模块化的代码,并且提高了代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 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、付费专栏及课程。

余额充值