本文共 4765 字,大约阅读时间需要 15 分钟。
java学习笔记:内部类
Java中的内部类
---- 一、内部类 举例:心脏--人体 1.内部类:在类的内部定义的另一个类。 如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer称为外部类。 定义格式: public class 外部类的名称{ //外部类的成员 public class 内部类的名称{ //内部类的成员 } }2.使用内部类的好处:
A.实现多重继承 B.内部类可以很好地实现隐藏。一般的非内部类,是不允许有private与protected权限的,只有内部类可以。 C.减少了类文件编译后的产生的字节码文件的大小。3.使用内部类的缺点:使程序结构不清楚。
内部类的class文件名称为:外部类名称$内部类名称.class4.内部类的种类:
A.成员内部类 B.静态内部类 C.局部内部类 D.匿名内部类 二、成员内部类,也叫实例内部类 1.成员内部类的特征 A.作为外部类的一个成员存在,与外部类的属性、方法并列。 B.成员内部类持有外部类的引用 C.成员内部类中不能定义static变量和方法2.使用格式
Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();3.代码演示一:
//file name: Body.java package com.study.neibulei;public class Body {
private String arm; private String leg; private String blood; public Body(String arm, String leg, String blood){ super(); this.arm = arm; this.leg = leg; this.blood = blood; }//内部类Heart
class Heart{ private String name; public void work(){ System.out.println("心脏正在给" + arm + "、 " + leg + "输" + blood); } }; }//file name: Test01.java
package com.study.neibulei;public class Test01 {
public static void main(String[] args) { Body body = new Body("两个胳膊", "两条腿", "血"); Body.Heart heart = body.new Heart(); heart.work(); } } 代码演示二: //file name: Outer.java package com.study.neibulei;public class Outer {
private String name = "Hello world"; public class Inner{ public void print(){ System.out.println(name); } }; public void print(){//定义外部类方法 new Inner().print();//通过内部类的实例化对象调用方法,相当于:Inner inner = new Inner(); inner.print(); }public static void main(String[] args) {
Outer outer = new Outer(); outer.print();//调用外部类的方法 } } 三、静态内部类 1.内部类如果使用static声明,则此内部类就称为静态内部类。 2.访问:外部类.内部类 3.使用场合:静态内部类不需要外部类的实例。(注意区分成员内部类。)静态内部类的存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。 4.静态内部类的特征 A.静态内部类不会持有外部类的引用 B.静态内部类可以访问外部的静态变量,如果访问外部类的成员变量,必须通过外部类的实例访问。 5.Java中只有内部类才可以是静态的。使用格式:Outer.Inner inner = new Outer.Inner(); 6.代码演示一 //file name: Company.java package com.study.neibulei;public class Company {
String companyName; static String country; static class Clear{ String name; public Clear(){} public Clear(String name){ super(); this.name = name; } public void work(String name){ String na = new Company().companyName = "联想"; country = "中国"; System.out.println(name + "为" + na + "打扫卫生,该公司属于" + country); }//end of method work(String) }//end of class Clear }//end of class Company//file name: Test02.java
package com.study.neibulei;public class Test02 {
public static void main(String[] args) { Company.Clear zcl = new Company.Clear(); zcl.work("shen_hua"); } } 代码演示二: //file name: Outer02.java package com.study.neibulei;public class Outer02 {
private static String info = "Hello World"; private int i = 8; static class Inner{ int num = new Outer02().i;//获取外部类的非静态成员变量。静态成员变量可以直接使用。 public void show(){ System.out.println(info + "----" + num); } }; }//file name: Test03.java
package com.study.neibulei;public class Test03 {
public static void main(String[] args) { Outer02.Inner inner = new Outer02.Inner(); inner.show(); } } 四、局部内部类 1.局部内部类,也叫区域内嵌类。局部内部类与成员内部类类似,不过区域内嵌类是定义在一个方法中的内嵌类。 2.使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类。 3.特征: A.用在方法内部,作用范围仅限于该方法中。 B.根据情况决定持有外部类对象引用 C.不能使用private、protected、public 修饰符。 D.不能包含静态成员 4.演示代码一 //file name: School.java package com.study.neibulei;public class School {
String shoolName; String buss = "培养人才"; int studentNum; public School(){} public School(String schoolName, String buss, int studentNum) { super(); this.shoolName = shoolName; this.buss = buss; this.studentNum = studentNum; } //宣传 public void show(){ final double tvMoney = 10000; final double netMoney = 20000; class AdverTeam{ String teamName = "shen_hua"; //电视宣传 public void tvShow(){ System.out.println("宣传队是:" + teamName); System.out.println("这是电视宣传,学校名称:" + shoolName + ", 业务内容:" + buss + ",学校人数:" + studentNum + ",宣传所需费用:" + tvMoney); }//网络宣传
public void netShow(){ System.out.println("宣传队是:" + teamName); System.out.println("这是网络宣传,学校名称:" + shoolName + ",业务内容:" + buss + ",学校人数:" + studentNum + ",宣传所需费用:" + netMoney); } } new AdverTeam().tvShow(); new AdverTeam().netShow(); } } //Test04.java package com.study.neibulei;public class Test04 {
public static void main(String[] args) { School qinghua = new School("清华", "互联网培训", 1000); qinghua.show(); } } 五、匿名内部类 1.匿名内部类也就是没有名字的内部类。如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。 2.使用场合:简化内部类的使用 3.特征 A.使用new创建,没有具体的位置。 B.创建的内部类,默认继承或实现new后面的类型。 C.根据使用情况决定是否持有外部类对象引用。 D.内嵌匿名类编译后生成的.class文件的命名方式是“外部类名称$编号.class”,编号为1,2,3,...,n,编号为x的文件对应的就是第x个匿名类。 4.代码演示一 //file name: Person.java package com.study.neibulei;public interface Person {
public void run(); }//file name: Test05.java
package com.study.neibulei;public class Test05 {
public static void main(String[] args) { Person p = new Person(){//这是匿名内部类,开始 public void run(){ System.out.println("匿名内部类实现的"); } };//这是匿名内部类,结束 p.run();//调用匿名内部类 } }
内部类的图示
转载地址:http://geymf.baihongyu.com/