前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java学习笔记 (成员内部类、静态内部类、匿名内部类、方法内部类)

Java学习笔记 (成员内部类、静态内部类、匿名内部类、方法内部类)

作者头像
用户5513909
发布2023-04-25 11:14:12
4690
发布2023-04-25 11:14:12
举报
文章被收录于专栏:小鱼儿我的学习笔记

内部类

  • 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
  • 与之对应,包含内部类的类称为外部类
  • 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类,更好的实现了信息隐藏
成员内部类

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

代码语言:javascript
复制
package com.imooc.People;

public class Person {
    public int age;

    public Heart getHeart(){
        new Heart().temp = 10;
        return new Heart();
    }
    public void eat(){
        System.out.println("人在吃东西");
    }


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


    public class Heart{
        int temp = 222;
        public String beat(){
            int age = 23;
            return age + "心脏在跳动"+"aaaa"+Person.this.age;
        }
    }
}
静态内部类
  • 静态内部类对象可以不依赖于外部类对象, 直接创建。
  • 静态内部类不能直接访问外部类的非静态成员, 但可以通过 “外部类对象· 成员” 的方式访问。
  • 外部类中可以通过“ 类名· 成员名" 的方式直接访问内部类中静态成员 定义在外部类方法中的内部类, 也称局部内部类。
  • 方法内部类只在其定义所在的方法的内部可见, 即只在该方法内可以 使用。
  • 方法内部类不能使用访问控制符和static 修饰符, 但可以使用final和abstract 修饰。
  • 编译后产生: 外部类$ 数字· class
代码语言:javascript
复制
package com.imooc.People;

public class Person1 {
    public static int age = 12;

    public Heart getHeart(){
        return new Heart();
    }
    public void eat(){
        System.out.println("人在吃东西");
    }
    

    public static class Heart{
        public static int age = 222;

        public static void say(){
            System.out.println("hello");
        }
        public String beat(){
            new Person1().eat();
            return Person1.age + "岁心脏在跳动";
        }
    }
}
代码语言:javascript
复制
package com.imooc.test;

import com.imooc.People.Person;
import com.imooc.People.Person1;

public class peopletest {
    public static void main(String[] args) {
        Person1 lili = new Person1();
        lili.age = 12;
        Person1.Heart myHeart = new Person1.Heart();
        System.out.println(myHeart.beat());
        Person1.Heart.say();
    }
}
方法内部类
  • 定义在外部类方法中的内部类, 也称局部内部类。
  • 方法内部类只在其定义所在的方法的内部可见, 即只在该方法内可以使用。
  • 方法内部类不能使用访问控制符和static 修饰符, 但可以使用final和abstract 修饰。
  • 编译后产生: 外部类$ 数字· class
代码语言:javascript
复制
package com.imooc.People;

public class Person1 {
    public static int age;


    public Object getHeart(){
        //方法内部类
        /**
         * 1、定义在方法内部,作用范围也在方法内
         * 2、和方法内部成员使用规则一样,class前面不可以添加public\private。。。。
         * 3、类中不能包含静态成员
         * 4、类中可以包含final、abstract修饰的成员
         */
          class Heart{
            public int temp = 222;
            public int age = 23;

            public void eat(){

            }
            public String beat(){
                new Person1().eat();
                return  Person1.age + "岁心脏在跳动";
            }
        }
        return new Heart().beat();
    }

    public void eat(){
        System.out.println("人在吃东西");
    }



}
匿名内部类

如果某个类的实例只是用一次, 则可以将类的定义与类的创建, 放到一 起完成, 或者说在定义类的同时就创建一个类。以这种方法定义的没有 名字的类称为匿名内部类。 适用场景

  • 只用到类的一个实例
  • 类在定义后马上用到
  • 给类命名并不会使代码更容易被理解 使用原则
  • 不能有构造方法, 可以通过构造代码块实现数据初始化。
  • 不能定义任何静态成员、静态方法。
  • 不能使用pub 、protected 、private 、static、 abstract、 final修饰。
  • 因匿名内部类也是局部内部类, 所以局部内部类的所有限制都对其 生效。
  • 一个匿名内部类一定是在new 的后面, 用其隐含实现一个接口或继承一个类, 但是两者不可兼得。
  • 只能创建匿名内部类的一个实例。
  • 匿名内部类在编译的时候由系统自动起名为Outter $ 1 · class
  • 一般来说, 匿名内部类用于继承其他类或是实现接口, 并不需要增加额外的方法, 只是对继承方法的实现或是重写。
  • 通过匿名内部类返回的是一个对象的引用, 所以可以直接使用或 将其复制给一个对象变量。
代码语言:javascript
复制
package com.imooc.anonymous;

//public class Man extends Person{
//    @Override
//    public void read() {
//        System.out.println("男生看武侠");
//    }
//}
代码语言:javascript
复制
package com.imooc.test;

//import com.imooc.anonymous.Man;
import com.imooc.anonymous.Person;
//import com.imooc.antonymous.Woman;

public class PerTest {
//     public void getRead(Man man) {
//         man.read();
//     }
//
//    public void getRead(Woman woman) {
//        woman.read();
//    }

    public void getRead(Person person) {
        person.read();
    }

    public static void main(String[] args) {
        PerTest test = new PerTest();
        //方案1
//        Man one = new Man();
//        Woman two = new Woman();
//        test.getRead(one);
//        test.getRead(two);
        /**
         * 1、匿名内部类没有类型名称、实例对象名称
         * 2、编译后的文件命名:外部类$数字.class
         * 3、无法使用private、public、abstract、static修饰
         * 4、不能编写构造方法,可以添加构造代码块
         * 5、不能出现静态成员
         * 6、匿名内部类可以实现接口也可以继承父类,但是不可兼得
         */
        test.getRead(new Person() {
            @Override
            public void read() {
                System.out.println("fuck!!!");
            }
        });
        System.out.println("=============================");
        //方案2

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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