面试后学习 -- Java内部类
来源:互联网 发布:中国网络资讯台二手 编辑:程序博客网 时间:2024/05/23 19:56
面试问到的一个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 10The 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
阅读全文
0 0
- 面试后学习 -- Java内部类
- Java内部类面试
- Java 内部类 面试问题
- Java学习:内部类
- Java内部类学习
- java内部类学习!!
- java学习---内部类
- Java 内部类学习
- 【JAVA学习】内部类
- java学习-内部类
- java内部类学习
- JAVA学习:内部类
- JAVA学习-内部类
- JAVA学习--内部类
- JAVA内部类学习
- Java内部类学习
- Java学习:内部类
- java学习--内部类
- 面试后学习 -- Java GC机制
- UART
- Restful中的get, put 和post
- 1394接口
- 初2019级编程社团期末考试
- 面试后学习 -- Java内部类
- 常用芯片
- Log4j中为什么设计isDebugEnabled()方法
- max232使用方法
- HTTPS加密传输过程
- 主板走线和布局设计
- Java变量的初始化
- 罗杰斯给女儿的信
- Java 继承