常用类
内部类
概念
在一个类的内部定义个完整的类
主要分为以下几种
- 成员内部类(与main方法同级)
- 静态内部类(static修饰类)
- 局部内部类(在类的方法中定义的类)
- 匿名内部类(一般是对某抽象类或接口直接new对象时生成)
成员内部类
格式:
package com.wjs.properise;
public class A {
public static void main(String[] args) {
}
class B{
}
}
特点
- 类B可以直接访问类A的所有的变量和方法,无论是否私有化
- 外部类A不可以直接访问类B的变量或方法,需要创建对象访问
- 如果内部类的方法或变量与外部类一样,则触发隐藏现象,内部类访问外部类变量时需要使用this关键字(外部类名.this.内部类名)
public class A {
private String name;
public static void main(String[] args) {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
class B {
private String name;
public B(String name) {
//A.this
A.this.name = this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
静态内部类
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
- 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)。
import java.util.Scanner;
public class AAA {
int age;
static String sex;
public static void main(String[] args) {
//method();报错,找不到方法method
B b = new B();
//输出B中的名字
System.out.println(b.name);
//调用B中的方法
b.method();
}
static class B {
static String name = "朴实无华的小韦";
public static void method() {
Scanner scanner = new Scanner(System.in);
sex = scanner.next();
//age = 15;无法从 static 上下文引用非 static 字段 'age'
}
}
}
局部内部类
特点:访问权限仅在方法内或作用域内,且不能用任何修饰符修饰
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。
package com.wjs.properise;
public class AAA {
public static void main(String[] args) {
method();
}
public static void method(){
//因为类声明在下方所以不可以在类还没被内存创建时使用
//B b = new B();
class B{
private String name = "这里是局部内部类";
public void method(){
System.out.println("这里是局部内部类方法!");
}
}
B b = new B();
b.method();
}
}
匿名内部类
- 没有类名的局部内部类(一切特征都与局部内部类相同)。
- 必须继承一个父类或者实现一个接口。
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
- 优点:减少代码量。
- 缺点:可读性较差。
- 匿名内部类没有构造方法。也是唯一没有构造方法的内部类。匿名内部类和局部内部类只能访问外部类的final变量。
public class A{
public static void main(String[] args) {
Test t = new Test() {
@Override
public void test() {
System.out.println("实现了接口Test!");
}
};
t.test();
}
}
public interface TestT {
public static final String name = "";
void test();
public static void j(){
System.out.println("面具带笑");
}
}