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 stubOuter 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 stubOuter 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 stubOuter 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 stubComputer computer = new Computer();computer.connect(new Usb() { @Overridepublic void connected() {// TODO Auto-generated method stubSystem.out.println("连接打印机");}}); computer.connect(new Usb() { @Overridepublic void connected() {// TODO Auto-generated method stubSystem.out.println("连接鼠标");}}); Usb usb = new Usb() { @Overridepublic void connected() {// TODO Auto-generated method stub}};computer.connect(usb);}
}
使用原则:
- 不能有构造方法,只能有一个实例;
- 不能定义任何静态成员,静态方法;
- 不能是public、protectde、private、static;
- 一定在new的后面,用其隐含实现一个接口或实现一个类;
- 匿名内部类为局部的,所以局部内部类的所有限制对其都生效。