zoukankan      html  css  js  c++  java
  • Java 内部类(成员内部类、静态内部类、匿名内部类、局部内部类)

    什么是内部类

    在类的内部定义另一个类。内部类的定义格式如下:

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

    使用内部类的优缺点

    优点:
    1、实现多重继承
    2、内部类可以很好地实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。
    3、减少了类文件编译后的产生的字节码文件的大小
    缺点:使程序结构不清楚。
    内部类在编译后也会生成class文件,但是文件名称为:外部类名称$内部类名称.class

    成员内部类

    什么是成员内部类:成员内部类也叫实例内部类。
    应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)
    成员内部类的特征:
    1、作为一个外部类的成员存在,与外部类的属性、方法并列。
    2、成员内部类持有外部类的引用。
    3、成员内部类中不能有static的变量和方法。

    /*
     * 成员内部类
     */
    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();//调用外部类的方法
        }
    }
    

    静态内部类

    什么是静态内部类:
    内部类用static 声明。(其实也相当于外部类)外部类名.静态内部类名 访问。

    静态内部类使用场景:
    内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。
    静态内部类特征:
    静态内部类不会持有外部类的引用。
    静态内部类可以访问外部类的静态变量,如果要外部类的成员变量必须通过外部类的示例访问。

    /*
     * 静态内部
     */
    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");
        }
    
    }
    

    局部内部类

    什么是局部内部类:
    局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。
    使用场合:
    如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类。
    局部内部类特征:
    用在方法内部,作用范围仅限于该方法。
    根据情况决定持有外部类对象引用
    不能使用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();
        }
    }
    

    匿名内部类

    什么是匿名内部类:如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。
    使用场合:简化内部类的使用。
    特征:
    使用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();
        }
    
    }
    
  • 相关阅读:
    Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
    ps中的中英文对照
    2019.6.27 oracle复习 表空间
    pthon学习笔记 2020/4/6
    运维岗位发展方向
    sql server复习重点
    linux的shell script
    linux知识扫盲
    Android Studio 三、软件学习教程-知识点
    Android Studio 二、github项目下载 2019.8.23
  • 原文地址:https://www.cnblogs.com/jiaorenzhan/p/10623941.html
Copyright © 2011-2022 走看看