【JAVA】java内部类分析详解

内部类:

正常的类是定义在一个.java文本文件的最外层的,也就是,定义一个类,这个类外面没有任何包含{}作用域的元素了,但是内部类是定义在某个类内部的类。

为什么java要提供这样的类定义方式呢?因为如果向往常一样定义一个类,那么要么是public class Cls ,要么是 class Cls,想要用这些类,直接引用即可,但是当编程时如果需要需要定义一个类,却只想让某一个类用到这个类,不希望这个类被其他人使用,就用到内部类了。

Java中的内部类分四种:

1.       非静态内部类

a)         成员内部类 member inner class

b)        局部内部类 local inner class

c)         匿名内部类 anonymous inner class

2.       静态内部类 static inner class (嵌套类 nested class)

非静态内部类

非静态内部类就是没有static关键字修饰的类

需要让内部类和他的外部类之间有交互时使用

成员内部类:

内部类定义的位置在类中的成员位置,也就是说在类中的最外层的{}里面

成员内部类可以保证让内部类访问外部类的所有成员包括私有的,包括静态的

在外部类之外访问: 外部类.内部类

在外部类之外new:要用一个已存在的内部类对象来new p.new Inner()

在内部类访问他的外部类成员:外部类.this.成员

局部内部类:

定义在某个成员方法中,类似于局部变量的类

用法与局部变量相同,不能用public等修饰

能访问在该方法的其他位置定义的final变量,非final不可

能访问该方法所在类的成员

只能在该方法的作用域中使用,也就是外部类不能使用,外部类之外更不能使用

静态内部类:

  静态内部类就是嵌套类

  内部类中只能访问外部类的静态成员(这点与成员内部类不同),因为static在静态存储区

  在外部类之外声明用 外部类.内部类

  在类外new  直接 new 外部类.内部类即可,因为不存在对象。

    

匿名内部类:

  不包含名字的内部类

  在定义时就产生一个对象并且只使用这一次

  常常用于在给一个函数传入某个参数时使用

  定义一个匿名内部类,必须是在一直某个父类或者接口的情况下定义。

  定义格式是  new 父类或接口() {  成员  };

  匿名内部类因为是匿名的,所以没有构造方法,想要实现构造方法的功能要用构造代码块 {}

  匿名内部类只能访问final局部变量,因为它实际上是一个局部内部类的变种

  匿名内部类创建时隐式调用了父类的构造方法,如果父类的构造有参数,那么必须在()括号中传入(x) 此时不需要final  

注:

  下划线代表仍存在疑问。  

Java中的内部类分四种:

1.       非静态内部类

a)         成员内部类 member inner class

b)        局部内部类 local inner class

c)         匿名内部类 anonymous inner class

2.       静态内部类 static inner class (嵌套类 nested class)

内部类:

内部类是定义在某个类内部的类。

当编程时需要需要定义一个类,却只想让某一个类用到这个类时使用。

非静态内部类

非静态内部类就是没有static关键字修饰的类

需要让内部类和他的外部类之间有交互时使用

成员内部类:

内部类定义的位置在类中的成员位置,也就是说在类中的最外层的{}里面

成员内部类可以保证让内部类访问外部类的所有成员包括私有的,包括静态的

在外部类之外访问: 外部类.内部类

在外部类之外new:要用一个已存在的内部类对象来new p.new Inner()

在内部类访问他的外部类成员:外部类.this.成员

局部内部类:

定义在某个成员方法中,类似于局部变量的类

用法与局部变量相同,不能用public等修饰

能访问在该方法的其他位置定义的final变量,非final不可

能访问该方法所在类的成员

只能在该方法的作用域中使用。

时间: 2024-10-25 21:14:06

【JAVA】java内部类分析详解的相关文章

java 堆栈内存分析详解

计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时数据区,动态地分配内存大小   存储数据 对象实例(保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中).对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的

Java的位运算符详解实例

Java的位运算符详解实例——与(&).非(~).或(|).异或(^).右移(>>).左移(<<).无符号右移(>>>) 位运算符主要针对二进制, 它包括了:“与”.“非”.“或”.“异或”."右移"."左移"."无符号右移". 从表面上看似乎有点像逻辑运算符, 但逻辑运算符是针对两个关系运算符来进行逻辑运算, 而位运算符主要针对两个二进制数的位进行逻辑运算. 下面详细介绍每个位运算符. 1.与运

[转]Java的位运算符详解实例——与(&amp;)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段.public class data13{public static void main(String[] args){int a=129;int b=128

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类

Java Service Wrapper配置详解

1 #encoding=UTF-8 2 # Configuration files must begin with a line specifying the encoding 3 # of the the file. 4 5 #******************************************************************** 6 # Wrapper License Properties (Ignored by Community Edition) 7 #*

java classLoader体系结构使用详解

原创整理不易,转载请注明出处:java classLoader体系结构使用详解 代码下载地址:http://www.zuidaima.com/share/1774052029516800.htm jvm classLoader architecture: Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. Extension ClassLoader/扩展类加载器  主要负

java.util.Scanner应用详解++扫描控制台输入

java.util.Scanner应用详解 java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地. 一.扫描控制台输入 这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了. 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫

Java连接SQLite数据库详解【转】

1 package com.hedalixin; 2 import java.sql.Connection; 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.Statement; 6 7 /** 8 * @author Chrome 9 * 10 */ 11 public class JavaSqlite { 12 13 /** 14 * @param args 15 */ 16 pu