`
xiaoheliushuiya
  • 浏览: 401872 次
文章分类
社区版块
存档分类
最新评论

【初学者常见问题】从外到内,从内到外(内部类剖析1)

 
阅读更多

多久以前打的草稿,内部类是一个很有用的东东。

什么是外部类和内部类? 这样写有神马作用? 用一个类就搞定的事情为什么还要嵌套在里面? 源码里(特别是集合中)大量使用了内部类。比如在LinkedList源码中就有诸如Node节点的内部类。

内部的作用和外部类相互独立,相互促进,内部类也可以实现继承,也可以被覆盖。

这些是我进行外部类和内部类(非静态成员类和静态成员类)测试的原因。

/*
 * 嵌套类是指定义在一个类内部的类,比如TestOuter内部有一个嵌套类Inner1
 * 嵌套类分为静态成员类(static member class),非静态成员类(nonstatic member class)
 * 匿名类(anonymous class),局部类(local class)
 * 通过以下程序能够了解非静态成员类的权限相对于静态成员类要高些
 * 非静态成员类能够访问静态成员类中的成员和方法
 * 静态成员类(Inner1)和非静态成员类(Inner2)能够访问外围雷(TestOuter)的所有成员(包括私有成员)和方法。
 * 嵌套类存在的目的应该是为它的外围类(enclosing class)——TestOuter提供服务
 *
 */
public class TestOuter{

	private static String outer1 = "outer1";

	private String outer2 = "outer2";

	public String getOuter2(){
		return outer2;
	}

	public void outMethod1(){
		System.out.println("This is TestOuter...");
		//外部类是能够实例化静态成员类Inner1,并调用其方法
		Inner1 inOne = new Inner1();
		inOne.inMethod();
		//inOne.testInner2Method(); 静态成员类不能访问非静态成员类方法(静态或非静态)
		inOne.outMethod();        //测试静态成员类访问外部类机制

		//外部类是能够实例化非晶态成员类Inner2,并调用其方法
		Inner2 inTwo = new Inner2();
		inTwo.inMethod();
		//inTwo.inMethod2();        不能在非静态成员类中声明静态方法
		inTwo.testInner1Method();
		inTwo.outMethod();        //测试非静态成员类访问外部类机制


    }
	private static class Inner1{
		private static String inner1 = "inner1";
		private String inner2 = "inner2";
		public String getInner2(){
			return inner2;
		}

		public void outMethod(){
			TestOuter too = new TestOuter();
			//静态成员类能够访问外围类的静态变量(或非静态变量)和方法
			System.out.println(TestOuter.outer1);
			System.out.println(too.getOuter2());
			//静态成员类能够访问外围类的私有成员变量
			System.out.println("访问外围类的成员:"+too.outer1);
		}

		public void inMethod(){
			System.out.println("This is Inner1 Method()...");
		}

		public static void inMethod2(){
			System.out.println("This is static Inner Method()....");
		}

		/* 静态成员内部类不能引用非静态成员内部类的方法(静态方法或非静态)
		public void testInner2Method(){
			Inner2 inner2 = new Inner2();
			inner2.inMethod();
			Inner2.inMethod2();
		}
		*/
	}
	private class Inner2{
		//private static String inner1 = "inner1";	非静态成员类不能声明为静态成员变量
		private String inner2 = "inner2";

		public void inMethod(){
			System.out.println("This is Inner2 Method()...");
		}

		/* 不能再非静态成员类中声明静态方法
		public static void inMethod2(){
			System.out.println("This is Inner2 static Method()...");
		}
		*/

		//非静态成员类能够访问外围类的静态变量(或非静态变量)和方法
		public void outMethod(){
			TestOuter too2 = new TestOuter();
			System.out.println(TestOuter.outer1);
			System.out.println(too2.getOuter2());
		}

		//测试Inner2能不能访问Inner1的方法
		public void testInner1Method(){
			Inner1 inner1 = new Inner1();
			//访问静态成员类的方法
			inner1.inMethod();
			//访问静态成员类的静态方法
			Inner1.inMethod2();

			//能够在非静态成员类中访问静态成员类中的静态变量inner1
			System.out.println(Inner1.inner1);
			//能够在非静态成员类中访问静态成员类中的变量inner2
			System.out.println(inner1.getInner2());
		}
	}
	public static void main(String args[]){
		TestOuter to = new TestOuter();
		to.outMethod1();
	}
}


分享到:
评论

相关推荐

    Malware-Analysis-Training:来自@pedramamini和@erocarrera的退休初学者中级恶意软件分析培训材料

    来自@pedramamini和@erocarrera的已退休初学者/中级恶意软件分析培训材料。该课程最后一次于2010年提供,材料于2020年开源。该课程材料以LaTeX + Beamer编写,可以和模式呈现。 概述 逆向工程已经从传统上仅限于少数...

    visualc++6.0新手入门

     window编程的内部分析  改变控件的字体颜色和背景色  程序设计专业问与答  得到应用程序自身的文件名  用代码隐藏、最小化、最大化窗口  动态改变对话框的宽度  隐藏或显示控件  用mci播放Mp3  改变Push ...

    常规Java工具,算法,加密,数据库,面试题,源代码分析,解决方案.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    VC C++编程例子解析及学习经验集合

    一些不常见的VC数据类型  window编程的内部分析  改变控件的字体颜色和背景色  程序设计专业问与答  得到应用程序自身的文件名  用代码隐藏、最小化、最大化窗口  动态改变对话框的宽度...

    从零开始学单片机C语言教程-电子版

    本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...

    单片机C语言

    本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包2

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包4

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    《大型分布式网站架构设计与实践》既可供初学者学习,帮助读者了解大型分布式网站的架构,以及解决问题的思路和方法,也可供业界同行参考,给日常工作带来启发。 作者简介 陈康贤,淘宝花名龙隆,淘宝技术部研发...

    c语言编写单片机技巧

    答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。 7. 我是一名武汉大学电子科技大3的学生,学了电子线路...

    C语言入门经典(第4版)--源代码及课后练习答案

     本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介  本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JSP高级编程

    本书既适合初学者阅读,也适合具有一定JSP基础的开发人员深入研究使用。 前 言 JSP是SUN公司推出的一种新型的Internet/Intranet开发语言,和前一代Internet/Intranet开发语言(ASP、PHP)相比,JSP在以下几个方面...

    C语言进阶-牟海军.pdf

    全书一共11章:第1章重点阐述了C语言中不易被理解的多个核心概念,很多初学者在理解这些概念时都会存在误区;第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题...

Global site tag (gtag.js) - Google Analytics