Java学习记录day9

类与对象

内部类

成员内部类

在一个类的内部定义的类。

public class Outer {
	private int a = 10;
	public void outMethod() {
		System.out.println("这是外部类中的方法");
	}
	// 成员内部类
	public class Inner{
		private int b = 10;
		public void innerMethod() {
			// 外部类的成员变量和方法
			a = 20;
			outMethod();	
			System.out.println("这是内部类中的方法");
		}
	}
}

方法内部类

内部类也可以放在方法内定义,但是注意,方法内部类只能在该类所在的方法的内实例化且不能使用方法的非final局部变量。jdk1.8后取消了在局部内部类中使用的变量必须显示的使用final修饰,编译器默认为这个变量加上final

public class App {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer outer = new Outer();
		outer.test();
	}
}

public class Outer {
	private int a = 10;
	public void show() {
		System.out.println("这是外部类中方法");
	}	
	public void test() {
		// 局部内部类
		class Inner {
			String name;
			public void innerMethod() {
				// 外部类的变量
				a = 30;
				name = "张三";
				System.out.println("这个局部内部类中的方法");
			}
		}
		// 在方法中创建局部内部类的对象
		Inner inner = new Inner();
		inner.innerMethod();
	}
}

静态内部类

在一个类内部定义一个静态内部类:即该内部类可以像其他静态成员一样,没有外部类对象时也能够访问他。

class Outer{
	static class Inner{
		System.out.println("这个静态内部类中");
	}
}
class Test{
	public static void main(String[] args){
		Outer.Inner n = new Outer.Inner();
	}
}

匿名内部类

匿名内部类就是没有名字的内部类,有三种:
1.继承式的匿名内部类

class Outer{
	public void printl(){
		Eat eat = new Eat(){
			public void eat(){
				System.out.println("继承式匿名内部类");
			}
		};
		eat.eat();
	}
}
public abstract Eat{
	public abstract void eat();
}
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer outer = new Outer();
		outer.printl();
	}
}

2.接口式的匿名内部类

//将继承式中的抽象类改为接口类即可

3.参数式的匿名内部类

class Outer{
	public void printl(Eat eat){
		eat.eat();
	}
}
public nterface Eat{
	public void eat();
}
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer outer = new Outer();
		outer.printl(new Eat(){
			public void eat(){
				System.out.println("参数式匿名内部类");
			}
		});
	}
}

综合使用:

//接口
public interface Usb {
	public void connected();
}
//定义usb设备
public class Computer {
	public void connect(Usb usb) {
		System.out.println("电脑连接usb外设");
		usb.connected();
	}
}
//匿名内部类
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Computer computer = new Computer();
		computer.connect(new Usb() {	
			@Override
			public void connected() {
				// TODO Auto-generated method stub
				System.out.println("连接打印机");
			}
		});	
		computer.connect(new Usb() {		
			@Override
			public void connected() {
				// TODO Auto-generated method stub
				System.out.println("连接鼠标");
			}
		});		
		Usb usb = new Usb() {			
			@Override
			public void connected() {
				// TODO Auto-generated method stub
			}
		};
		computer.connect(usb);
	}
}

使用原则:

  1. 不能有构造方法,只能有一个实例;
  2. 不能定义任何静态成员,静态方法;
  3. 不能是public、protectde、private、static;
  4. 一定在new的后面,用其隐含实现一个接口或实现一个类;
  5. 匿名内部类为局部的,所以局部内部类的所有限制对其都生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值