局部内部类
- 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
- 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
- 限制类的使用范围
public class Demo03 {
private String name="曹和宇";
private int age=20;
public void show(){//若是变为静态方法,则需要创建对象才能去调用外部类的属性
//定义局部变量
String address="西安";
// Demo03 name = new Demo03();
// Demo03 age = new Demo03();
//局部内部类(和局部变量级别是相同的)
class Inner{//前面不能再加任何的访问修饰符
//局部内部类的属性
private String phone="15484684631";
private String email="3534663573@qq.com";
public void show2(){
//访问外部类的属性
System.out.println(Demo03.this.name);//这样写较为规范
System.out.println(age);
//访问内部类属性
System.out.println(this.phone);//较为规范
System.out.println(email);
//访问局部变量,jdk1.7要求局部变量必须是常量(final),jdk1.8后会自动添加final关键字
System.out.println(address);
}
}
Inner inner = new Inner();
inner.show2();
}
}
若show变为静态方法,则需要创建对象才能去调用外部类的属性。原因是静态方法不能访问非静态的成员,因为静态属性是类的属性,不是单个成员的属性
public class Test03 {
public static void main(String[] args) {
Demo03 outer = new Demo03();
outer.show();//不会有任何输出结果,因为这里调用show方法只是起到了定义一个局部变量的作用,并未用到内部类,想要输出结果,则需要在方法内部创建内部类的对象
}
}
测试类中创建的是外部类对象,这是因为局部内部类对象的作用范围只有在show方法中,在测试类中是new不出来的,所以要通过new外部类对象来调用show方法从而使用局部内部类。而要想使用局部内部类,还需要在方法内部创建内部类的对象
输出结果为
曹和宇
20
15484684631
3534663573@qq.com
西安
匿名内部类
- 没有类名的局部内部类(一切特征都与局部内部类相同)
- 必须继承一个父类或者实现一个接口
- 定义类,实现类,创建对象的语法合并,只能创建一个该类的对象
- 优点:减少代码量
- 缺点:可读性较差
首先我们来实现一个简单的接口
//接口
public interface Demo04 {
void service();
}
public class Mouse implements Demo04{
@Override
public void service() {
System.out.println("连接电脑成功,鼠标开始工作");
}
}
public class Test04 {
public static void main(String[] args) {
//创建接口类型的变量
Demo04 usb=new Mouse();//多态,相当于用接口创建一个变量,我们来研究一个具体的实现类
usb.service();
}
}
输出结果为
连接电脑成功,鼠标开始工作
这个接口同样可以通过以下代码来实现
public class Test04 {
public static void main(String[] args) {
//创建接口类型的变量
// Demo04 usb=new Mouse();//多态,相当于用接口创建一个变量,我们来研究一个具体的实现类
// usb.service();
//局部内部类
class Key implements Demo04{//实现接口的局部内部类
@Override
public void service() {
System.out.println("键盘连接成功");
}
}
//使用局部类创建对象
Demo04 usb=new Key();
usb.service();
}
}
相当于局部内部类直接充当了接口的实现类
输出结果为
键盘连接成功
还可以再次用匿名内部类优化一下
public class Test04 {
public static void main(String[] args) {
//创建接口类型的变量
// Demo04 usb=new Mouse();//多态,相当于用接口创建一个变量,我们来研究一个具体的实现类
// usb.service();
//局部内部类
// class Key implements Demo04{//实现接口的局部内部类
// @Override
// public void service() {
// System.out.println("键盘连接成功");
// }
// }
//使用局部类创建对象
// Demo04 usb=new Key();
// usb.service();
//使用匿名内部类优化(相当于创建了一个局部内部类)
Demo04 usb=new Demo04() {//这里不一定非得是接口,也可以是抽象类/父类
@Override
public void service() {
System.out.println("连接电脑成功");
}
};
usb.service();
}
}
Object类
概述
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层
- 任何类,如没有书写extends显示某个类,都默认直接继承Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Object类型可以存储任何对象
- 作为参数,可接受任何对象
- 作为返回值,可返回任何对象