内部类的作用
2016-03-15 17:50
393 查看
一、写在类内部的 有名字的类
1.区别于普通类一:写在类里面的类
2可以当做静态成员访问 p.innerClassA=p.getclassA()
3.隐藏内部实现细节,生成高效率代码
二、写在方法内部的类 分为有名的 和匿名的
1.方法内的 内部类
class A{
interface/abstract C method(){
class B implements interfaceC {};
return new B()
}
}
注意定义到方法内部,要返回接口或者抽象类,编译即使不调用也编译,作用范围是方法内部
2.方法内某个作用域的内部类
class A{
void method(boolean a){
if(a){
class B implements interfaceC {};
}
}
}
3、方法内的匿名类,因为没有名字 所有没有构造器 要遵循原始的默认的
传递参数的
class A{
interfaceC method(string x){
return new interfaceC(x) {};
}
}
不传递参数 引用外部的变量 要把被引用变量用final来修饰
class A{
interfaceC method(final string x){
return new interfaceC( ) {string a=x};
}
}
4.链接到外部类
普通内部类可以直接访问外部类的成员 甚至是私有的
三.static内部类(特殊)
创建静态内部类,不需要创建外部类
不能从static内部类的一个对象中访问一个外部类对象
静态内部类不能访问外部的非静态变量
静态类可以自测
class TestBed {
TestBed() {}
void f() { System.out.println("f()"); }
public static class Tester {
public static void main(String[] args) {
TestBed t = new TestBed();
t.f();
}
}
}
运行java TestBed$Tester命令可以自测
四、创建外部类
public class Parcel11 {
class Contents {
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() { return label; }
}
public static void main(String[] args) {
Parcel11 p = new Parcel11();
Parcel11.Contents c = p.new Contents();
Parcel11.Destination d =
p.new Destination("Tanzania");
}
}
五。内部类集成,内部类构建器必须同封装类对象的一个句柄联系到一起 具体这里还不是特明白,感觉自己应该去读一读java运行原理运行机之类神马的
class WithInner {
class Inner {}
}
public class InheritInner
extends WithInner.Inner {
//! InheritInner() {} // Won't compile
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
六、继承后内部类执行顺序
1.一个类继承一个有内部类的类,则构造函数执行方法为:
执行外部父类构造函数,然后再执行 继承外部类的构造函数
也就是说内部类不被初始化
2.如果是A外部类继承B外部类,且A的内部类继承B的外部类B.innerclass,则执行的顺序是,
执行B内部构造函数,执行B构造函数 ,执行A构造函数
七、内部类编译后的class命名规则
封装类(外部类)$内部类名$内部类名....class
如果是匿名类 会生成一串数字
八、内部类的控制框架的作用,一个框架是一个整体,其他类负责完成部分功能
1.区别于普通类一:写在类里面的类
2可以当做静态成员访问 p.innerClassA=p.getclassA()
3.隐藏内部实现细节,生成高效率代码
二、写在方法内部的类 分为有名的 和匿名的
1.方法内的 内部类
class A{
interface/abstract C method(){
class B implements interfaceC {};
return new B()
}
}
注意定义到方法内部,要返回接口或者抽象类,编译即使不调用也编译,作用范围是方法内部
2.方法内某个作用域的内部类
class A{
void method(boolean a){
if(a){
class B implements interfaceC {};
}
}
}
3、方法内的匿名类,因为没有名字 所有没有构造器 要遵循原始的默认的
传递参数的
class A{
interfaceC method(string x){
return new interfaceC(x) {};
}
}
不传递参数 引用外部的变量 要把被引用变量用final来修饰
class A{
interfaceC method(final string x){
return new interfaceC( ) {string a=x};
}
}
4.链接到外部类
普通内部类可以直接访问外部类的成员 甚至是私有的
三.static内部类(特殊)
创建静态内部类,不需要创建外部类
不能从static内部类的一个对象中访问一个外部类对象
静态内部类不能访问外部的非静态变量
静态类可以自测
class TestBed {
TestBed() {}
void f() { System.out.println("f()"); }
public static class Tester {
public static void main(String[] args) {
TestBed t = new TestBed();
t.f();
}
}
}
运行java TestBed$Tester命令可以自测
四、创建外部类
public class Parcel11 {
class Contents {
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() { return label; }
}
public static void main(String[] args) {
Parcel11 p = new Parcel11();
Parcel11.Contents c = p.new Contents();
Parcel11.Destination d =
p.new Destination("Tanzania");
}
}
五。内部类集成,内部类构建器必须同封装类对象的一个句柄联系到一起 具体这里还不是特明白,感觉自己应该去读一读java运行原理运行机之类神马的
class WithInner {
class Inner {}
}
public class InheritInner
extends WithInner.Inner {
//! InheritInner() {} // Won't compile
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
六、继承后内部类执行顺序
1.一个类继承一个有内部类的类,则构造函数执行方法为:
执行外部父类构造函数,然后再执行 继承外部类的构造函数
也就是说内部类不被初始化
2.如果是A外部类继承B外部类,且A的内部类继承B的外部类B.innerclass,则执行的顺序是,
执行B内部构造函数,执行B构造函数 ,执行A构造函数
七、内部类编译后的class命名规则
封装类(外部类)$内部类名$内部类名....class
如果是匿名类 会生成一串数字
八、内部类的控制框架的作用,一个框架是一个整体,其他类负责完成部分功能
相关文章推荐
- MarkdownPad 2 注册码 RSA私钥
- servlet-api-2.4.jar not loaded解决方法
- 选择器Selector的使用
- android 跟随手指移动的 view
- 本地音乐播放器(一)——简介篇
- solution Of Pat 1111. Online Map (30)
- 想成为前端工程师?希望读完这篇文章能对你有所帮助。
- linux 使用/proc文件系统 实现用户空间与内核模块之间通信
- 局域网无法访问vmware虚拟机WEB服务器解决办法
- 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼【转】
- yum install出错问题
- 关于serialVersionUID的说明
- 使用lua实现几个小算法
- css简写属性格式
- Struts2从一个action转到另一个action的两种方法
- Android 中 View 炸裂特效的实现分析
- HashMap的应用,CF650A
- Hdu 1050
- IOS的KVO不能监听的场景
- Mac终端常见命令