java中的内部类

这篇具有很好参考价值的文章主要介绍了java中的内部类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java中的内部类主要分为两类四种:

第一类:定义在外部类局部位置上,分为局部内部类( 有 类名)、匿名内部类(没有类名)。

第二类:定义在外部类的成员位置上,分为成员内部类(没有static修饰)、静态内部类(使用static修饰)。

一:局部内部类

局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。

局部内部类的使用

1.局部内部类可以直接访问外部类的所有成员,包含私有的,访问方式——直接访问。

2.不能添加访问修饰符,因为它的地位就是一个局部变量,局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final。

3.作用域仅仅在定义它的方法或代码块中

4.外部类访问局部内部类,访问方式:创建对象,在访问(注意:必须在作用域内)

对上面的使用以代码的形式呈现:

public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.method2();
    }
}
class Person{//外部类
    private String name = "张三";
    private int age = 20;

    private void method1(){
        System.out.println("外部类中的method1方法");
    }

    public void method2(){
        final class Student{//局部内部类可以加fianl关键字
            private String name = "王五";
            public void method3(){
                method1();//可以访问外部类中的成员
            }
        }
        /**
         * 外部类访问局部内部类的方式:创建对象再访问
         */
        Student student = new Student();
        student.method3();
    }
}

java中的内部类 

5.外部其他类不能直接访问局部内部类(因为局部内部类是一个局部变量) 

6.如果外部类和局部内部类的成员重名时,默认遵循就近访问原则,如果打破原则访问外部类成员,则可以使用(外部类名.this.成员)去访问。

代码演示上面两个使用:

public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.method2();
        //不能直接访问局部内部类
        //person.student;//报错:Cannot resolve symbol 'student'
    }
}
class Person{//外部类
    private String name = "张三";
    private int age = 20;

    private void method1(){
        System.out.println("外部类中的method1方法");
    }

    public void method2(){
        final class Student{//局部内部类可以加fianl关键字
            private String name = "王五";
            public void method3(){
                System.out.println(name);//遵循就近原则
                System.out.println(Person.this.name);//同名时访问外部成员
                method1();//可以访问外部类中的成员
            }
        }
        /**
         * 外部类访问局部内部类的方式:创建对象再访问
         */
        Student student = new Student();
        student.method3();
    }
}

java中的内部类 

二:匿名内部类 

上面四种内部类中只需要掌握这一种即可,这是以后代码中经常会用到的,很重要。

匿名内部类的定义

匿名内部类是没有名称的内部类。在Java中调用某个方法时,如果该方法的参数是接口类型,除了可以传接口实现类外,还可以使用实现接口的匿名内部类作为参数,在匿名内部类中直接完成方法的实现。

通过一段代码来解释匿名内部类:

public class TestDemo02 {
    public static void main(String[] args) {
        People people = new People();
        people.method();
    }
}
class People{
    private String name;
    public void method(){
        class Student implements behavior{
            @Override
            public void eat() {
                System.out.println("学生韩梅梅正在吃饭");
            }
        }
        Student student = new Student();
        student.eat();


        class Teacher implements behavior{
            @Override
            public void eat() {
                System.out.println("老师李华正在吃饭");
            }
        }
        Teacher teacher = new Teacher();
        teacher.eat();
    }
}
interface behavior{
    public void eat();
}

java中的内部类 

从上面可以看到People类里面有两个内部类Student、Teacher,两个类都实现了behavior接口并实现了里面吃这个行为。 

细心的朋友已经观察到了,上面的代码不是局部内部类吗,和匿名内部类与啥关系。在这里我们通过局部内部类主要是为了引出匿名内部类。观察上面的代码,发现为了调用内部类里面的方法,就必须实例化对象,然后在调用。如果内部类一多,比如现在有Father、Marther.......众多的内部类,难道都要一个个实例吗,为了简化开发,java开发者就创建了匿名内部类,看下面的代码。

public class TestDemo02 {
    public static void main(String[] args) {
        People people = new People();
        people.method();
    }
}
class People{
    private String name;
    public void method(){
        Behavior student = new Behavior() {
            @Override
            public void eat() {
                System.out.println("学生韩梅梅正在吃饭");
            }
        };
        student.eat();
        Behavior teacher = new Behavior() {
            @Override
            public void eat() {
                System.out.println("老师李华正在吃饭");
            }
        };
        teacher.eat();
    }
}
interface Behavior{
    public void eat();
}

上面的代码就是利用匿名内部类实现多对象的创建,合理使用匿名内部类可以很大程度简化代码量。

为看懂上面的代码,现在作如下分析:

1.分析上面student的编译类型和运行类型,编译类型为Behavior,运行类型正是匿名内部类。可能有的人会很以为,这个匿名内部类在哪里,怎么没看见。所谓匿名内部类,就是没有名字的类,也不能说没有名字吧,jdk底层给这个类分配了一个名字,就叫做People$1,只不过不显示出来,看如下代码就知道了:

