zoukankan      html  css  js  c++  java
  • Java内部类

    成员内部类:

    public class Body { // 外部类
        public class Heart { // 成员内部类
            // 内部类的方法
            public void beat() {
                System.out.println("心脏跳动");
                System.out.println("我叫:" + name);
            }
        }
    
        // 外部类成员变量
        private String name;
    
        // 外部类成员方法
        public void methodBody() {
            System.out.println("外部类方法");
            // 注意:内用外,随意访问,外用内,需要内部类对象
            Heart heart = new Heart();
            heart.beat();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    public class Test {
        public static void main(String[] args) {
            // 间接方式使用内部类(在外部类中使用内部类)
            Body body = new Body();
            body.setName("lily");
            body.methodBody();
    
            // 直接方式使用内部类(直接创建内部类对象)
            Body.Heart heart = new Body().new Heart();
            heart.beat();
        }
    }

    编译后的.class文件:

      

    关于成员内部类访问变量问题:

    public class Outer {
        int num = 10; // 外部类成员变量
        int age = 90;
    
        public class Inner {
            int num = 20; // 内部类成员变量
    
            public void methodInner() {
                int num = 30; // 内部类方法的局部变量
                // 先找方法內的局部变量,找不到会自动向上查找
                System.out.println(age); // 90
                // 出现重名问题,要访问特定的变量
                System.out.println(num); // 30
                System.out.println(this.num); // 20
                System.out.println(Outer.this.num); // 10
            }
    
        }
    }

    静态内部类:

      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 {
    
        public void methodOuter() {
            class Inner { // 局部内部类
                // 局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
                final int num = 10; // 从java 8+开始,只要局部变量事实不变,那么final关键字可以省略
                public void methodInner() {
                    System.out.println(num); // 10
                }
            }
            // 局部内部类只能在方法内部创建对象,进行使用
            Inner inner = new Inner();
            inner.methodInner();
        }
    }

    匿名内部类:

    public interface MyInterface {
        void method();
    }
    public class Test {
        public static void main(String[] args) {
            MyInterface obj = new MyInterface() {
                @Override
                public void method() {
                    System.out.println("匿名内部类实现了方法!");
                }
            };
            obj.method(); // 匿名内部类实现了方法!
        }
    }

    定义一个类的时候,权限修饰符规则:

      1.外部类:public / (default)

      2.成员内部类:public / protected / (default) / private

      3.局部内部类:什么都不写

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12079182.html
Copyright © 2011-2022 走看看