类与对象
内部类
成员内部类
在一个类的内部定义的类。
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);
}
}
使用原则:
- 不能有构造方法,只能有一个实例;
- 不能定义任何静态成员,静态方法;
- 不能是public、protectde、private、static;
- 一定在new的后面,用其隐含实现一个接口或实现一个类;
- 匿名内部类为局部的,所以局部内部类的所有限制对其都生效。