|
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。 1.内部类的分类 成员内部类(静态和非静态)和局部内部类(方法内、代码块内、构造器内) 2.成员内部类的理解 一方面,作为外部类的成员:
>调用外部类的结构
>可以被static修饰
>可以被4种不同的权限修饰
另一方面,作为一个类:
> 类内可以定义属性、方法、构造器等
> 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
> 可以被abstract修饰
特点:- 成员内部类可以无条件的访问外部类的所有的成员属性和方法不受 private 和 static影响
- 当内部类的成员属性或者方法与外部类的同名时,会发生隐藏现象。直接在内部类中调用的是内部类的成员属性和方法。需要用 “外部类”.this.成员变量/成员方法
- 如果外部类需要访问内部类,需要生成内部对象,才能访问内部类对象。
- 成员内部类是依附外部类存在的,如果需要访问成员内部类,那么一定需要先创建外部类。
- 由于成员内部类的以为外部类的成员的方式存在,所以类修饰可以用 private public protect 无权限的修饰符修饰来表示内部的访问权限的问题。而外部内不可以。
public class test {
public static void main(String[] args) {
// 创建静态的成员内部类的对象
Person.Inner2 inner2 = new Person.Inner2();
// 创建非静态的成员内部类的对象
Person p = new Person();
Person.Inner1 inner1 = p. new Inner1();
inner1.show(); // name = 小张, age = 23
inner2.show(); // 静态成员内部类
}
}
class Person{
String name;
int age;
// 非静态成员内部类
class Inner1{
public void show(){
name = "小张" ;
age = 23 ;
System.out.println("name = " + name + ", age = "+ age);
}
}
// 静态成员内部类
static class Inner2{
public void show(){
System.out.println("静态成员内部类" );
}
}
public void eat(){
System.out.println("人吃饭" );
}
} |
3.如何在成员内部类中调用外部类的结构? class Person{
String name = "小明" ;
public void eat(){
}
// 非静态成员内部类
class Bird{
String name = "杜鹃" ;
public void display(String name){
System.out.println(name); // 方法的形参
System.out.println( this.name); // 内部类的属性
System.out.println(Person. this.name); // 外部类的属性
// Person.this.eat();
}
}
} |
4.局部内部类 特点:- 不能用访问权限修饰符关键字
- 作用区间只在申明的局部内
5.匿名内部类 特点:- 匿名内部类不能使用 static 和权限修饰符
- 匿名内部没有构造器。通过new XXX 的生成一个对象引用。
- 匿名内部类属于局部内部类,所有局部内部类限制的条件在匿名内部中依然有效
----------------------------
原文链接:https://www.cnblogs.com/897463196-a/p/12596162.html
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2020-03-30 20:34:27 重新编辑]
|
|