日常整理——内部类

1、内部类概念
是指在一个外部类内再定义一个内部类,类名不需要和文件夹相同,可用public,default,protected和private修饰,同时它可以自由访问内部类包括私有成员在内的所有成员。而
外部类则不可以直接访问内部类的成员。
po代码
public class Outerclass{
 private String name;
 private int age;
 public InnerClass(){
     name="张三";
     age=18;
public void howinfo(){
Sytem.out.println("姓名"+name+"年龄:"+age);
}
}
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
//先必须构造外部类
OuterClassouterClass=newOuterClass();
//需要创建某个内部类对象,必须要利用外部类的对象通过.new来创建内部类
OuterClass.InnerClassinnerClass=outerClass.newInnerClass();
innerClass.showInfo();
}
我们需要明确一点,内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。
对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class
内部类使用场景
(1)当某个类除了它的外部类,不再被其他的类使用时
(2)每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内      部类使得多继承的解决方案变得完整。
po代码
public interface Event{
public void click();
}
//控件类
public class Conttroller{
puublic void addEvent(Event e){
  e.click();
   }  
 }
l//事件实现类
lpublicclass Button implements Event {
l@Override
lpublic void click() {
lSystem.out.print(“buttonclick”);
这样做也意味着,任何一个类如果希望成为event能够被controller所调用,那么它必须是Event的实现
如果Event不是接口而是基类,那么对于某些已经继承了其它基类的子类,它们就不可能再去继承Event
所以这些类就不可能作为Event被controller调用了。
po一段内部类解决方案代码
public class Button  {
//定义一个内部类实现Event事件接口
public class button Event implements Event{
     @Override
publicvoid click() {
System.out.println("buttonclick....");
}}}
publicstatic void main(String[] args) {
Buttonbutton= new Button();
//实例化内部类
buttonEventbEvent=button.newbuttonEvent();
Controllercontroller= new Controller();
controller.addEvent(bEvent);
}
无论Class Button是何种形式,继承了何种基类或者接口。我都可以通过一个内部类,使得它的一个成员函数能够返回一个Event的实现。
三、内部类的形式
1、成员内部类
  是外围类的一个成员,所以他是可以无限制的访问外围类的所有成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
成员内部类中要注意两点
  第一:成员内部类中不能存在任何static的变量和方法;
  第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
2、局部内部类
  是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。局部内部类就像是方法里面的一个局部变量一样。是不能有public、protected、private以及static修饰符的。
算了还是po代码吧
Publicclass People{
   public People(){}
}
Public class Man{
    public Man(){
    }
   public PeoplegetWoman(){
//局部内部类       
       class Woman extends People{  
            int age=0;
        }
        return new Woman();l    }}

3、匿名内部类
匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束,初次之外,还有一些地方需要注意:
没有访问修饰符的。
必须继承一个抽象类或者实现一个接口
类中不能存在任何静态成员或方法
没有构造方法的,因为其没有类名。
publicclass Button {
publicvoid click(){
//匿名内部类,实现的是ActionListener接口
newActionListener(){
public void onAction()
{System.out.println("clickaction..."); } }.onAction(); }
//匿名内部类必须继承或实现一个已有的接口
publicinterface ActionListener{
publicvoid onAction();
}
publicstatic void main(String[] args) {
Buttonbutton=new Button();
button.click();} }

4、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法.
duang~piu~代码
public class Outter{
    public Outter(){
      }
     static class Inner{
        public Inner(){
         }}}
public class Test{
    public static void main(String[]args) {
        Outter.Innerinner = new Outter.Inner();
    }
}
作为一个日常痴迷表情包的少女,今儿个决定以后要慢慢把表情包一起贴到我的文章里哈哈哈哈哈。说不定还真有人为了收藏表情包经常拉看我写的东西呢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值