Java 内部类详解
文章插图
内部类【Java 内部类详解】内部定义普通类、抽象类、接口的统称 , 是指一种嵌套的结构关系 。
缺点:破坏了良好的程序结构 。
优点:内部类定义在类的内部 , 可以方便访问外部类的的私有成员 , 并且和其它类进行隔离 , 每个内部类都能独立的继承一个接口的实现 , 所以无论外部类是否已经继承了某个(接口的)实现 , 对于内部类都没有影响 。
成员内部类-外部类访问内部类私有成员成员内部类是依托外部类而存在的 , 定义在类内部的非静态类 , 就是成员内部类 。 代码示例如下:
package neibu; class Outer{private int age ;private int name ;public Outer() {super();// TODO Auto-generated constructor stub}public Outer(int age) {super();this.age = age;}public Intter getInfo() {Intter inter = new Intter("guoqun");return inter ;}class Intter{private String name ;public Intter(String name) {super();this.name = name;}public void name() {/*Intter类 像是Outer类的一个成员 , Outer称为外部类 。成员内部类可以无条件访问外部类的所有成员属性和成员方法,包括private成员和静态成员 。 */System.out.println(Outer.this.age + this.name);}} }
Intter类是Outer类的一个内部类 , Outer称为外部类 。 成员内部类可以无条件访问外部类的所有成员属性和成员方法 , 包括private成员和静态成员 。
需要注意的是 , 虽然成员内部类可以无限制的访问外部类中成员或方法 , 但当成员内部类与外部类拥有同名成员变量或者方法时 , 会发生覆盖 , 即默认情况下访问的是成员内部类的成员 , 如上述代码示例的name成员变量 。 如果要访问外部类的同名成员 , 需要以下面的形式进行访问:
外部类.this.成员变量, 如Outer.this.age 外部类.this.成员方法
外部类访问成员内部类的成员 , 需要先创建一个成员内部类的对象 , 再通过引用来访问内部类成员 。
内部类可以直接被实例化 , 语法格式:
外部类.内部类 对象名称 = new 外部类().new 内部类();
代码示例如下:
public class Lian {public static void main(String[] args) {// TODO Auto-generated method stubOuter.Intter inttera = new Outer(10).new Intter("guoqun");inttera.name();} }
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限 。 内部类私有化 , 可以使用 private、protected实现 。 如上面示例中 , 如果成员内部类Intter使用private进行修饰 , 那么只能在外部类的内部访问;如果用protected进行修饰 , 那么只能在同一个包下或继承外部类时访问;如果使用public进行修饰 , 那么在任何地方都能访问;如果是默认访问权限(default) , 则只能在同一个包下访问 。 这一点和外部类有一点不一样 , 外部类只能被public或default访问权限修饰 。
定义内部接口 package neibu;interface Jiekou{public abstract void jie(T x);// 内部接口interface KouJie {public abstract void fun();}? class Jj implements Jiekou{public void jie(T x) {System.out.print(x);}class Abs implements KouJie {publicvoid fun() {System.out.print("asdasda"); ?}}}
实例化内部类接口实例化对象前需要首先获取外部类实例化对象 , 代码示例如下:
public class Lian {public static void main(String[] args) {// 实例化外部类接口对象neibu.Jiekou
接口子类定义为自身内部类 package neibu; public class Lian {public static void main(String[] args) {FaceM.getFace().getInfo();}} interface FaceM{public abstract void getInfo();class mm implements FaceM {public void getInfo() {System.out.println("接口子类定义为自身内部类");}}public static FaceM getFace() {return new mm();} }
static 定义内部类(静态内部类)使用static定义内部类 , 此时的内部类不再受外部类实例化对象的影响 , 所以等同于于一个“外部类” , 内部类的名称为“外部类.内部类” , 同时static定义的内部类只能调用外部类中static定义的结构 , 并且在进行内部类的实例化时也不再需要先获取外部类实例化对象 , static内部类对象实例化格式如下:
外部类内部类内部类对象外部类内部类
package neibu; public class Lian {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println();Outer.Intter inttera = new Outer.Intter("guoqun");inttera.name();} } class Outer{public Outer(int age) {super();this.age = age;}public Intter getInfo() {Intter inter = new Intter("guoqun");return inter ;}private int age ;static class Intter{private String name ;public Intter(String name) {super();this.name = name;}public void name() {System.out.println(this.name);}} }
- 推新标准建新生态,下载超198亿次金山发力海内外
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 行业|现在行业内客服托管费用是怎么算的
- 整形美容|双十一医美不良事件高发 热玛吉风险高 业内:医美职业打假人太少
- 产业|前瞻生鲜电商产业全球周报第67期:发力社区团购!京东内部筹划“京东优选”
- 峰会|这场峰会厉害了!政府企业专家媒体共议网络内容生态治理
- 逛逛|淘宝内容化再升级:“买家秀”变身“逛逛”试图冲破算法局限
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 走向|电商,从货架陈列走向内容驱动
- 涉嫌|李佳琦店铺被罚是怎么回事?店内洗发水涉嫌虚假宣传