Java|Java 内部类

什么是内部类 在类的内部定义另一个类。定义就这么简单。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。内部类的定义格式如下:

public class 外部类的名称{ //外部类的成员 public class 内部类的名称{ //内部类的成员 } }

内部类优缺点 使用内部类的优点:
1)实现多重继承;
2)内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
3)减少了类文件编译后的产生的字节码文件的大小
使用内部类的缺点:使程序结构不清楚。
内部类的种类: 成员内部类、静态内部类、局部内部类、匿名内部类
成员内部类 1、成员内部类也叫实例内部类。应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)
2、成员内部类的特征:
作为外部类的一个成员存在,与外部类的属性、方法并列成员内部类持有外部类的引用,成员内部类中不能定义static变量和方法
3、使用格式:
Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();

示例代码一
public class Body { String arm; String leg; String blood; public Body(String arm, String leg, String blood) { super(); this.arm = arm; this.leg = leg; this.blood = blood; } //内部类Heart class Heart{ String name; void work() { System.out.println("心脏正在给"+arm+leg+"输"+blood); } }; }

public class BodyTest { public static void main(String[] args) { Body body=new Body("两个胳膊","两条腿","血"); Body.Heartheart=body.new Heart(); heart.work(); } }

示例代码二
public class Outer { private String name="Hello World"; public class Inner{ public void print(){ System.out.println(name); } }; public void print(){//定义外部类方法 new Inner().print(); //通过内部类的实例化对象调用方法 } public static void main(String[] args) { Outer outer=new Outer(); outer.print(); //调用外部类的方法 } }

静态内部类 1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类 . 内部类来访问。
2、静态内部类使用场合:内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。
3、静态内部类的特征:
静态内部类不会持有外部类的引用,静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
4、Java中只有内部类才可以是静态的
使用格式:Outer.Inner inner = new Outer.Inner();
public class Company { String companyNam; static String country; static class Clear{ String name; public Clear() { // TODO Auto-generated constructor stub }public Clear(String name) { super(); this.name = name; }public void work(String name){ String s = new Company().companyNam = "苹果公司"; country="中国"; System.out.println(name+"为"+s+"工作,该公司属于"+country); } } }

public class CompanyTest { public static void main(String[] args) { Company.Clear c = new Company.Clear(); c.work("Alex"); } }

局部内部类 1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。
2、使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类
3、特征:
○用在方法内部,作用范围仅限于该方法中
○根据情况决定持有外部类对象引用
○不能使用private,protected,public修饰符
○不能包含静态成员
示例代码
public class School { String schoolName; String buss = "培养人才"; int studentNum; public School() { // TODO Auto-generated constructor stub }public School(String schoolName, String buss, int studentNum) { super(); this.schoolName = schoolName; this.buss = buss; this.studentNum = studentNum; }//宣传 public void show(){ final double tvMoney = 10000; final double netMoney = 20000; class AdverTeam{ String teamName="无敌是多么寂寞"; //电视宣传 public void tvShow(){ System.out.println("宣传队是:"+teamName); System.out.println("这是电视宣传、学校名称:"+schoolName+"、业务内容:"+buss+"、学校人数:"+studentNum+"、宣传所需费用:"+tvMoney); }//网络宣传 public void netShow(){ System.out.println("宣传队是:"+teamName); System.out.println("这是网络宣传、学校名称:"+schoolName+"、业务内容:"+buss+"、学校人数:"+studentNum+"、宣传所需费用:"+netMoney); } } new AdverTeam().tvShow(); new AdverTeam().netShow(); } }

public class SchoolTest { public static void main(String[] args) { School qinghua=new School("清华","互联网培训",1000); qinghua.show(); } }

匿名内部类 1、匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。
2、使用场合:简化内部类的使用
【Java|Java 内部类】3、特征:
○匿名内部类不能定义任何静态成员、方法。
○匿名内部类中的方法不能是抽象的;
○匿名内部类必须实现接口或抽象父类的所有抽象方法。
○匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
public interface Inter { public void show1(); public void show2(); }

public class Outer { public void method(){ new Inter(){public void show1() { System.out.println("这是show1方法"); }@Override public void show2() { System.out.println("这是show2方法"); } }.show1(); new Inter(){public void show1() { System.out.println("这是show1方法"); }@Override public void show2() { System.out.println("这是show2方法"); } }.show2(); } }

public class OuterTest { public static void main (String[] args){ Outer t = new Outer(); t.method(); } }

    推荐阅读