Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

神话丿小王子的博客主页

  我们先看这样一段话:人是由大脑、肢体、器官等身体结果组成。而组成我们人体的心脏它也有自己的属性和行为(血液、跳动),显然,此处不能单方面用属性或者方法表示一个心脏了,而需要一个类,但是这个类要依赖于人这个类存在(因为心脏不能脱离人体而存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所心脏以需要写在人类的内部。内部类就相当于其中的某个器官之一。

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

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

使用内部类有什么好处;

1)实现多重继承;

2)内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

3)减少了类文件编译后的产生的字节码文件的大小

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

内部类在编译完成后也会产生.class文件,但文件名称是:外部类名称$内部类名称.class

内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类。下面分别详细学习一下这四种内部类的具体使用。

一、成员内部类

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 Test {
    public static void main(String[] args) {
        Body body=new Body("两个胳膊","两条腿","血");
        Body.Heart  heart=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();//调用外部类的方法
    }
}

运行截图:

解释一下,上述代码中,new Inner().print();代码相当于
Inner inner=new Inner();
Inner.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 na=new Company().companyNam="联想";
            country="中国";
            System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Company.Clear zcl=new Company.Clear();
        zcl.work("shen_hua");
    }

}

运行截图:

代码演示二:

/*
 * 静态内部类
 */
public class Outer {
    private static String info="Hello World";
    private int i=8;

    static class Inner{
        int num=new Outer().i;//获取外部类的非静态成员变量,景天成员变量可以直接使用
        public  void show() {
            System.out.println(info+"---"+num);
        }
    };
}
public class Test {
    public static void main(String[] args) {
        Outer.Inner inner=new Outer.Inner();
        inner.show();
    }
}

运行截图:

三、局部内部类:

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="shen_hua";
            //电视宣传
            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 Test {
    public static void main(String[] args) {
        School qinghua=new School("清华","互联网培训",1000);

        qinghua.show();
    }
}

运行截图:

四、匿名内部类

1、如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

2、使用场合:简化内部类的使用

3、特征:

使用new创建 ,没有具体位置

创建的匿名类,默认继承或实现new后面的类型

根据使用情况决定是否持有外部类对象引用

内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类

代码演示:

/*
 * 匿名内部类
 */
public interface Person {
    public void run();
}
/*
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        Person p=new Person() {
            public void run() {
                System.out.println("匿名内部类实现的");
            }
        };
        p.run();
    }

}

运行截图:

时间: 2024-10-19 15:30:28

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的相关文章

Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类

说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811445.html 一

“全栈2019”Java第九十九章:局部内部类与继承详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十九章:局部内部类与继承详解 下一章 "全栈2019"Java第一百章:局部内部类可以实现接口吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小

Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以在一个方法中,甚至在一个表达式中. 广义上讲,内部类分为四种: 静态内部类(static inner classes) 成员内部类(member inner classes) 局部内部类(local inner classes) 匿名内部类(anonymous inner classes) 1.静态

Java学习笔记23---内部类之局部内部类只能访问final的局部变量

局部内部类是定义在方法体或代码块中的类,在笔记19中已有过简单介绍. 今天要讨论的是局部内部类为什么只能访问为常量的局部变量. 作者: 博客园--蝉蝉 请尊重作者劳动成果,转载请在标题注明"转载"字样,并标明原文链接: http://www.cnblogs.com/chanchan/p/8402411.html 参考资料: http://www.cnblogs.com/dolphin0520/p/3811445.html 1.首先来了解一下局部内部类是如何访问局部变量的 Person类

内部类(成员内部类、局部内部类(包括匿名内部类))

一个事物的内部包含赢一个事物.一个类里面包含另一个类,这个类叫内部类,包含它的叫它外部类. 例如:身体和心脏的关系:汽车和引擎的关系. 心脏.引擎只有在身体和汽车中才有用.内部类也一样. 分类: 1.成员内部类: 2.局部内部类(包括匿名内部类): 1.成员内部类 /* 修饰符 class 外部类名称{ 修饰符 class 内部类名称{ ...... } ...... } */public class Outer { private String name; public class Inter

java中几个特殊的类---内部类

内部类-----是在其他类中的类 1.内部类的定义 将类定义为 class xxxx{... ...}置于某个类的内部即可‘ 内部类编译时生成 xxxx$xxxx的class文件 内部类不能够与外部类同名 2.内部类的使用 在封装其类本省的类中使用该类,与普通类的使用方式相同 在其他地方使用该类:a 类名前要冠以外部类的类名: b 在用new创建内部类对象时,外部类名.内部类名 内部类对象名=外部类对象名.new 内部类名(参数) 3.在内部类中使用外部类的成员 内部类可以直接使用外部类的所有字

java中的四种内部类

java中的内部类分为四个: 成员内部类 静态内部类 局部内部类 匿名内部类 1. 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法,如果被static修饰,就变成静态内部类了. )成员内部类中不能存在static关键字,即,不能声明静态属性.静态方法.静态代码块等.[非静态内部类也可以定义静态成员但需要同时有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义.] )创建成员内部

Java学习(十六)、成员内部类,静态内部类,匿名内部类,局部内部类

定义:将一个类定义在另一个类的内部.内部的类称为内部类; public class Outer{ class inner{ //省略 } } 特点: ①   内部类可以很好的实现隐藏,可以使用protected,private修饰符; ②   内部类可以直接访问外部类的所有成员,包括私有成员; ③   外部类不能直接访问内部类的成员,必须首先要建立内部类的对象才能访问; ④   内部类可以解决一些问题,比如间接的去实现多继承.可以避免修改接口而实现同一个类中两种同名方法的调用; 成员内部类及应用

【java基础】内部类,局部内部类,匿名内部类、静态内部类、接口中的内部类

内部类: 1.定义在一个类中的内部类,内部类的实例化伴随着外围类所定义的方法来构造,内部类对象有外围类的隐式引用,所以内部类可以直接访问外围类的外围类的域,包括私有的,这是内部类的访问特权,所以比常规类功能更加强大. 2.内部类可以对同一个包中的其他类隐藏起来,不过可以通过 OuterClass.InnerClass来引用public声明的内部类. 局部内部类: 1.内部类挪到方法内部,与内部类相比,局部内部类不仅可以访问定义他们的外部类,还可以并且仅可以访问声明为final的局部变量. 2.类

Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量

为什么匿名内部类参数必须为final类型: 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的,是很自然的. 2) 为什么JAVA中要加上一条限制:只能访问final型的局部变量? JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译技术是无法实现的或代价极高. 至于为什么只能是fi