zoukankan      html  css  js  c++  java
  • Java学习笔记之---内部类

    Java学习笔记之---内部类

    (一)成员内部类
    1. 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化
    2. 内部类的访问修饰符可以任意,但是访问范围会受到影响
    3. 内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
    4. 可以使用外部类.this.成员的方法,访问外部类中同名的信息
    5. 外部类访问内部类信息,需要通过内部类实例,无法直接访问
    6. 内部类编译后.class文件命名:外部类$内部类.class

    实例

     

    public class People {
        private String name;
        private int age;
        public Heart getHeart(){
            //外部类访问内部类信息,需要通过内部类实例,无法直接访问
            new Heart().temp=12;
            return new Heart();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        public void eat(){
            System.out.println("人会吃东西");
        }
        //内部类的访问修饰符可以任意,但是访问范围会受到影响
        public class Heart{
            int temp=10;
            int age=12;
    
            public void beat(){
                //内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
               // System.out.println(name+"的"+age+"心脏在跳动");
                //可以使用外部类.this.成员的方法,访问外部类中同名的信息
                System.out.println(name+"的"+People.this.getAge()+"心脏在跳动");
            }
        }
    
    }
    class PeopleTest{
        public static void main(String[] args){
    
            People a=new People();
            a.setName("zhang");
            a.setAge(10);
            //获取内部类对象实例  方法1:new 外部类.new 内部类
    //        People.Heart aa=new People().new Heart();
    //        aa.beat();
            //获取内部类对象实例  方法2:外部对象.内部类
    //         People.Heart aa=a.new Heart();
    //         aa.beat();
             //获取内部类对象实例  方法3:外部类对象.获取方法
            People.Heart aa=a.getHeart();
            aa.beat();
        }
    }
    (二)静态内部类
    1. 静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例
    2. 静态内部类实例时,可以不依赖于外部类对象
    3. 可以通过 外部类.内部类.成员 的方式,访问内部类中的静态成员
    4. 当内部类属性于外部类属性同名时,默认直接调用内部类的成员
    5. 如果要访问外部类中的静态属性,可以通过 外部类.属性 的方式
    6. 如果要访问外部类中的非静态属性,可以通过 new 外部类().属性 的方式

    实例

    public class People {
    
        private String name;
    
        private static int age;
    
        public String getName() {
    
            return name;
    
        }
    
    
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    
    
        public int getAge() {
    
            return age;
    
        }
    
    
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public void eat(){
    
           Heart c= new Heart();
    
           c.temp=12;
    
            System.out.println(c.temp+"人会吃东西");
    
        }
    
        //内部类的访问修饰符可以任意,但是访问范围会受到影响
    
        public static class Heart{
    
            int temp=10;
    
            int age=12;
    
    
    
            //静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例
    
            public static void say(){
    
                String ll=new People().getName();
    
                //如果要访问外部类中的静态属性,可以通过 外部类.属性 的方式
    
                //如果要访问外部类中的非静态属性,可以通过 new 外部类().属性 的方式
    
                System.out.println(ll+People.age+new People().getName());
    
    
    
            }
    
        }
    
    
    
    }
    
    class PeopleTest{
    
        public static void main(String[] args){
    
    
    
            People a=new People();
    
            a.setName("zhang");
    
            a.setAge(10);
    
            //静态内部类实例时,可以不依赖于外部类对象
    
           People.Heart aa=new People.Heart();
    
           //当内部类属性于外部类属性同名时,默认直接调用内部类的成员
    
           People.Heart.say();
    
        }
    
    }
    (三)方法内部类
    1. 定义在方法内部,作用范围也在方法内
    2. 和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static
    3. 类中不能包含静态成员
    4. 类中可以包含final,abstract修饰的成员

    实例

    public class People {
    
        private String name;
    
        private static int age;
    
        public String getName() {
    
            return name;
    
        }
        public void setName(String name) {
    
            this.name = name;
    
        }
        public int getAge() {
    
            return age;
    
        }
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public Object getHeart(){
    
            //和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static
    
            class  Heart{
    
              //类中可以包含final,abstract修饰的成员
    
               final int temp=10;
    
                int age=12;
    
                public String  beat(){
    
                    System.out.println("心在跳动");
    
                    return "心在跳动";
    
                }
                }
    
          return new Heart().beat();
        }
    }
    class PeopleTest{
    
        public static void main(String[] args){
            People a=new People();
            a.setName("zhang");
            a.setAge(10);
         System.out.println(a.getHeart());
    
        }
    }
    (四)匿名内部类
    1. 匿名内部类没有类型名称,实例对象名称
    2. 编译后的文件名:外部类$数字.class
    3. 无法使用private,public,protected,abstract,static修饰
    4. 无法编写构造方法,可以添加构造代码块
    5. 不能出现静态成员
    6. 匿名内部类可以实现接口,也可以继承父类,但不可兼得
     实例
     public abstract class Person {
    
        public abstract void read();
    
    }
    class PersonTest{
    
        public void getRead(Person a){
    
            a.read();
    
        }
    
        public static void main(String[] args){
    
            PersonTest test=new PersonTest();
    
            //匿名内部类没有类型名称,实例对象名称
    
            //无法使用private,public,protected,abstract,static修饰
    
            //匿名内部类可以实现接口,也可以继承父类,但不可兼得
    
            test.getRead(new Person() {
    
                //无法编写构造方法,可以添加构造代码块
    
                {
    
                    //构造代码块
    
                }
    
                @Override
    
                public void read() {
    
                    System.out.println("男生");
    
                }
    
            });
    
            test.getRead(new Person() {
    
                @Override
    
                public void read() {
    
                    System.out.println("女生");
    
                }
    
            });
        }
    
    }
  • 相关阅读:
    .NET 用 Unity 依赖注入——概述注册和解析类型(1)
    .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator
    用什么样的语言就有什么样的公司【转载】
    编程语言和工具比较【翻译】
    .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await
    RocketMQ【未完成】
    Dapper
    Java 控制反转和依赖注入模式【翻译】【整理】
    Java 面向切面编程(Aspect Oriented Programming,AOP)
    Groovy 与 Python 的差异【翻译】
  • 原文地址:https://www.cnblogs.com/dyddzhp/p/11174184.html
Copyright © 2011-2022 走看看