Java内部类分为四种
成员内部类、静态内部类、匿名内部类、局部内部类。
以下放上实现代码:
1.成员内部类
class A {
public A() {
}
class AB{
}
}
注意事项:
1.如果要使用成员内部类,必须先创建包含它的类对象,在类对象中创建成员内部类对象。
2.如果成员内部类和包含它的类的属性名冲突,则谁的引用调用的就是谁的方法和属性,各自是各自的。
3.成员内部类无条件使用包含它的哪个类对象的所有方法和属性,因为成员内部类是这个类的一部分。
4.当成员内部类要调用外部类的(重名的)属性和方法时语法是 外部类类名.this.属性名或方法名
5.成员内部类持有外部类的引用,所以才可以使用外部类的东西的。A.this
实例化成员内部类的方法:因为成员内部类并不是静态的所以我们首先肯定需要一个外部类对象。通过外部类对象来实例化内部类。
第一种就是在外部内里直接创建一个内部类对象
第二种则是
A a = new A();
A.AB ab = a.new AB();
静态内部类:(不依赖外部类)
class A{
static class AB{
int a = 10;
void print() {
System.out.println(a);
}
}
}
相当于我们类的一个静态的数据类型
创建方式
A.AB ab = new A.AB();
ab.print();
友情提示,静态内部类内部的属性方法并不是静态的哦。不能直接调用
匿名内部类(用的最多的一种)
一般用于对方法的重写,不建议添加方法,因为你即使添加方法,也没办法调用那个方法啊,它的那个参数类型是父类引用
在其中对类方法的重写。(匿名内部类没有构造器)
class Test1{
private double radius = 0;
public static void main(String[] args){
System.out.println(new A() {
String print() {
return "www";
}
}.print());
}
}
class A{
String print() {
return "asdf";
}
}
局部内部类:
定义在一个方法或者一个作用域内的类。
它的访问范围仅限于方法或者作用域内。
class Test1{
public static void main(String[] args){
A a = new A().getM();
}
}
class A{
A getM() {
class M extends A{
void print() {
System.out.println("asdf");
}
}
return new M();
}
}
注意:
匿名内部类和局部内部类可以使用类的成员变量和成员函数
如果调用同名的则需要使用 外部类名.this.属性名/方法名
内名内部类和局部内部类可以使用方法内的局部变量,但是此局部变量必须是final类型的常量,如果这个变量没有被final修饰,只赋值过一次也可以使用。
原因是,如果这个函数执行完了,而匿名内部类和局部内部类可能才要执行。但是方法结束之后方法内的变量也就失去了。而为了不影响匿名内部类和局部内部类的方法执行,JVM会将使用的局部变量的值复制一份到匿名。。。对象中。然而为了保持一致,就需要让哪个值被final修饰。(这里提一下,局部变量不会自动初始化)
以下是测试代码,
class Test1{
public static void main(String[] args){
A a = new A();
B b = a.getB();
a.a = 50;
b.print();
}
}
class A{
int a = 10;
int b = 20;
B getB(){
class DC extends B{
void print() {
System.out.println(a);
System.out.println(b);
}
}
return new DC();
}
}
class B{
void print() {
}
}