java中内部类
package com.xt.instanceoftest; import com.xt.instanceoftest.Body.Heart; public class StaticInnerClass { //静态内部类必须直接定义在外部类中 static class Student{ public void study() { System.out.println("xuexi..."); } } public static void main(String[] args) { Student s = new Student() { }; s.study(); class S extends Student{ } Student s1=new S(); s1.study(); Heart heart = new Body.Heart(); } }
//只有静态有名内部类才能定义静态代码块,静态变量 ,静态方法。 static class Mammal{ static { } static int a=0; static void print() { } }
package com.xt.instanceoftest; public class PrivateInnerClass { //son 是一个上转型对象 而上转型对象是不能调用子类新增的成员变量和方法的 public static void main(String[] args) { new Parent() {//匿名内部类不能有构造方法,不能使抽象类 因为都没名字 无法被new和继承 int a;//这些新增的属性和方法是不能被上转型对象调用的 public void walk() { System.out.println("子类走。。。"); } }; } } class Parent{ public void walk() { System.out.println("父类走。。。"); } }
有名内部类
1 package com.xt.innerClass; 2 3 public class Body { 4 5 class Heart{ 6 public void beat() { 7 System.out.println("心脏在跳动。。"); 8 } 9 } 10 11 public static void walk() { 12 System.out.println("身体在走路。。"); 13 } 14 15 public static void main(String[] args) { 16 Body body = new Body(); 17 Body.walk(); 18 Heart heart = body.new Heart(); 19 heart.beat(); 20 } 21 }
内部类不能在默认包中!!!!!!!!!!!!!!
重点是匿名内部类
匿名内部类必须是继承父类(普通类 抽象类)的子类或接口的实现类
匿名内部类没有构造方法:因为他本来就没有类名,所有也就没有new 类名()这一说了,
匿名内部类不能使抽象类:因为没有类名,不能被其他类继承。
注意!!!!!!!!可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用
上转型对象是不能调用子类新增的成员变量和方法的
静态内部类只能定义在外部类里面
只有静态有名内部类才能定义静态代码块,静态变量 ,静态方法。
静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
内部类可以直接定义在类中,也可以定义在方法或代码块中;其中直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);但是定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。
内部类可以访问外部类的所有访问权限的成员变量
在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。