类中还有类就是内部类
一.成员内部类
代码语言:javascript复制public class Text {
class innerClass{//成员内部类
int id = 88;//定义属性
public innerClass(){//定义构造方法
}
public void inf(){//内部成员方法
System.out.println("内部类id=" id);
}
}
innerClass in = new innerClass();//创建内部类对象
public void diaoy(){
in.inf();//调用内部类方法
}
public static void main(String[] args) {
Text text = new Text();
text.diaoy();
Text.innerClass class1 = text.new innerClass();//在main方法中创建类的内部类
//外部类.new 创建内部类
class1.inf();
}
}
成员内部类是最普通的内部类,它的定义为位于另一个类的内部。
看起来innerClass 像该类的一个成员。该类称为外部类,内部类可以无条件访问外部类。
外部类访问内部类需要创建一个对象。
内部类依附外部类而存在,要创建内部类,先要创建外部类的对象。
二.局部内部类
该类访问仅限于方法内和该作用域内
代码语言:javascript复制public class Text2 {
int qq = 1397995240;
int tel = 151888;
public outClass action(String x){
class innerClass2 implements outClass{//在方法体中创建内部类,局部内部类
int tel = 888151;
public innerClass2(String s){//局部内部类构造方法
s = x;
System.out.println(s);
System.out.println(qq);//内部类可以无条件访问外部类成员
//如果重名 会显示内部类成员,此时若访问外部成员或方法需要指明
System.out.println(tel);
System.out.println(Text2.this.tel);//外部类.this.成员变量
}
}
new innerClass2("do");//外部类要访问内部类成员 必须先创建这个类的对象
//然后通过这个类来访问
//若需要返回值, 由于外部没有这个类 可以创建一个接口 实现向上转型
//则上面的 new innerClass2("do");可以去掉
//返回值由void改为接口名; 类要继承这个接口 ;然后返回新建类型
return new innerClass2("do");
}
public static void main(String[] args) {
Text2 text2 = new Text2();
text2.action("局部内部类");
}
}
interface outClass{
}
三.匿名内部类
写法相当于注释掉的内容
代码语言:javascript复制public class Text3 {
public out aOut(){
// return new inner();
//只有在使用的时候才写方法体 不知道叫什么名字
return new out() {
private int i = 0;
public int getV(){
return i;
}
};//直接写方法体
}
public static void main(String[] args) {
Text3 text3 = new Text3();
}
}
interface out{
}
//class inner implements out{
// private int i = 0;
// public int getV(){
// return i;
// }
//}
四.静态内部类
我们可以将main方法写在静态内部类当中,有一个调试的功能
它不能使用外部类的非static方法
代码语言:javascript复制public class Text4 {
static int i = 0;
static class innerClass4{
public static void main(String[] args) {
System.out.println(i);
}
}
}
内部类的继承
代码语言:javascript复制public class Text {
class innerClass{//成员内部类
int id = 88;//定义属性
public innerClass(){//定义构造方法
}
public void inf(){//内部成员方法
System.out.println("内部类id=" id);
}
}
public static void main(String[] args) {
Text text = new Text();
NewClass newClass = new NewClass(text);
newClass.inf();
}
}
class NewClass extends Text.innerClass{//继承方式ClassA.ClassB
public NewClass(Text text){//需要有一个参数的构造方法,这个参数则是外部类的对象
text.super();//调用外部类的方法 只有这样才能为外部类提供对象引用
}
}