关闭

内部类

99人阅读 评论(0) 收藏 举报
分类:
成员内部类:
局部内部类:
匿名内部类:
静态内部类:
不太常用,不像接口用的广泛;
    1、内部类不允许静态变量;
    2、静态内部类不能访问外围类的实例变量;
1、成员内部类


(1) 成员内部类访问外部类的时,包括私有的成员,和静态成员;

(2)外部类访问内部类的时候:
必须先创建内部类的对象,再通过对象来访问
不声明对象的情况下
外围类不可以访问内部类的private成员,
外部类也不能访问内部类的成员方法;
(3)
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。
(4)
实例内部类紧紧地依赖于外围类的对象实例成员类必须通过外围类才能创建;
实例成员类可以访问外围类的静态变量,既可以访问实例变量,也可以访问静态变量;
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。

2、静态成员类

(1)静态内部类不能访问外围类的实例变量
(2)静态内部类可以访问外围类的静态成员变量;
static依赖类
(3)使用静态内部类的时候近似于使用顶层类,只不过是声明在某个类的内部而已
Car2相当于路径
Car2.F2 f2 = new Car2.F2();
静态内部类跟外围类的对象没有关系;不需要首先创建外围类的对象;
静态成员类在不需要创建外围类,不能够访问外围类的实例成员变量
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

3方法类
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
在方法中定义:
   定义在方法中,方法类不能使用static修饰,也不能使用访问修饰符;
  (1) 为什么不能用访问修饰符?
对于局部变量来说:生命周期在方法体内,生命周期出方法体就不存在;加上反而出错;
(2)为什么不能使用static修饰?
对于方法类来说,是定义在方法内部,static跟类有关系,出了方法就不存在了,矛盾关系;
方法类可以实现一个接口
(3)在方法中创建的对象(分配在堆中),却可以在方法结束后继续存在?????,还可以继续调用;
因为在方法中创建的对象是在堆内存中,而不是在栈内存中,而定义的局部变量,当方法结束后该变量就自动被垃圾回收,因为在该方法中定义的变量在栈内存中;
(4)为什么仅能访问final类型变量?
在java中认为一个方法就是一个线程,内存共享的,大家对于aa变量由多个线程执行,到底改成哪个数值不清楚,同一个变量,同时可能有两个甚至更多对他进行修改,所以定义final;
jdk1.8之后方法类也可以访问非final的变量;前提该局部变量仅能被赋值一次;
方法类最常见的用处就是实现一个接口,然后在方法中返回类的对象;
4、匿名内部类:
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
经常声明在方法内部的类
,仅能访问方法中的final局部变量
jdk1.8之后,会访问非final局部变量;
只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

内部类的标识:“;'
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17934次
    • 积分:708
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:5篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论