栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java内部类?看这篇就够了

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java内部类?看这篇就够了

目录

一、成员内部类

概念

成员内部类对象的产生

外部类的内部: 语法就和普通类一样。

外部类的外部: 前提是内部类对于外部的这个类可见的。

成员内部类代码示例

二、静态内部类

概念

静态内部类对象的产生

外部类的内部: 就和普通类的用法相同

外部类的外部:外部类.内部类 引用 = new 外部类.内部类();

静态内部类代码示例

三、方法内部类(局部内部类)— 类比局部变量

概念

方法内部类代码示例

四、匿名内部类(lambda表达式的前身。函数式编程)

概念

匿名内部类代码示例


一、成员内部类

概念

直接定义在类中,不加static定义的内部类 - 成员方法或属性。成员内部类必须依赖外部类的存在而存在,必须先有外部类对象才能产生成员内部类。

成员内部类对象的产生

外部类的内部: 语法就和普通类一样。

Inner in = new Inner0;

外部类的外部: 前提是内部类对于外部的这个类可见的。

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

new Outter() 产生了外部类对象, 然后通过此对象来构造内部类对象 => 当产生内部类对象时,构造这个内部类的外部类对象就会被编译器传入内部类。

内部类和外部类可以方便的访问彼此的私有域。
内部类访问外部类的私有域直接访问(内部类中隐藏了一个外部类对象)。

成员方法能访问静态域,不能定义静态属性。
对于成员内部类来说,能否定义一个静态变量?                                                                            答:不能,成员内部类必须要依赖外部类,若成员内部类有静态属性,没有外部类对象也能访问。

class Inner {
   private static int test = 10;//报错
}

对于外部类来说,能否在外部类的静态方法中使用成员内部类?                                                    答: 不能,相当于在静态方法中调用成员变量。
比如:在外部类的main中创建内部类对象

public static void main(String[] args) {
    Inner inner = new Inner();//报错
}

成员内部类代码示例
public class Outter {
    private String msg = "outter类中的msg属性";
    // 心脏和发动机都属于私有内部类,对外部完全隐藏,只是在类的内部来使用
    // ---------------------------
    class Inner {
        private int num = 10;
        private String msg = "内部类的msg属性";
        public void test() {
            // 直接访问外部类的msg属性
            // 此处直接访问了外部类的私有成员变量msg,成员变量必须通过对象访问
            System.out.println(Outter.this.msg);
        }
    }
    // ---------------------------
    public void fun() {
        // 通过内部类对象访问内部类的私有属性
        Inner inner = new Inner();
        inner.test();
    }

    public static void main(String[] args) {

    }
}

二、静态内部类

概念

定义在类中,使用static修饰的内部类就是静态内部类。静态内部类不需要依赖外部类对象!

静态内部类对象的产生

外部类的内部: 就和普通类的用法相同
//成员方法创建成员内部类对象 inner
public void test(){
   Inner inner = new Inner();
}

//静态方法创建成员内部类对象 inner
public static void main(String[] args) {
   Inner inner = new Inner();
}

为何成员方法和静态方法都能创建成员内部类对象?
答:类比类中静态变量,没有类的对象就能使用,类的静态方法可以调用,成员方法也可以。

外部类的外部:外部类.内部类 引用 = new 外部类.内部类();

Outter1. Inner inner = new outter1. Inner() ;       //此时不需要产生外部类对象

静态内部类就是一个普通的类,只是套在了一个类的内部而已。
静态内部类能否拥有成员变量?  能否访问外部类的成员变量?
答:普通类能否定义自己的成员变量?静态内部类可以存在成员域。不能,外部类的成员变量有对象才能访问,此时内部类就没有外部类对象,因此无法直接访问。

静态内部类代码示例
//静态内部类的示范
public class Outter1 {
    private static int test = 100;
    private String msg = "外部类的成员变量";
    //静态内部类,就是一个普通类,只是把他套在Outter1里
     static class Inner{
        static int num = 10;
        int age = 3;
        public void fun(){
//            System.out.println(msg);//程序错误
            System.out.println(new Outter1().msg);//可以通过new外部类对象来访问成员域
            System.out.println(test);
        }
    }

    //成员方法创建成员内部类对象 inner
    public void test(){
        Inner inner = new Inner();
    }

    //静态方法创建成员内部类对象 inner
    public static void main(String[] args) {
        Inner inner = new Inner();
        inner.fun();
    }
}

成员内部类可以访问外部类的成员域和静态域,但是不能拥有静态域。
静态内部类可以拥有成员域,但是不能直接访问外部类的成员域,可以通过new-个外部类对象来访问静态域,随便访问。

三、方法内部类(局部内部类)— 类比局部变量 概念

直接定义在方法内部的类,不允许使用任何访问修饰符,对外部完全隐藏(出了这个方法,这个类就没了)。
方法内部类无法定义static域,除此之外和成员内部类的用法基本相同。
方法内部类中若使用了方法的形参,该形参为隐式的final声明(JDK8之后,JDK8之前,方法内部类若使用了形参,形参必须使用final声明)

方法内部类代码示例
//方法内部类示例
public class Outter2 {
    private int age = 10;
    //在方法内部嵌套一个内部类
    public void fun(int num){
        //方法内部类,不能出现任何访问修饰符private public和static
        class Inner{
            public void test(){
                System.out.println(age);
                System.out.println(num);
//                //以下两行报错
//                num++;
//                System.out.println(num);//从内部类引用的本地变量必须是最终变量或实际上的最终变量
            }
        }
        //此时Inner使用num这个变量,num就变成了隐式的final,值不能修改
//        num ++;
        System.out.println(num);

        //创建方法内部类对象
        Inner inner = new Inner();
        //调用方法内部类的test方法
        inner.test();
    }
    public static void main(String[] args) {
        Outter2 outter2 = new Outter2();
        outter2.fun(20);
    }
}

//执行结果
//20
//10
//20

四、匿名内部类(lambda表达式的前身。函数式编程) 概念

匿名内部类遵从方法内部的所有要求,匿名内部类默认会继承一个类(普通类和抽象类都可以,一般是继承抽象类或者实现接口)或实现一个接口。

匿名内部类代码示例
//匿名内部类
public class Outter3 {
    public static void fun(IMessage msg){
        msg.printMsg();
    }

    public static void main(String[] args) {
        fun(new IMessage() {
            //这就是一个匿名内部类
            //等同于创建了一个类实现了Imessage接口,创建该类的对象
            @Override
            public void printMsg() {
                System.out.println("匿名内部类的用法");
            }
        });
//        IMessage msg = new IMessageImpl();
//        fun(msg);
    }
}
interface IMessage{
    //定义抽象方法
    void printMsg();
}
class IMessageImpl implements IMessage{
    @Override
    public void printMsg() {
        System.out.println("普通用法");
    }
}

本节完^_^

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/726750.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号