Java之内部类

内部类

在Java中可以将一个类定义在另一个类的内部
内部类可以定义在 类的内部(与类成员层次一致)
内部类可以定义在 方法/块内部(与类成员相差一个层次 与方法的局部变量一个层次)

  1. 成员内部类
    将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
    成员内部类可以与正常类一样 可以用不同的修饰符来修饰
    好处1. 省略了一个.java文件
    好处2. 成员内部类中可以访问外部类的所有成员 包括私有
    若想要在内部类中通过对象**.调用外部类成员 要使用外部类.this.外部类成员**的形式
    内部类存在后 源码进行编译 产生一个字节码 Demo$InnerDemo.class

  2. *局部内部类
    将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
    局部内部类像是一个局部变量一样,不能用public protected private及static
    只能用final或abstract
    局部内部类命名规则 Demo$1InnerTestMethod Demo$2InnerTestMethod
    局部内部类可以访问外部成员,也可以访问局部变量,但是要求局部内部类中使用的变量都需要加final修饰
      因为局部内部类 编译之后字节码就已经定义好了,而普通变量的内容是可以改变的,所以要加final修饰,保证变量在编译之后无法改变内容

public class Demo {
	private String name = "这是正常类中的属性";
	public void testDemo() {
		System.out.println("这是正常类中的方法");
	}
	
	public void testDemoOne() {
		String s = "abc";
		//定义局部内部类
		class InnerTestMethod{
		}
	}
	public void testDemoTwo() {
		//定义局部内部类
		class InnerTestMethod{	
		}
	}
	//成员内部类
	public class InnerDemo{
		private String name = "我是内部类的属性";
		public void testInnerDemo() {
			System.out.println("我是成员内部类的方法"+this.name);
			Demo.this.testDemo();
		}
	}
}
  1. *匿名内部类
    成员匿名内部类
    局部匿名内部类
public interface Test{
	public void test();
}
public class Son implements Test{
	public void test(){
	}
}
//多态
Test t = new Son();
//匿名内部类
public interface Test{
	public void test();
}
Test t = new Test(){
	public void test(){
	}
};
**通常接口或抽象类的具体子类这样写**
开发中为了省略一个类文件 用上述方法

匿名内部类很特殊只有类体,没有类的所有结构(修饰符 名字 继承 实现)
不能用任何修饰度来修饰,匿名内部类也没有构造方法(因为它连名字都没有)

  1. 静态内部类
    成员静态内部类
    不需要外部类对象,通过正常的方式直接创建内部类
    静态元素不能访问非静态成员(自己类和外部类)
package innerclass;

public class Demo {
	private String name = "这是正常类中的属性";
	public void testDemo() {
		System.out.println("这是正常类中的方法");
	}
	
	public void testDemoOne() {
		String s = "abc";
		//定义局部内部类
		class InnerTestMethod{
			String s = "asd";
			
		}
	}
	public void testDemoTwo() {
		//定义局部内部类
		class InnerTestMethod{
			public void testInnerInnerTestMethod() {
				System.out.println("我是局部内部类的方法");
			}
			
		}
	}
	//成员内部类
	public class InnerDemo{
		private String name = "我是成员内部类的属性";
		public void testInnerDemo() {
			System.out.println("我是成员内部类的方法 "+ this.name);
			//通过 外部类.This.外部成员 访问外部类成员
			Demo.this.testDemo();
		}
	}
	//静态内部类
	public static class InnerDemoStatic{
		String name = "InnerDemoStatic";
		public void testInnerDemoStatic() {
			System.out.println("我是静态内部类的方法" + name);
		}
	}
}
package innerclass;
import innerclass.Demo.InnerDemo;
import innerclass.Demo.InnerDemoStatic;

public class TestMain {
	public static void main(String[] args) {
		// 创建外部类对象
		Demo demo = new Demo();
		//通过外部类对象.创建成员内部类
		InnerDemo innerDemo = demo.new InnerDemo();
		innerDemo.testInnerDemo();
		//静态内部类和普通类一样直接创建
		InnerDemoStatic ids = new InnerDemoStatic();
		ids.testInnerDemoStatic();
	}
}
/*
我是成员内部类的方法 我是成员内部类的属性
这是正常类中的方法
我是静态内部类的方法InnerDemoStatic
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值