java中的内部类的用法
2015-07-20 14:44
267 查看
今天实训课上讲了内部类,发现还有很多生疏的地方,老师说内部类也是面试的要点,所以有必要总结下java中内部类的用法;
换种方式说允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”
作用:
a.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;
b.内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
c.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便;
分类:(这里大体分为四种)
a.成员内部类、b.静态内部类、c.方法内部类、d.匿名内部类
a. 成员内部类定义在外部类的内部,相当于外部类的一个成员变量的位置,
成员内部类可以使用任意访问控制符,如 public、protected 、private等
b. 成员内部类的方法可以直接访问外部类的所有数据,包括私有的数据
c. 定义了成员内部类后,必须使用外部类对象来创建内部类对象
即:内部类 对象名 = 外部类对象.new 内部类();
d. 成员内部类class文件格式:外部类名$内部类名.class
提示:
a. 外部类是不能直接使用内部类的成员和方法
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法
b. 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员;
自己的成员变量或方法,如果要访问外部类的成员变量,可以使用this关键字,
(内部类默认拥有对外部类对象的引用:外部类名.this)
c. 外部类的外部要声明完整,如外部类名.内部类名,外部类内部则不需要;
例:
public class Outer{
private int a = 99;
int b = 3;
public class Inner{
int b = 2;
public void test(){
System.out.println("访问外部类中的a:"+a);
System.out.println("访问外部类中的b:"+Outer.this.b);
}
}
public static void main(String[ ] args){
Outer o = new Outer();
Inner i = o.new Inner();
i.test();
}
}
但可以通过 new 外部类().成员 的方式访问
b. 如果外部类的静态成员与内部类的成员名称相同,
可通“类名.静态名”访问外部类的静态成员;
如果外部类的静态成员与内部类的成员名称不相同,
则可通过“成员名”直接调用外部类的静态成员
c. 创建静态内部类中的对象时,不需要外部类的对象,
可以直接创建:内部类名 对象名 = new 内部类名();
d. 在其它类中创建内部类的对象,不需要用外部类对象创建,
外部类名.内部类名 对象名 = new 外部类名.内部类名();
例:
public class Outer{
private int a = 99;
static int b = 1;
public static class Inner{
int b = 2;
public void test(){
System.out.println("外部类的b:"+Outer.b);
System.out.println("内部类的b:"+b);
System.out.println("外部类的非静态变量a:"+new Outer().a);
}
}
public static void main(String[ ] args){
Inner inner = new Inner();
inner.test();
}
}
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用
注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类,
不能使用访问控制符和static修饰符,只能访问内部类所在方法的final变量
(方法内部类自动拥有外部类对象的引用:外部类名.this)
例:
public class Outer{
int c = 18;
public void show(){
final int a = 25;
int b = 13;
class Inner{
int c = 2;
public void print(){
System.out.println("外部类所在方法的常量a:"+a);
System.out.println("内部类的变量c:"+c);
System.out.println("外部类的全局变量c:"+Outer.this.c);
}
}
Inner inner = new Inner();
inner.print();
}
public static void main(String[ ] args){
Outer outer = new Outer();
outer.show();
}
}
匿名内部类:
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称
b. 内部类可以和普通类一样使用构造方法和普通初始化块
一.内部类的定义作用及分类
定义:内部类就是定义在另外一个类中的类,与之对应包含内部类的类被称为外部类;换种方式说允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”
作用:
a.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;
b.内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
c.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便;
分类:(这里大体分为四种)
a.成员内部类、b.静态内部类、c.方法内部类、d.匿名内部类
二.成员内部类的使用(也称为实例内部类)
成员内部类的使用方法:a. 成员内部类定义在外部类的内部,相当于外部类的一个成员变量的位置,
成员内部类可以使用任意访问控制符,如 public、protected 、private等
b. 成员内部类的方法可以直接访问外部类的所有数据,包括私有的数据
c. 定义了成员内部类后,必须使用外部类对象来创建内部类对象
即:内部类 对象名 = 外部类对象.new 内部类();
d. 成员内部类class文件格式:外部类名$内部类名.class
提示:
a. 外部类是不能直接使用内部类的成员和方法
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法
b. 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员;
自己的成员变量或方法,如果要访问外部类的成员变量,可以使用this关键字,
(内部类默认拥有对外部类对象的引用:外部类名.this)
c. 外部类的外部要声明完整,如外部类名.内部类名,外部类内部则不需要;
例:
public class Outer{
private int a = 99;
int b = 3;
public class Inner{
int b = 2;
public void test(){
System.out.println("访问外部类中的a:"+a);
System.out.println("访问外部类中的b:"+Outer.this.b);
}
}
public static void main(String[ ] args){
Outer o = new Outer();
Inner i = o.new Inner();
i.test();
}
}
三.静态内部类的使用
静态内部类是static修饰的内部类,这种内部类的特点是:
a. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
b. 如果外部类的静态成员与内部类的成员名称相同,
可通“类名.静态名”访问外部类的静态成员;
如果外部类的静态成员与内部类的成员名称不相同,
则可通过“成员名”直接调用外部类的静态成员
c. 创建静态内部类中的对象时,不需要外部类的对象,
可以直接创建:内部类名 对象名 = new 内部类名();
d. 在其它类中创建内部类的对象,不需要用外部类对象创建,
外部类名.内部类名 对象名 = new 外部类名.内部类名();
例:
public class Outer{
private int a = 99;
static int b = 1;
public static class Inner{
int b = 2;
public void test(){
System.out.println("外部类的b:"+Outer.b);
System.out.println("内部类的b:"+b);
System.out.println("外部类的非静态变量a:"+new Outer().a);
}
}
public static void main(String[ ] args){
Inner inner = new Inner();
inner.test();
}
}
四.方法内部类和匿名内部类的使用
方法内部类的定义:方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用
注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类,
不能使用访问控制符和static修饰符,只能访问内部类所在方法的final变量
(方法内部类自动拥有外部类对象的引用:外部类名.this)
例:
public class Outer{
int c = 18;
public void show(){
final int a = 25;
int b = 13;
class Inner{
int c = 2;
public void print(){
System.out.println("外部类所在方法的常量a:"+a);
System.out.println("内部类的变量c:"+c);
System.out.println("外部类的全局变量c:"+Outer.this.c);
}
}
Inner inner = new Inner();
inner.print();
}
public static void main(String[ ] args){
Outer outer = new Outer();
outer.show();
}
}
匿名内部类:
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称
五.内部类注意事项
a. 普通实例内部类不能定义静态属性,只有静态实例内部类才能定义b. 内部类可以和普通类一样使用构造方法和普通初始化块
相关文章推荐
- Java:的“==”和equals方法
- SpringMVC学习笔记(二) -- 提交数据至后台controller
- git常见的命令总结
- 《深入浅出struts2》--第二章,初识struts
- android studio导入eclipse或者 android studio工程文件的超简技巧
- Mac下配置JAVA_HOME
- eclipse未能识别我的手机
- spring MVC配置详解
- Java线程池总结
- HashMap底层实现(源码分析)
- Struts2自定义拦截器实例—登陆权限验证
- 百度Java研发面经100题 总结
- 使用Dom4j解析XML
- java 学习书籍-想精通java的必看
- Spring整合DWR comet 实现无刷新 多人聊天室
- [转]JAVA学习路线及推荐书籍
- java反射的补充:桥接方法以及Spring中一些工具类
- Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解<转>
- 4种方法让SpringMVC接收多个对象 <转>
- spring的annotation-driven配置事务管理器详解