静态内部类与成员内部类
来源:互联网 发布:淘宝打折工具有什么用 编辑:程序博客网 时间:2024/05/20 02:51
前言
本文介绍了静态内部类与成员内部类之间的区别,以及他们的使用
正文
内部类的种类
静态内部类static inner class ( also called nested class )
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
内部类类可以用类修饰符吗
普通类的class前面可以用public 、abstract 、 final修饰,其它的修饰符不可以,但是内部类可以使用类的访问修饰符 private protected,public ,还可以使用abstract、final、static修饰符。这里内部类与外围类的方法与成员属性是在同一个层次上,如果是局部内部类与匿名内部类是没有这些修饰符的
静态内部类与成员内部类区别是什么
成员内部类创建的时候需要外围类的一个引用,而静态内部类则不需要这个引用
成员内部类不能有static的属性和方法,而静态内部类可以静态与非静态的属性和方法
静态内部类由于没有外围类的引用,所以不能访问外围类的非静态属性和方法,但是可以访问外围类的静态属性和方法。而成员内部类可以访问外围类的静态、非静态成员属性与方法。
外围类如何创建内部类对象
代码片段
public class InnerClazz { public Inner show() { return new Inner(); } public static Inner print() { InnerClazz clzz = new InnerClazz(); return clzz. new Inner(); } public class Inner { public void print() { System. out.println( "member inner class"); } }}
在非静态方法的创建
成员内部类在创建对象的时候需要一个外围类的引用,在外围类的非静态方法中,如show()里面创建内部类对象,直接new + 内部类类名即可,隐藏的为内部类传入一个外围类引用
在静态方法中创建
在静态方法中 如print()方法,该静态方法可以由InnerClazz.print()调用,这里没有外围类的对象,而非静态内部类创建需要一个外围类的引用,所以,我们只能在静态方法内部创建一个外围类的对象,然后通过enclosingClassReference.new innerclass()创建内部类对象
静态内部类在外围类的创建
代码片段
public class InnerClazz { public StaticInner show() { return new StaticInner(); } public static StaticInner print() { return new StaticInner(); } public static class StaticInner { public void print() { System.out.println("nested inner class"); } }}
静态方法与非静态方法中创建
静态内部类创建不需要一个外围类引用,所以创建的时候无论是在静态方法还是非静态方法都可以使用 new + innerClass 类名的形式创建
使用静态内部类的静态方法
内部类静态方法的调用和普通类中的静态方法调用时一样的,只需要innerClass类名 . 静态方法名,而且它的静态方法和普通类的静态方法一样,不能调用非静态的成员属性与方法,只可以使用静态成员属性与方法
代码片段
public class InnerClazz { public void print() { StaticInner.staticmethod(); } public static class StaticInner { public void print() { System.out.println( "nested inner class"); } public static void staticmethod() { System.out.println( "static method"); } }}
在其他类中如何使用内部类
在其他类调用的时候我们需要注意的是内部类的访问修饰符public protected private。 public可以在任何地方使用,private内部类除了外围类外其他地方都不能访问,protected只能在它的外围类,或者继承这个内部类的子类中访问
代码片段
public class InnerClazz { public Inner getMemberClass() { return new Inner(); } public Static Inner getNestedClass() { return new StaticInner(); } /** 成员内部类 */ public class Inner { public void print() { System. out.println( "member inner class"); } } /** 静态内部类 */ public static class StaticInner { public void print() { System. out.println( "nested inner class"); } public static void staticmethod() { System. out.println( "static method"); } }}
在另外一个类中使用内部类
public final class OtherTest { public static void main(String[] args) { InnerClazz iclzz = new InnerClazz(); //OtherTest与InnerClazz是在同一个包下,所以不需要import InnerClazz所在的包 InnerClazz.Inner inner = iclzz.getMemberClass(); InnerClazz.StaticInner sInner = iclzz.getNestedClass(); //还可以用import指明内部类包路径的形式来表示 //import org.study.inner.InnerClazz.Inner; //import org.study.inner.InnerClazz.StaticInner; Inner oInner = iclzz.getMemberClass(); StaticInner si = iclzz.getNestedClass(); }}
内部类与接口实现代码隐藏
外围类返回内部类对象的方法使用接口来接收创建好的内部类对象,在其它类中,我们只需要接口来引用内部类对象即可,由于内部类设置为private修饰符,所以实现了对内部类的隐藏,在其它类中是无法使用该内部类类型的
代码片段
public class InnerClazz { public Deal getMemberClass() { return new Inner(); } /** 成员内部类 */ private class Inner implements Deal { public void print() { System. out.println( "print member inner class"); } public void show() { System. out.println( "show member inner class"); } }}interface Deal { public void print(); public void show();}
其它类中引用内部类对象
public final class OtherTest { public static void main(String[] args) { InnerClazz iclzz = new InnerClazz(); //向上转型,可以使用Deal接口来得到内部类对象 Deal deal = iclzz.getMemberClass(); deal.print(); deal.show(); }}
- 静态内部类与成员内部类
- 成员内部类、成员静态内部类
- 成员内部类总结与静态内部类详述
- 成员内部类和静态内部类
- java内部类之成员内部类、静态内部类
- 内部类 静态内部类 成员内部类 局部内部类 匿名内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- 内部类(静态内部类 成员内部类 局部内部类 匿名内部类)
- 内部类---(静态内部类、成员内部类、匿名内部类、局部内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- 内部类:成员内部类,局部内部类,静态内部类,匿名内部类
- JAVA之内部类--成员内部类- 静态内部类- 方法内部类- 匿名内部类
- JAVA 内部类与静态内部类
- objective-c如何获得文件路径
- 简单音乐播放器
- DSP using MATLAB中的函数学习
- 【Python】Learn Python the hard way, ex32 for循环
- 对内核添加cramfs支持
- 静态内部类与成员内部类
- 千里之行,始于足下。
- 红黑树
- 黑马程序员——JavaSE之集合框架一
- Easier Done Than Said?
- JavaScript————BOM
- C++中的c_str()函数用法
- linux(centos)下ext4硬盘格式误删文件后的恢复(testdisk与photorec的使用)
- leetcode Move Zeroes