博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习笔记:内部类
阅读量:2066 次
发布时间:2019-04-29

本文共 4765 字,大约阅读时间需要 15 分钟。

java学习笔记:内部类

 

 

Java中的内部类

----
一、内部类
举例:心脏--人体
1.内部类:在类的内部定义的另一个类。
如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer称为外部类。
定义格式:
public class 外部类的名称{
  //外部类的成员
  public class 内部类的名称{
    //内部类的成员
  }
}

2.使用内部类的好处:

A.实现多重继承
B.内部类可以很好地实现隐藏。一般的非内部类,是不允许有private与protected权限的,只有内部类可以。
C.减少了类文件编译后的产生的字节码文件的大小。

3.使用内部类的缺点:使程序结构不清楚。

内部类的class文件名称为:外部类名称$内部类名称.class

4.内部类的种类:

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/

你可能感兴趣的文章
系统安装之十 U盘安装原版win10
查看>>
安装系统之十一 UEFI和Legacy及UEFI+Legacy启动的区别
查看>>
树莓派屏幕---------Android手机作为树莓派的屏幕
查看>>
嵌入式 知识点 积累 (一)
查看>>
嵌入式 知识积累 (二) 之 三个学习阶段
查看>>
嵌入式 知识积累(三) 之 基本技能
查看>>
嵌入式 知识积累(四) 之 硬件开发的基本过程
查看>>
嵌入式 知识积累(五)之硬件工程师具备基本技能
查看>>
中小型园区网络的设计与实现 (一)
查看>>
别人的难题,就是你的价值。
查看>>
中小型园区网络的设计与实现 (二)
查看>>
中小型园区网络的设计与实现 (三)
查看>>
VLAN与子网划分区别
查看>>
Cisco Packet Tracer教程
查看>>
01. 开篇:组建小型局域网
查看>>
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
04. 交换机的端口聚合配置
查看>>
05. 交换机划分Vlan配置
查看>>
06. 三层交换机实现VLAN间路由
查看>>