- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
- 内部类允许继承多个非接口类型(具体将在以后的内容进行讲解)
1.成员内部类
1.因为内部类相当于成员变量,所以内部类可以使用任意的访问修饰符
2.内部类可以直接访问外部类的所有属性和方法,反之则不行
3.内部类必须由外部类来创建
内部类 对象名 = 外部类对象.new 内部类();
注:成员内部类不能含有 static 的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的。
2.静态内部类
public class StaticInnerClass {
private static int ID=2020250131;
public int Id=2020251163;
static String name="chenhaixinag";
/**
* @author 陈海翔
* 静态内部类不能访问外部类的非静态成员,但可以通过(new 外部类().成员)的方式访问
*/
public static class Student{
String name="KKword";
public void Info(){
System.out.println("访问外部类的同名静态成员"+StaticInnerClass.name);
System.out.println("访问外部类的成员"+ID);
System.out.println("访问内部类的静态成员"+name);
System.out.println("访问外部类的非静态成员"+new StaticInnerClass().Id);
}
}
3.局部内部类
//在方法中定义局部内部类
public void Info(){
final String name="chenhaixiang";
class Student{
final int Id=2020250134;
public void print(){
System.out.println("访问外部类的方法中的常量"+name);
System.out.println("访问内部类中的方法中的常量"+Id); }}
Student a=new Student();
a.print();
}
//在作用域中定义局部内部类
public void info(boolean a){
if(a==true){
final String name="chenhaixiang";
class Student{
final int Id=2020250134;
public void print(){
System.out.println("访问外部类的方法中的常量"+name);
System.out.println("访问内部类中的方法中的常量"+Id); }}
Student c=new Student();//方法中的对象不能重名
c.print();
}
}
4.匿名内部类
当内部类所在的方法的形参需要在内部类里面使用时,该形参必须为 final.
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
匿名内部类是不能加访问修饰符的
interface Inner {
String getName();
}
public class Outer {
public Inner getInner(final String name, String city) {
return new Inner() {
private String nameStr = name;
@Override
public String getName() {
return nameStr;
}
};
}
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.getInner("Inner", "NewYork");
System.out.println(inner.getName());
}
}
143

被折叠的 条评论
为什么被折叠?



