java内部类讲解

一、内部类

1、定义

​ 在一个类中,定义另外一个类的代码结构,通常定义在类内部的类称为“内部类”,外面的类称为“外部类”,在逻辑关系上内部类与外部类是从属关系,比如:一个People类存在收货地址(收货人,收货联系方法)

2、分类

2.1、普通内部类

​ (inner class) 一个类A中定义另外一个类B,其中类B就是类A的内部类,也是类A的一部分

public class People {
    private String pname="小朱";
    
    public void sayhello(){
        System.out.println("let us say hello");
        //知识点1:外部类的方法中,可以使用内部类的属性,方法
        new Address().addressName="武汉";
        new Address().contentName="小胡";
        new Address().showAddressInfo();
        
    }

    /**
     * 定义普通内部类 收货地址
     */
    class Address{
        private String addressName;//收货地址
        private String contentName;//联系人
        
        public void showAddressInfo(){
            System.out.println("联系人:" + contentName + "收货地址:" + addressName);
            //内部类的方法 可以直接访问外部类的属性
            //由于通常情况访问类的属性都必须创建对象才能使用
            System.out.println("访问外部类的属性:" + pname);
        }
        
    }
}

//使用
        //1.创建内部类的对象 必须依赖外部类的创建
        People people=new People();
        //创建内部类
        People.Address address=people.new Address();
        //注意  这里的address对象不能访问  私有属性,方法
        address.showAddressInfo();

注意两点

  • 外部类的方法中,可以直接访问内部类的所有成员(包括私有)
  • 外部类的方法中,也可以直接访问外部类的所有成员,当外部类和内部类都有同样的属性

2.2、静态内部类

​ 在普通内部类基础上,增加static关键字,与静态方法类似,满足静态的要求

    /**
     * 定义静态内部类
     */
    static class Card{
        private static String cardNo="422202199809302439";
        private String cardName="身份证";
        
        //静态方法
        public static void showCard(){
            System.out.println("身份证号:"+cardNo);
        } //非静态方法
        public void showCard2(){
            System.out.println("身份证:"+cardName);
        }
    }

//使用
        //2、创建静态内部类的对象
        People.Card.showCard();
        //创建静态内部类的对象
        People.Card card=new People.Card();
        card.showCard2();

2.3、方法内部类

​ 在一个方法中定义的类,其中这个类只属于该方法,也只能在该方法中使用

    /**
     * 方法内部类(在一个方法中定义一个类)
     */
    public void method1(){
        int score =90;
        class MyClass{
            String subject="java";
            public  void method2(){
                System.out.println(pname + subject + "科目的分数:" + score);
            }
        }
        //调用方法里面的类
        MyClass  mycls = new MyClass();
        mycls.method2();
    }
//调用
        //调用方法内部类
        people.method1();

2.4、匿名内部类

​ 定义一个没有类名,只有对方法的具体实现,通常它依赖于实现关系(接口)或继承关系(父类)

基于接口

public interface MyInterface {
    public void study();

    public void work();
}

//测试
        //通常实现接口对象的方法
        Student student=new Student("小朱");
        student.study();
        student.work();


        //匿名类实现接口
        MyInterface myInterface=new MyInterface() {
            @Override
            public void study() {
                System.out.println("这个人也好好学习");
            }

            @Override
            public void work() {
                System.out.println("这个人也好好工作");
            }
        };
            myInterface.study();
            myInterface.work();

基于继承关系

public class MyClass {
    public void service(){
        System.out.println("提供服务的方法。");
    }
}

//测试
public class MyClass {
    public void service(){
        System.out.println("提供服务的方法。");
    }
}
原文地址:https://www.cnblogs.com/qzwx63/p/13876639.html