一篇文章带你搞懂【Java】中的内部类(二)

简介: 一篇文章带你搞懂【Java】中的内部类(二)

1.3局部内部类🐻‍❄️


局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法中创建对象并使用

该类可以使直接访问外部类的成员,也可以访问方法内的局部变量


代码示例:


public class Outer {
    private int num = 10;
    public void method(){
        class Inner{
            int num1= 30;
            public void show(){
                System.out.println(num);
                System.out.println(num1);
            }
        }
        Inner i = new Inner();
        i.show();
    }
}


/*
 测试类
 */
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}


控制台输出:10 30


注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。


局部内部类:定义在方法中的内部类

不能使用一些修饰符public private…

局部内部类只能定义在方法当中使用

局部内部类当中是不能包含静态变量

因为局部内部类是‘属于方法的’,而static是‘属于类的’,两者相矛盾

局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量

在方法中new出局部类,会在堆中开辟空间,若局部内部类使用了栈中该方法栈帧的成员变量,一旦方法栈帧出栈,堆中的成员变量就无法找到指向的元素,会空指针异常

为了避免这种情况,只能将方法中的成员变量设为static或final,但是static又不能设,所以只能设置为final

当堆中一个对象没有人引用 它并不是直接就销毁


1.4匿名内部类🐇


前提:存在一个类或者接口,这里的了类可以是具体类也可以是抽象类


格式:

new 类名或接口名(){

重写方法;

};


范例:


new Inter(){   //new-》对象没有名字,且继承或者实现了该接口的子类的匿名对象
    public void show() {
        }
}


本质: 是一个继承了该类或者实现了该接口的子类的匿名对象


代码示例:

Outer类:


public class Outer {
    public void method(){
     /*   new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };*/   //对象
      /*  new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show();*/   // 对象调方法
       Inter i =  new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };
       i.show();
    }
}


测试类: OuterDemo


public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}


接口类:Inter



         


1.5匿名内部类在开发中的使用🐧


代码示例:


测试类:JumppingDemo
/*
  测试类
 */
public class JumppingDemo {
    public static void main(String[] args) {
        //需求:创建接口操作类对象,调用method方法
        JumppingOperator jo = new JumppingOperator();
//        Jumpping j = new Jumpping();//不能实例化
        Jumpping j = new Cat();
        jo.method(j);
        System.out.println("----------------");
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("猫可以跳高了");
            }
        });//注意
        jo.method(new Jumpping(){
            @Override
            public void jump() {
                System.out.println("你在狗叫什么");
            }
        });
    }
}


操作类:


/*
 跳高接口操作类,里面有一个方法,方法的参数是接口名
 */
public class JumppingOperator {
    public void method(Jumpping j){//new Cat();
        j.jump();
    }
}


猫类,实例化:


public class Cat implements Jumpping{
    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}


跳高接口

/*
   跳高接口
 */
public interface Jumpping {
    void jump();
}


嵌套类有两种类型:🐯


要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。


嵌套类有两种类型:


非静态内部类


静态内部类


静态内部类🦕

静态内部类是 在内部类前面加上static

静态内部类是 不需要创建外部对象


Outter.Inner in = new Outter.Inner();


在静态内部类当中, 没有外部类引用

意思是他在堆中开辟的空间 里面没有存放外部类的地址

静态内部类,是可以访问外部类的静态成员

但是不能直接访问外部类中的非静态成员变量

如果想要访问外部类中的非静态成员变量 可以new一个外部类出来:

new Outer().age


访问静态内部类当中的静态成员:

Outter.Inner.color

不需要new内部类,直接把内部类当对象用

静态内部类当中不仅可以定义静态成员也可以定义非静态成员

调用方法如出一辙


非静态内部类🦖

非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。


由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。

目录
相关文章
|
2月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
53 3
|
4月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
40 0
|
2月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
56 4
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
22 0
|
4月前
|
存储 前端开发 JavaScript
【前端学java】一篇文章带你精通java 中的数组(10)
【8月更文挑战第10天】一篇文章带你精通java 中的数组
17 3
【前端学java】一篇文章带你精通java 中的数组(10)
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
JavaScript 前端开发 Java
java高质量数据流概念讲解,保证一篇文章帮助你搞懂概念!
【8月更文挑战第11天】java高质量数据流概念讲解,保证一篇文章帮助你搞懂概念!
32 0
java高质量数据流概念讲解,保证一篇文章帮助你搞懂概念!
|
4月前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
39 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
|
4月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!
35 0
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
39 5