zoukankan      html  css  js  c++  java
  • 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("提供服务的方法。");
        }
    }
    
  • 相关阅读:
    Python DayDayUp系列 —— 字符串操作(一)
    Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)
    ReadWriteLock: 读写锁
    优秀的github项目学习
    synchronized:内部锁
    ReentreantLock:重入锁
    好的文章
    Java内存模型与volatile关键字
    GitHub远程库的搭建以及使用
    使用Executor框架创建线程池
  • 原文地址:https://www.cnblogs.com/qzwx63/p/13876639.html
Copyright © 2011-2022 走看看