首页 > 编程语言 >18_Java中的内部类

18_Java中的内部类

时间:2022-10-09 16:33:39浏览次数:44  
标签:Java 内部 show 18 void class new public

Java的内部类

一、内部类概述

1、内部类:其实就是在一个类中定义一个类(类似于C语言中的结构体的嵌套)

2、定义格式:

public class 类名{
    修饰符 class 类名{
        
    }
}

//示例
public class Outer{
    public class Inner{
        
    }
}

3、内部类的访问特点:

内部类可以直接访问外部类的成员,包括私有(可以参考类内的访问权限)

外部类要访问内部类的成员,必须创建对象(类通过对象访问成员)

4、参考代码:

package com.itheima_01;

/*
外部类
 */
public class Outer {
    //私有成员变量用于查看内部类访问
    private int num = 10;

    public class Inner{
        public void show(){
            System.out.println(num);
        }
    }

    //成员方法 测试外部类访问内部类
    public void method(){
        //show();   不能直接访问

        //用外部类访问 内部类成员
        Inner i = new Inner();
        i.show();
    }
}

二、成员内部类

按照内部类在类中定义的位置不同,可以分为如下两种形式:

在类的成员位置:成员内部类

在类的局部位置:局部内部类

成员内部类,外界如何创建对象使用呢?

格式:外部类名.内部类名 对象名 = 外部对象.内部类对象;

示例:Outer.Inner oi = new Outer().new Inner();

参考代码:

package com.itheima_02;
/*
外部类
 */
public class Outer {
    private int num = 10;


    /*public class Inner{
        public void show(){
            System.out.println(num);
        }
    }*/

    private class Inner{
        public void show(){
            System.out.println(num);
        }
    }

    //外部类定义一个方法用于内部类的访问
    public void method(){
        Inner i = new Inner();
        i.show();
    }
}
package com.itheima_02;
/*
测试类
 */
public class InterDemo {
    public static void main(String[] args){
        //创建内部类对象,并调用方法
//        Inter i = new Inner();    //输入内部类,不能直接访问

        //内部类创建语法格式 权限为public时
        //但是一般而言 我们定义内部类就是想把其隐藏起来
        //Outer.Inner i = new Outer().new Inner();

        Outer o = new Outer();
        //间接调用内部类方法
        o.method();
    }
}

三、局部内部类

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

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

参考代码:

package com.itheima_03;
/*
外部类
 */
public class Outer {

    private int num = 10;

    public void method(){
        int num2 = 20;

        //局部内部类
        class Inner{
            public void show(){
                System.out.println(num);
                System.out.println(num2);   //可以访问局部变量
            }
        }

        //创建对象调用方法
        Inner i = new Inner();
        i.show();
    }
}
package com.itheima_03;
/*
测试类
 */
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        //最开始并没有打印,是因为尽管调用了method方法,但是内部并没有调用内部类方法
        o.method(); //添加好了调用方式后就ok了
    }
}

四、匿名内部类(前提是一个局部内部类)

1、内部类的概述:

总结:匿名内部类的写法格式就是在写一个匿名的子类(实现类)对象,这个对象返回值可以被父类或者实现的对象接收参照多态,而又因为是对象所以可以直接在后面调用方法,注意末尾的 ; 号表示这是一条语句

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

2、格式:

new 类名(这个类名是父类或者子类)或者接口名(){
    重写方法;
};

//示例
new Inter(){	//本质是一个匿名的对象
    //重写方法说明这个类,继承了一个类或者实现了一个接口
    public void show(){
        
    }
};

3、本质:是继承了该类或者实现了该接口的子类(实现类)匿名对象

4、参考代码:

package com.itheima_04;
/*
定义一个接口
 */
public interface Inter {

    void show();
}
package com.itheima_04;
/*
定义一个外部类,用这个类中的匿名类内部类来重新接口中的方法
 */
public class Outer {

    public void method(){
        //匿名内部类本质是一个子类对象

       /*
       new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        };
        */

//        show();

        //这样写是 这个匿名内部类调用了show()方法
        //!!这也是匿名内部类尾部有 ; 的原因把
        /*new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        }.show();

        //第二次调用
        new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        }.show();*/

        //多次调用
        Inter i = new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        };

        i.show();
        i.show();
    }
}
package com.itheima_04;
/*
测试类
 */
public class OuterDemo {
    public static void main(String[] args){
        Outer o = new Outer();
        o.method();
    }
}
2、匿名内部类在开发中的使用:
package com.itheima_05;
/*
跳高接口
 */
public interface Jumpping {
    public abstract void jump();
}
package com.itheima_05;
/*
定义一个接口操作类
 */
public class JumppingOperator {
    //接口作形参 需要的是这个接口的实现类对象
    public void method(Jumpping j){
        j.jump();
    }
}
package com.itheima_05;
/*
    测试类
 */
public class JumppingDemo {
    public static void main(String[] args) {
        //需求创建接口操作类对象,调用method方法
        JumppingOperator jo = new JumppingOperator();


        //改进后
        jo.method(new Jumpping(){
            @Override
            public void jump(){
                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("猪可以跳高了");
            }
        });

    }
}

标签:Java,内部,show,18,void,class,new,public
From: https://www.cnblogs.com/fragmentary/p/16772611.html

相关文章

  • Java加解密-SM4国密算法
    SM4国密算法简介SM4依赖包SM4类SM4_Context类SecuritySM4类=================================== SM4国密算法简介与DES和AES算法相似,国密SM4算法是一种分组加密......
  • Java 多线程(三)静态代理模式
    静态代理模式:1.真实角色和代理角色实现同一个接口2.代理角色要代理真实角色3.代理角色可以做真实角色做不了的事4.真实角色专注做自己的事publicclassStaticProxy......
  • Java开发页面接口过程中,应该注意的点
    列表接口1、查询条件是否需要去除前后空格;2、列表的时间格式是否正确;有的显示2022-07-28这种格式,有的显示:2022-07-2719:00:003、在前端传递时间的参数时,若定义的是Da......
  • Java语言中多态的机制
    1.方法解析Class文件的编译过程中,不包含传统编译中的连接步骤,一切方法的调用在Class文件中存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性......
  • 【Java复健指南03】递归思想
    【递归】递归重要规则1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响,比如n变量如果方法中使用的是引用类型变量(比......
  • java序列化
    一、序列化与反序列化序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转......
  • 003Java的诞生
    003Java的诞生1、计算机语言发展史(1)第一代语言机器语言我们都知道计算机的基本计算方式都是基于二进制的方式。二进制:010111001010110010110100这种代码是直接输......
  • Java虚拟机详解(五)------JVM参数
    JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况。但是如果你想在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必......
  • 【Java复健指南01】简介与数组
    写在最前学习Java已经是很久之前的事情了,因为技术栈的转变,很久没有使用Java正经地开发过项目。对于该语言的理解也是停留在表面,因此萌生了重新学习的念头。一方面是为刷......
  • Java实现多线程
    Java实现多线程的方式有4种分别是继承Thread类,实现Runnable,Callable接口和通过线程池提交线程任务。其中实现Callable接口的方式可以获取返回值。1.继承Thread类通过继......