public class TestDemo02 {
    public static void main(String[] args) {
        People people = new People();
        people.method();
    }
}
class People{
    private String name;
    public void method(){
        Behavior student = new Behavior() {
            @Override
            public void eat() {
                System.out.println("学生韩梅梅正在吃饭");
            }
        };
        student.eat();
        System.out.println(student.getClass());//获取全路径类名
    }
}
interface Behavior{
    public void eat();
}

java中的内部类 

2.jdk底层创建完匿名内部类以后马上就实力化了该类的对象,也就是说底层一共做了两步动作,第一是创建匿名内部类,第二步是实力化对象。

3.上面的匿名内部类的操作步骤和局部内部类是一样的,只不过简化了代码而已。 

匿名内部类的语法

new 接口或类(参数列表){
       类体;
};

 下面在演示其他两种不同的匿名内部类:

一:基于类的匿名内部类

public class TestDemo02 {
    public static void main(String[] args) {
        new People("张三").method();
    }
}
class People{
    private String name;

    public People(String name) {
        this.name = name;
    }
    public void method(){
        Father father = new Father("张三"){
            @Override
            public void sleep() {
                System.out.println("匿名内部类中的sleep方法");
            }
        };
        father.sleep();
    }
}
class Father{
    private String name;
    public Father(String name){
        this.name = name;
    }
    public void sleep(){
        System.out.println("正在睡觉");
    }
}

上面的匿名内部类是继承至Father这个类的,当匿名内部类调用sleep方法的时候,根据继承机制他首先在本类中找,刚好本类中有一个sleep方法,他就会执行本类中的方法,结果如下:

java中的内部类

这里需要重点提一下:有得朋友可能会想,既然匿名内部类也是一个类,那么在类里面写一些方法,然后实力化调用这些方法是不是也行。这里需要指出,匿名内部类里面确实可以写自己的方法,但是不能调用,因为根据继承机制(实现接口也相当于继承,因为接口是一种特殊的类),匿名内部类作为一个子类,他是无法调用自身特有的方法的。这里也不能强转,因为你根本就不知道匿名内部类的运行类型是啥。所以综上,匿名内部类里面只能重写父类中的方法,然后调用。 

二:基于抽象类的匿名内部类

public class TestDemo02 {
    public static void main(String[] args) {
        People people = new People();
        people.method();
    }
}
class People{
    private String name;
    public void method(){
       Animal dog = new Animal() {
           @Override
           void eat() {
               System.out.println("小狗吃东西");
           }
       };
       dog.eat();
    }
}
abstract class Animal{
    abstract void eat();
}

java中的内部类 

匿名内部类的使用

1.匿名内部类既是一个类,又是一个对象,既有定义类的特征,又有创建对象的特征。所以可以调用匿名内部类中的方法。

匿名内部类的使用和局部内部类一样,除了第四条。

 

 匿名内部类的使用场景

 一:当做实参直接传递

public class TestDemo02 {
    public static void main(String[] args) {
        show(new Peopel() {
            @Override
            public void dance() {
                System.out.println("全名制作人们大家好,我是练习时长两年半的个人练习生蔡徐坤");
            }
        });
    }
    public static void show(Peopel peopel){
        peopel.dance();
    }
}
interface Peopel{
    public void dance();
}

java中的内部类 

二:在多态中的应用

public class TestDemo02 {
    public static void main(String[] args) {
        Ikun ikun = new Ikun();
        ikun.show(new Peopel() {
            @Override
            public void dance() {
                System.out.println("你们都是黑子,只有我才是真爱粉");
            }
        });
        ikun.show(new Peopel() {
            @Override
            public void dance() {
                System.out.println("会唱、跳、rap的才是ikun");
            }
        });
    }
}
class Ikun{
    public void show(Peopel peopel){
        peopel.dance();//这里会发生动态绑定
    }
}
interface Peopel{
    public void dance();
}

java中的内部类 

 

三:成员内部类

成员内部类的概念 

成员内部类是定义在外部类的成员位置上,并且没有static修饰

成员内部类的使用 

1.可以直接访问外部类的所有成员,包括私有的。外部类访问成员内部类访问方式:创建对象,再访问;

2.可以添加任意访问修饰符,因为它的地位就是一个成员;

3.作用域和外部类的其他成员一样,为整个类体

4.如果外部类和内部类的成员重名时,内部类访问的话,遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问。

5.外部其他类访问成员内部类有三种方式:第一种实例化外部类,然后访问;第二种将内部类作为外部类的成员实例化然后访问;第三种在外部类里面编写一个方法,可以返回内部类对象。

下面用代码演示上面的使用:

public class TestDemo02 {
    public static void main(String[] args) {
        People people = new People();
        people.method();//访问的第一种方式实例化外部类,通过外部类里面的方法访问
        //People.Student student = people.new Student();//访问的第二种方式,将内部类作为外部类的成员实例化然后访问
        /**
         * 访问的第三种方式
         * People.Student getStudent = people.getStudent();
         * getStudent.say();
         */
    }
}
class People{//外部类
    private String name = "张三";
    private int age = 20;

