Java(内部类)

admin2024-04-03  0

1.内部类

内的五大成员:属性、方法、构造方法、代码块、内部类

  • 解释:在一个类的里面,再定义一个类。
  • 举例:在A类的内部定义B类,B类就被称为内部类
  • 注意:内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义

内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
public class Car(){ //外部类
    String carName;
    int carAge;
    int carColor;

    class Engine{  //内部类
        String engineName;
        int engineAge;
    }
}

内部类的分类

  • 成员内部类 

  1. 写在成员位置,属于外部类的成员
  2. 成员内部类可被一些修饰词修饰
public class Car(){ //外部类
    String carName;
    int carAge;
    int carColor;
    class Engine{  //成员内部类
        String engineName;
        int engineAge;
    }
}

   3. 获取成员内部类对象

一:在外部类编写方法,对外提供内部类的对象

public class Outer {
    String name;
    class Inner{
    }
    public Inner getInstans(){
        return new Inner();
    }
}
Outer o = new Outer();
o.getInstans();

二:直接创建  格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象 

OUter.Inner oi = new Outer().new Inner();

public class Outer {
    private int a = 10;
    class Inner{
        private int a = 20;
    }
    void show(){
        int a=0;
        //Outer.this 获取外部类对象的地址值
        System.out.println(Outer.this.a); //10
        System.out.println(this.a); //20
        System.out.println(a); //30
    }
}
  • 静态内部类 

1.静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象

public class Car { //外部类
    String carName;
    int carAge;
    int carColor;

    static class Engine { //静态内部类
        String engineName;
    };
    int engineAge;
}

2.创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();

OUter.Inner oi = new Outer().Inner();

3.调用非静态方法的格式:先创建对象,用对象调用

4.调用静态方法的格式:外部类名.内部类名.方法名();

  • 局部内部类 

1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
2.外界是无法直接使用,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

  • 匿名内部类 

  • 匿名内部类

隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置

  • 匿名内部类的格式
new 类名或者接口名(){
     重写方法
};
  • 格式的细节

包含了继承或实现,方法重写,创建对象
整体就是一个类的子类对象或者接口的实现类对象

  • 使用场景

当方法的参数是接口或者类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码

示例: 

public interface Swim {
    public abstract void swim();
    }
public class Test {
    public static void main(String[] args) {

        new Swim(){

            @Override
            public void swim() {
                System.out.println("重写游泳方法");
            }
        };
    }
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!