面试后学习 -- Java内部类

作者: 奔跑的笨鸟 | 来源:发表于2017-06-08 23:22 被阅读85次

面试问到的一个Java内部类的问题,今天总结下。如果我理解有误,请指正,谢谢。

一个简单的内部类:

package innerclazz;

public class OuterClazz {

    class InnerClazz{//inner class
        
    }
}

Java为什么用内部类

  • 提供一种方法把只在一个地方用的类逻辑分组
  • 增强封装(可以理解一种类似“多重继承”)
  • 容易维护

为什么说内部类可以实现类似的多重继承,Java是不需要class多重继承的, 想要实现类似多重继承的效果可以用内部类,比如Class B 已经继承了Class C 就没有办法继承Class A, 但是把B设计成A的内部类,就可以访问A的内部变量和方法了,就像是也继承了A。

package innerclazz;

public class ClazzA {

    private int age = 0;
    public void printFromA(){
        System.out.println("The age in ClazzA is "+age);
    }
    //ClazzB 可以直接调用ClazzA的方法和访问它的变量,
    class ClazzB extends ClazzC{//inner class
        public void print() {
            age++;
            printFromA();
        }
    }
    public static void main(String[] args) {
        ClazzB clazzB = new ClazzA().new ClazzB();
        clazzB.print();
    }
}

class ClazzC{
    
}

执行结果:

The age in ClazzA is 1

几种内部类

① 静态内部类

静态内部类不可以访问它外部类的非静态变量和方法,如果想访问外部类的变量和方法只能通过外部类的实例。

package innerclazz;

public class OuterClazz {

    private int age = 0;
    private static int intAge = 10;
    public void printAge(){
        System.out.println("The age in ClazzA is "+age);
    }
    
    //ClazzB 可以直接调用ClazzA的方法和访问它的变量,
    static class ClazzB {//inner class
        public void print() {
            System.out.println("The int age in Out class is "+intAge);
            OuterClazz outerClazz = new OuterClazz();
            outerClazz.age++;
            outerClazz.printAge();
        }
    }
    public static void main(String[] args) {
        ClazzB clazzB =  new OuterClazz.  ClazzB();
        clazzB.print();
    }
}

执行结果:

The int age in Out class is 10
The age in ClazzA is 1

② 非静态内部类

内部类可以直接访问外部类的方法和变量(包括静态的)。

package innerclazz;

public class OuterClazz {

    private int age = 0;
    private static int intAge = 10;
    public void printAge(){
        System.out.println("The age in ClazzA is "+age);
    }
    
    //ClazzB 可以直接调用ClazzA的方法和访问它的变量,
     class ClazzB {//inner class
        public void print() {
            System.out.println("The int age in Out class is "+intAge);
            age++;
            printAge();
        }
    }
    public static void main(String[] args) {
        ClazzB clazzB =  new OuterClazz(). new  ClazzB();
        clazzB.print();
    }
}

执行结果和静态内部类相同。

③ 本地内部类

本地内部类声明在一个块中,函数本地类就是一个函数中声明一个类,作用域只在函数内,外部没办法创建实例

package innerclazz;

public class LocalClazz {

    public static void testLocalClazz() {
        int age =10;
        class InnerClazz {
            public void pringAge() {
                //age++; //Error: Local variable age defined in an enclosing scope must be final or effectively final
                System.out.println("this age is "+age);
            }
        }
        InnerClazz innerClazz = new InnerClazz();
        innerClazz.pringAge();
    }

    public static void main(String[] args) {
        testLocalClazz();
    }
}

④ 匿名类

没有名字的内部类就是匿名内部类,在声明的时候实例化,用来重写一个类的方法,或者实现一个接口

package innerclazz;

public class AnonymousInnerClazz {
    private Animal animal = new Animal() {
        
        @Override
        public void eat() {
            System.out.println("eat, eat, eat!");
            
        }
    };
    public static void main(String[] args) {
        new AnonymousInnerClazz().animal.eat();
    }
    

}
interface Animal{
    public void eat();
}

执行结果:

eat, eat, eat!

真的有点饿了,也累了,(~﹃~)~zZ

参考
inner classes
Java Inner classes
Nested Classes

相关文章

  • 2021-12-06、12-07

    今天简单的复习下Java内部类,面试有的时候问到。 Java内部类 什么是内部类? 内部类就是定义类里面的类。在J...

  • 面试题

    Java面试题集 - 简书 Java内部类详解 - 海 子 - 博客园 记一次 Android 面试 - 简书 A...

  • 面试后学习 -- Java内部类

    面试问到的一个Java内部类的问题,今天总结下。如果我理解有误,请指正,谢谢。 一个简单的内部类: Java为什么...

  • Java 中的方法内部类

    Java 中的方法内部类 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内...

  • PHP转JAVA的记录

    Java 数组 内部类 内部类的创建:内部类可以对包内其他类隐藏想实现一个接口时, 不想新建类文件 内部类可以访问...

  • 全面掌握 Java 内部类

    一直以来以为自己对 java 基础甚是清楚,然而面试时却连内部类和静态内部类的区别都无法回答圆满,so~重新学习一...

  • Java 面试系列:各种内部类和枚举类的使用 + 面试题

    内部类不仅经常出现在各种面试题中,还会在 Java 源码中频频出现,因此只有搞明白了 Java 内部类,才能搞定面...

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • Java内部类

    Java内部类 大纲: java内部类有什么特点?为什么需要内部类? 非静态内部类持有外部类的引用 内部类的分类。...

  • 内部类

    内部类可以分为:非静态内部类;静态内部类;匿名内部类。 一、内部类 首先要说,Java为什么要使用内部类?java...

网友评论

    本文标题:面试后学习 -- Java内部类

    本文链接:https://www.haomeiwen.com/subject/lbitqxtx.html