Java基础之内部类

举报
袁袁袁袁满 发表于 2022/04/16 20:42:39 2022/04/16
【摘要】 1.1 内部类的概述1、内部类解释:Java种的内部类是在一个类内部定义另一个类。2、为什么需要内部类?内部类继承自某个类或实现某个接口,内部类的代码操作可以创建其外部类的对象。所以可以将其入围是进入外部类的门窗每个内部类都可独立的继承一个接口的实现,所以不管外部类是否已经集成某个接口的实现。对于内部类是没有影响的,而且内部类提供的使得外部类具有了类似多重继承的效果,解决了一些设计与变成的...

1.1 内部类的概述

  • 1、内部类解释:Java种的内部类是在一个类内部定义另一个类。

  • 2、为什么需要内部类?

    • 内部类继承自某个类或实现某个接口,内部类的代码操作可以创建其外部类的对象。所以可以将其入围是进入外部类的门窗
    • 每个内部类都可独立的继承一个接口的实现,所以不管外部类是否已经集成某个接口的实现。对于内部类是没有影响的,而且内部类提供的使得外部类具有了类似多重继承的效果,解决了一些设计与变成的问题,使得。接口解决部分,内部类也有效的解决一部分"多重继承"的问题。
  • 3、格式

public class 类名 {
	修饰符 class 类名 {
	}
}
  • 4、内部类访问特点
    1,内部类可以直击访问外部的成员,包括私有
    2,外部内访问内部类的成员必须创建内部类对象,通过对象来调用内部类成员

  • 5、内部类的分类
    1.成员内部类 (实例内部类)
    2.局部内部类(类方法中定义的类)
    3. 匿名内部类 (重点)

1.2 成员内部类(了解)

  • 成员内部类外界如何创建对象使用?
  • 格式:外部类名.内部类名 对象名 = new 外部类对象.内部类对象();
范例:Outer.Inter oi = new Outer(). new Inter();
  • 思路
    1、内部类通常用private修饰
    2、通过外部类创建内部类对象,调用内部类方法
    3、其他类创建外部类对象调用method方法
  • 案例
package ceshi;

public class Outer {

    private int num = 20;

    //测试1
    /*public class Inter {
        public void show() {
            System.out.println(num); //可以访问外部类私有
        }
    }*/

    //一、内部类通常用private修饰;二、通过外部类创建内部类对象,调用内部类方法;三、外部创建外部类对象调用method方法
    private class Inter {
        public void show() {
            System.out.println(num);
        }
    }
    //二、通过外部类创建内部类对象,调用内部类方法
    public void method() {
        Inter i = new Inter();
        i.show();
    }
}
  • 测试
package ceshi;

public class InterDemo {
    public static void main(String[] args) {
        //创建内部类对象,并调用方法
//        Inter i = new Inter(); 报错
        //测试1
//        Outer.Inter oi = new Outer(). new Inter();
//        oi.show(); //20

        //三、外部创建外部类对象调用method方法
        Outer o = new Outer();
        o.method(); //20
    }
}

1.3 局部内部类(了解)

  • 局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
  • 范例
package ceshi;

public class Outer {

    private int num1 = 10;

    public void method() {
        int num2 = 20;
        //局部内部类
        class Inter {
            public void show() {
                System.out.println(num1);
                System.out.println(num2);
            }
        }
        //需要在方法中创建局部内部类对象,调用方法,否则没法访问
        Inter i = new Inter();
        i.show();
    }
}
  • 测试
package ceshi;

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

1.4 匿名内部类(重点)

  • 前提:存在一个类或者接口,这里的类可以是抽象类、具体类
  • 好处:可以少写接口实现类
  • 格式
new 类名或者接口名() {
	重写方法
};
  • 本质是继承了该类或实现该接口的 子类匿名对象
  • 范例
package ceshi;

public class Outer {

    private int num1 = 10;

    public void method() {
        //只能调用一次
        /*new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show(); //前面为一个对象,调用里面show()方法*/

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

    }
}
  • 接口
package ceshi;

public interface Inter {

    void show();
}
  • 测试
package ceshi;

public class InterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method(); //匿名内部类
                    //匿名内部类
    }
}

1.5 注意事项

  • 成员内部类中,不能定义静态成员
  • 成员内部类中,可以访问外部类的所有成员
  • 内部类中不允许定义静态变量
  • 内部类和外部类的实例变量可以共存
  • 在内部类中访问内部类自己的变量直接用变量名
  • 在内部类中访问内部类自己的变量也可以用this.变量名
  • 在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
  • 如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
  • 外部类的非静态方法访问成员内部类
  • 外部类的静态方法访问成员内部类,与在外部类的外部访问成员内部类一样
  • 内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。