内部类详解

今天学习了内部类。

首先什么是内部类?由“内部”这两个字我们就不难理解内部类就是定义在某个类内部的类,那么被内部类嵌入的那个类自然称为外部类。简单的表达起来就是class Parents{

public class Children{public void study(){System.out.println("好好学习,天天向上");}

}此处Children即为内部类。

内部类可以直接访问外部类中的所有属性,包括private修饰的属性或方法。

总结与收获:通过这两天的学习,正在把以前以往的知识渐渐的补回来。原本早就记不清的成员内部类,局部内部类和匿名内部类的区别和写法,通过今天的学习已经理解并且能运用到编程中。不过编程过程中一开始对于如何测试局部内部类和匿名内部类不太熟练,还需在加强锻炼。

作业题:
1、内部类的形式是怎样的?
内部类有四种形式:分别是成员内部类(位于另一个类的内部),匿名内部类(唯一没有构造器的类,在编写事件监听代码时常使用),局部内部类(定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内)和静态内部类(类前有static修饰)。
2、为什么要有“内部类”?
内部类产生对象必须有一个重要的前提条件,那就是它的外部类对象必须先创建,通过外部类的对象构建内部类对象,有两种方法:其中之一就向上面那样,外部类有一个public方法生产内部类的对象;其二是通过外部类对象实现。内部类的另一个重要特性是:它可以不受限制的访问其所在外部类的域。java可以实现多个接口,implements inerfaceA, interfaceB。但是不允许多重继承类,如果你确实需要利用例外的类来操控本类的成员,可以利用内部类满足这个需要,
3、利用内部类可以方便实现哪些功能?
利用内部类可以不受限制的访问外部类的域和方法。同时,可根据限制条件让内部类隐藏或向上转型为接口类型,从而消除方法返回的具体类型的限制。匿名内部类可以隐藏接口的具体实现,使得类的使用者只关注要实现的目标。
4、内部类的实现机制?
是封装和隐藏吗?(同求解答!!!)
5,内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
在静态内部类下,不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。如果不是静态内部类,则可以无限制引用他的包含类。
编程题:
一.
1>instrument接口:
public interface instrument {
public abstract void play();
}
2>主类instrumentsTest:
public class InstrumentsTest {


/**
@param  args the command line arguments
*/
/************成员内部类**************/
class drum implements instrument{
public void play(){System.out.println("打鼓");}
}

public void playInstrument(instrument ins){
ins.play();
}
public static void main(String[] args) {
// TODO code application logic here
/************局部内部类*************/

class piano implements instrument{
public void play(){System.out.println("弹钢琴");}
}

InstrumentsTest a = new InstrumentsTest();
instrument b = a.new drum();
b.play();
InstrumentsTest c = new InstrumentsTest();
instrument d = new piano();
d.play();

/************匿名内部类**************/
InstrumentsTest e = new InstrumentsTest();
e.playInstrument(new instrument(){
public void play(){System.out.println("演奏");}
});

}
运行结果:
run:
打鼓
弹钢琴
演奏
成功构建 (总时间: 0 秒)
二.
1>Father类:
public class Father {
private String name;
public Father(){this.name="zhangjun";}
class Child{
public void myFather(){
System.out.println("我父亲是:"+ name);
}
}
}
2>pTest测试类:
public class PTest {


/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Father.Child chd = new Father().new Child();
chd.myFather();
}
运行结果:
run:
我父亲是:zhangjun
成功构建 (总时间: 1 秒)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值