Java的内部类
一. 内部类介绍
1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部类,嵌套其他类的称为外部类。内部类是类的五大成员之一(属性 方法 构造器 代码块 内部类)。
2.分类如图所示
二.成员内部类
1.非静态内部类
说明:
(1) 定义在成员位置中(方法或代码块外面) 无static修饰
(2) 可以直接访问外部类的所有的成员
(3) 可以添加任意权限修饰符
(4) 作用域和其他成员一样作用在整个外部类
代码如下
package com.wangwang;
public class localclass {//外部类
//属性位置
private int n1=10;
class localN1{//局部类
public void output(){
//==1==.可以直接访问外部类的所有的成员,包括私有
System.out.println("获取私有成员"+n1);
}
}
//写一个方法来创建局部类的一个实列
public void output(){
localN1 LocalN1 = new localN1();
LocalN1.output();
}
}
public class Practice {
public static void main(String[] args) {
localclass A1 = new localclass();
A1.output();
}
}
2.静态内部类
说明:定义在成员位置中(方法块或代码块外面) 有或无static修饰
1.可以直接访问外部类的静态的成员 不能访问非静态成员
2.可以添加任意权限修饰符
3.作用域 和其他成员一样作用在整个外部类
代码如下
package com.wangwang;
public class static_localclass {//外部类
private int n1=10;
static int n2=20;
static public class localN2{//静态局部类
public void output(){
//==1==.可以直接访问外部类的所有的成员,包括私有
System.out.println("获取static_localclass私有成员"+n2);
//System.out.println(n1);
}
}
//写一个方法来创建局部类的一个实列
public void output(){
localN2 LocalN2 = new localN2();
LocalN2.output();
}
}
public class Practice {
public static void main(String[] args) {
static_localclass A1 = new static_localclass();
A1.output();
}
}
三.局部内部类
说明:
(1)局部类是定义在外部类的方法内或者代码块内。
(2)可以直接访问外部类的所有的成员。
(3)不能添加访问修饰符,局部内部类的地位就是一个局部变量(所以可以用fianl修饰)。
(4)作用域:作用在所定义的方法中或者代码块中。
(5)访问方式:局部内部类访问外部外部类成员可以直接访问。外部类访问局部内部类,在外部类作用域内先创建对象再访问。
(6)外部其他类不能访问内部类。
(7)外部类成员与内部类成员重名时,默认就近原则,如果想用外部类的话可以使用:外部类名.this.成员 。
代码如下
package com.wangwang;
public class Named_local_inner_class {//外部类
private int a1 = 1;
int a2 = 2;
private void fun(){
System.out.println("输出了私有方法");
}
//第一种情况 在方法中
public void output(){
class inner_class{//局部内部类
private int a1 = 10;//内部类成员与外部类成员名相同
//可以访问外部类的所有成员
public void _output(){
System.out.println("内部类的a1="+a1+"\t"+"外部类的a1="+Named_local_inner_class.this.a1);//访问的私有成员
System.out.println("a2="+a2);
fun();
}
}
}
}
1.有名的局部内部类
package com.wangwang;
public class Named_local_inner_class {//外部类
private int a1 = 1;
int a2 = 2;
private void fun() {
System.out.println("输出了私有方法");
}
//第一种情况 在方法中
public void m1() {
class inner_class {...
}
//不能添加访问修饰符
public class inner_class2{}//不能添加访问修饰符
final class inner_class3{}//本质还是一个类
}
}
package com.wangwang;
public class Named_local_inner_class {//外部类
private int a1 = 1;
int a2 = 2;
private void fun() {
System.out.println("输出了私有方法");
}
//第一种情况 在方法中
//第二种情况 在代码块中
//在此以方法中为例
public void output(){//方法
class inner_class{//局部内
//可以访问外部类的所有成员
public void _output(){
System.out.println("a1=" +a1);//访问的私有成员
System.out.println("a2="+a2);
fun();
}
}
//只需要实例化就行 然后调用output() 注意作用域
inner_class Inner_class = new inner_class();
Inner_class._output();
}
}//外部类
public class Practice {
public static void main(String[] args) {
Named_local_inner_class A1 = new Named_local_inner_class();
A1.output();
}
}
2.匿名局部内部类
(1)本质还是一个内部类 就是一个类 该类没有名字 (其实是有名字的 但我们看不见 系统分配)
(2)同时还是一个对象
基本语法
new 类名或接口名(参数列表){
类体
};
interface A2{//接口
public void output();
}
调用匿名内部类
//基于接口的匿名内部类A2
A2 A22 = new A2() {
public void output() {
System.out.println("A2接口匿名调用");
}
};
A22.output();
1.A22对象只使用一次 以后不再使用时用匿名局部内部类
2.A22的编译类型和运行类型(匿名局部内部类 就是XXXXX.外部类名)
如图
package com.wangwang;
import sun.security.rsa.RSAUtil;
public class _main {
public static void main(String[] args) {
//有名的局部内部类
Named_local_inner_class p1 = new Named_local_inner_class();
p1.output();
//匿名的局部内部类
System.out.println("==========");
//基于接口的匿名内部类A2
A2 A22 = new A2(){
public void output(){
System.out.println("A2接口匿名调用");
}
};
A22.output();
System.out.println("A22的运行结果是"+A22.getClass());
}
}
ystem.out.println(“==========”);
//基于接口的匿名内部类A2
A2 A22 = new A2(){
public void output(){
System.out.println(“A2接口匿名调用”);
}
};
A22.output();
System.out.println(“A22的运行结果是”+A22.getClass());
}
}