zoukankan      html  css  js  c++  java
  • java基础之内部类

              java内部类。本是很基础的。在分析一些开源框架源代码时候或者看jdk源代码的时候,就会发现用到大量的内部类。可是在实际工作中。尤其对于新手来说,根本不知道内部类有什么用处。说白了还是对内部类的基本原理不够清晰,没有掌握好这个基础,所以才不知道内部类有什么用处。

              本人也是一边总结基础一边学习一边成长中。

                关于内部类:
                  java有四种内部类:
                 ①静态内部类(static inner class)
                 ②成员内部类(member inner class)
                 ③局部内部类(local inner class)
                 ④匿名内部类(anonymous innter class)

               本篇博客也是參考了好心网友的分享,不敢独享。网址链接例如以下:

                 java内部类(百度百科。比較简单,对于概念讲的比較多)

                 java中的内部类总结(本篇博客总结的非常不错,并且有比喻说明。理解非常清晰透彻)

                Java内部类的使用小结(本篇博客讲的原理非常专业。非常值得一看的博文)

                 

               一、内部类是什么

                 1、概念:内部类是指在一个外部类的内部再定义一个类。类名不须要和目录同样。说白了事实上也就是一个类中还包括着另外一个类。

                 2、特点:

                      (1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,可是前面冠以外部类的类名和$符号 。


                      (2)、内部类不能用普通的方式訪问。

    内部类是外部类的一个成员。因此内部类能够自由地訪问外部类的成员变量。不管是否是private的 。


                      (3)、内部类声明成静态的,就不能随便的訪问外部类的成员变量了,此时内部类仅仅能訪问外部类的静态成员变量 。

                      (4)、*内部类能够是静态static的。也可用public,default。protected和private修饰。(而外部顶级类即类名和文件名称同样的仅仅能使用public和default)。

               二、为什么须要用内部类

                      从理论上来说。无非是体现面向对象的几个特性。封装继承多态。说的实际点,就是省事。比方你须要定义一个类来实现一些功能,两个类之间就会有关联关系或者依赖关系,而这个新定义的类在别的地方又毫无作用。

    此时用内部类就最好只是了。这样既体现了面向对象的原则:职责单一原则、封装原则等。并且还能够通过内部类的方式实现多继承等。

                      举个简单的样例,就是在处理json数据的时候,我们都知道,对于json数据来说。一个{}就能够相应java类的一个类。而对于json数据里面的{}相应的java对象,对于整个程序而言是能够不正确外的。那么此时我们就用内部类来实现就可以。

                     代码举例(json,相应java类):

                      

    {
        "user": {
            "name": "zhangsan",
            "gender": "man",
            "age": 21
        },
        "data": {
            "school": "xiaoxue",
            "address": "jiaxiang"
        }
    }
    /**
     * author Ding Chengyun
     * 2014-6-22
     */
    package com.dcy;
    
    /**
     * @author Ding Chengyun
     * 2014-6-22
     */
    public class User {
    
    	private String name;
    	private String gender;
    	private int age;
    	private Data data;
    	
    	public class Data {
    		private String school;
    		private String address;
    		public String getSchool() {
    			return school;
    		}
    		public void setSchool(String school) {
    			this.school = school;
    		}
    		public String getAddress() {
    			return address;
    		}
    		public void setAddress(String address) {
    			this.address = address;
    		}
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getGender() {
    		return gender;
    	}
    
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public Data getData() {
    		return data;
    	}
    
    	public void setData(Data data) {
    		this.data = data;
    	}
    	
    }
    


               三、内部类怎样使用

                     上面提到的网址链接里面以及代码里面都是样例。以下。是一个匿名内部类的使用样例:

                                      
                     关于匿名内部类:该类一定是继承了某个父类或者实现了某个接口,用的比較多的是事件监听。

                     

    /**
     * author Ding Chengyun
     * 2014-2-28
     */
    package test;
    
    import java.util.Date;
    
    /**
     * @author Ding Chengyun
     * 2014-2-28
     */
    public class AnonymousInnerClassTest {
    
    	@SuppressWarnings("deprecation")
    	public String get(Date date) {
    		return date.toLocaleString();
    	}
    	public static void test1() {
    		AnonymousInnerClassTest ac = new AnonymousInnerClassTest();
    		String result = ac.get(new Date() {}); 
    		//这里定义了一个匿名内部类,且该内部类还继承了Date类。
    		//当调用ac.get()方法的时候传的參数不是new Date()对象
    		//而是继承了Date类的这个匿名类
    		
    		System.out.println(result);
    	}
    	public static void test2() {
    		AnonymousInnerClassTest ac = new AnonymousInnerClassTest();
    		String result = ac.get(new Date() {
    			public String toLocaleString() {
    				return "Hello world";
    			}
    		}); 
    		//这里定义了一个匿名内部类,且该内部类还继承了Date类。
    		//当调用ac.get()方法的时候传的參数不是new Date()对象
    		//而是继承了Date类的这个匿名类
    		
    		System.out.println(result);
    	}
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		test2();
    	}
    
    }
    



  • 相关阅读:
    牛客寒假算法集训 1
    求逆序数——树状数组
    牛客网 被3整除的子序列 区间dp
    SICNU 2019 winter training #2(codeforces #531 Div3)
    iOS 给已有的类添加属性.
    coredata实践
    IOS 数据库升级
    获取当前屏幕显示的viewcontroller
    ios 自顶一个view
    mac 修改文件夹权限.
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6952804.html
Copyright © 2011-2022 走看看