    private void hi(){
        System.out.println("打招呼");
    }

    public class Student{//内部类
        private String name = "李四";
        private int age = 21;
        public void say(){
            System.out.println("name="+name+" age="+People.this.age);
        }
    }

    //返回Student类
    public Student getStudent(){
        return new Student();
    }

    public void method(){//外部类访问内部类
        Student student = new Student();
        student.say();
    }
}

java中的内部类 

 

四:静态内部类 

静态内部类的概念 

静态内部类是定义在外部类的成员位置上,并且有static修饰

静态内部类的使用

1.可以直接访问外部内的所有静态成员,包含私有的,但不能直接访问非静态的成员 

2.可以添加任意访问修饰符,因为它的地位就是一个成员;

3.作用域和外部类的其他成员一样,为整个类体

4.如果外部类和内部类的成员重名时,内部类访问的话,遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问。

这些都不重要就不演示了。文章来源地址https://www.toymoban.com/news/detail-413731.html

到了这里,关于java中的内部类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java语言------四种内部类的详细讲解

    目录 一.内部类的介绍 二.内部类的种类 2.1实例内部类       2.2.静态内部类 2.3局部内部类 2.4匿名内部类 总结        内部类: 一个类定义在  另一个类  的  内部。        内部类分为 四种 : 实例内部类、静态内部类、局部内部类、匿名内部类。 使用时机:当一个事

    2023年04月25日
    浏览(43)
  • web安全是什么?主要分为哪几部分?

    网络安全是一个非常庞大的体系,范围非常之大,被分为很多种类型,web安全就是其中之一,也是网络安全技术中非常重要的领域。那么web安全是什么?主要分为哪几部分?以下是详细的内容介绍。 什么是web安全? 随着web2.0、社交网络、微博等等一系列新型的互联网产品的诞生

    2024年02月09日
    浏览(45)
  • String类中的一些常用方法(JAVA)

    目录 字符串比较方法: boolean equals(Object anObject):  int compareTo(String s): int compareToIgnoreCase(String str) 字符串查找方法: char charAt(int index): int indexOf(int ch):  int indexOf(int ch, int fromIndex): int indexOf(String str): int indexOf(String str, int fromIndex): int lastIndexOf(int ch): int lastIndexOf(in

    2024年02月07日
    浏览(42)
  • 【JAVA原理系列】Java String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解

    这里是三种字符串替换方法的原理: replaceFirst() 方法的原理是通过编译给定的正则表达式,然后使用编译后的模式创建一个匹配器对象,将该匹配器应用于目标字符串,并使用给定的替换字符串替换第一个匹配的子字符串。 replaceAll() 方法的原理与 replaceFirst() 类似,也是通过

    2024年04月16日
    浏览(43)
  • 【Java基础教程】(三十八)常用类库篇 · 第八讲:数组操作类——解析Arrays类中的全部操作方法,解锁Java数组操作技巧~

    前言:在学习本文之前,应该先学习并清楚了解Java基础部分的数组相关的概念和知识。 若还不具备学习条件,请先前往学习数组部分的基础知识: 《【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转

    2024年02月15日
    浏览(61)
  • JAVA深化篇_29—— 线程使用之线程联合以及Thread类中的其他常用方法【附有详细说明及代码案例】

    线程联合 当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。 join方法的使用 join()方法就是指调用该

    2024年02月05日
    浏览(47)
  • Java中的四种权限修饰符

    在Java中,存在四种访问修饰符,它们是public、private、protected和default。它们的访问权限从高到低依次为public protected default private。 1.public:public修饰的类、属性或方法可以被任何其他类访问,包括外部的类、同一个包内的类以及子类。 例如: 在这个例子中,Person类被声明为

    2024年02月12日
    浏览(57)
  • Java中的四种引用类型及其使用方式

    Java中有四种引用类型,分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(WeakReference)、虚引用(PhantomReference)。 这要从Java管理内存的方式说起。Java为了将程序员从内存管理中解救出来,即不让程序员自己申请堆内存(比如C语言程序员需要通过malloc请求操作系统分配一

    2023年04月09日
    浏览(51)
  • java中的内部类

    第一类:定义在外部类局部位置上,分为局部内部类( 有 类名)、匿名内部类(没有类名)。 第二类:定义在外部类的成员位置上,分为成员内部类(没有static修饰)、静态内部类(使用static修饰)。 局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。 局部内部类的

    2023年04月15日
    浏览(28)
  • Java中的四种引用:强、软、弱、虚引用

    引用在实际中基本使用的都是强引用,垃圾回收器判断对象是否存在可用的算法: 引用计数器算法,可达性分析算法 , 引用计数器算法 :在对象中添加一个引用计数器,每当对象被引用时,计数器加1,反正计数器减去1,当计数器为0,则不存在引用,垃圾回收的时候就可以回

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包