前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 内部类

Java 内部类

作者头像
赵哥窟
发布2018-12-24 11:02:01
3660
发布2018-12-24 11:02:01
举报
文章被收录于专栏:日常技术分享日常技术分享
什么是内部类

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

代码语言:javascript
复制
public class 外部类的名称{
    //外部类的成员
    public class 内部类的名称{
             //内部类的成员
    }
}
内部类优缺点

使用内部类的优点: 1)实现多重继承; 2)内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 3)减少了类文件编译后的产生的字节码文件的大小

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

内部类的种类:

成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类

1、成员内部类也叫实例内部类。应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)

2、成员内部类的特征: 作为外部类的一个成员存在,与外部类的属性、方法并列成员内部类持有外部类的引用,成员内部类中不能定义static变量和方法

3、使用格式:

代码语言:javascript
复制
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

示例代码一

代码语言:javascript
复制
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);
        }
    };
}
代码语言:javascript
复制
public class BodyTest {
    public static void main(String[] args) {
        Body body=new Body("两个胳膊","两条腿","血");
        Body.Heart  heart=body.new Heart();
        heart.work();
    }
}

示例代码二

代码语言:javascript
复制
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();

代码语言:javascript
复制
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);
        }
    }
}
代码语言:javascript
复制
public class CompanyTest {
    public static void main(String[] args) {
        Company.Clear c = new Company.Clear();
        c.work("Alex");
    }
}
局部内部类

1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。

2、使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类

3、特征: ○用在方法内部,作用范围仅限于该方法中 ○根据情况决定持有外部类对象引用 ○不能使用private,protected,public修饰符 ○不能包含静态成员

示例代码

代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
public class SchoolTest {
    public static void main(String[] args) {
        School qinghua=new School("清华","互联网培训",1000);
        qinghua.show();
    }
}
匿名内部类

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

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

3、特征: ○匿名内部类不能定义任何静态成员、方法。 ○匿名内部类中的方法不能是抽象的; ○匿名内部类必须实现接口或抽象父类的所有抽象方法。 ○匿名内部类访问的外部类成员变量或成员方法必须用static修饰;

代码语言:javascript
复制
public interface Inter {
    public void show1();
    public void show2();
}
代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
public class OuterTest {
    public static void main (String[] args){
        Outer t = new Outer();
        t.method();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是内部类
    • 内部类优缺点
      • 内部类的种类:
        • 成员内部类
          • 静态内部类
            • 局部内部类
              • 匿名内部类
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档