美文网首页
Java 内部类

Java 内部类

作者: 赵哥窟 | 来源:发表于2018-12-07 18:05 被阅读1次
    什么是内部类

    在类的内部定义另一个类。定义就这么简单。如果在类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.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();//调用外部类的方法
        }
    }
    
    静态内部类

    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、使用场合:简化内部类的使用

    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();
        }
    }
    

    相关文章

      网友评论

          本文标题:Java 内部类

          本文链接:https://www.haomeiwen.com/subject/bvqxhqtx.html