内部类对象创建

内部类:内部类是定义在类内部的类, 可以说它是类的一个属性,可分静态内部类和非静态内部类,内部类对象可以访问外部类的任何成员。

非静态内部类对象的创建:需要通过外部类对象.new 内部类构造方法()的形式创建
静态内部类对象的创建:new 外部类名.内部类构造方法()
如下例:

package com.mjlf.myBatis.accessControl.innerclass;

/**
 * Created by a123 on 16/12/18.
 */
public class OuterClass {
    private int num;

    public void showNum() {
        System.out.println(this.num);
    }

    class InnerClass1 {
        private int innerNum;

        public OuterClass newOuter() {//生成外部类
            return new OuterClass();
        }

        public OuterClass newOuter1(){//通过.this生成外部类
            return OuterClass.this;
        }

        public void showNum(){
            System.out.println("innner num : " + this.innerNum);
            System.out.println("outer num  : " + num);//调用外部类属性
        }
    }

    static class InnerClass2{
        void showNum(){
            System.out.println("this is a static inner class");
        }
    }


    public static void main(String[] args){
        OuterClass outerClass = new OuterClass();
        outerClass.showNum();

        InnerClass1 innerClass1 = outerClass.new InnerClass1();//生成内部类对象
        innerClass1.showNum();

        OuterClass outerClass1 = innerClass1.newOuter();//通过内部类对象生成外部类对象
        outerClass1.showNum();

        OuterClass outerClass2 = innerClass1.newOuter1();//通过内部类对象生成外部类对象
        outerClass2.showNum();

        InnerClass2 innserClass2 = new OuterClass.InnerClass2();//生成静态内部类
        innserClass2.showNum();
    }
}

注意: 每一个内部类对象都需要和一个外部类对象绑定(非静态内部类)

问题:如果内部类和外部内种同时存在相同的属性时, 在内部类中如何才能调用外部类的该属性?

package com.seengenearcontent;

/**
 * Created by a123 on 16/12/20.
 */
public class OuterClass {
    private int i = 10;
    private int num = 10;

    class InnerClass{
        private int num = 5;

        public void show1(){
            System.out.println("i = " + i);
            System.out.println("num = " + num);
        }

        public void show2(){
            System.out.println("num outer = " + OuterClass.this.num);
            System.out.println("num inner = " + this.num);
            System.out.println("num = " + num);
        }
    }

    public static void main(String[] args){
        InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.show1();
        innerClass.show2();
    }
}

/**
i = 10
num = 5
num outer = 10
num inner = 5
num = 5
*/

根据输出结果可以知道:
1. 如果内部类中没有与外部类相同的属性, 则可以知道使用外部类属性
2. 如果内部用于外部类相同的属性, 直接调用属性名则调用的是内部类属性,可以使用this.属性名调用内部类属性, 外部类名.this.属性名(OuterClass.this.num)调用外部类属性
3. 如果内部类属性与外部类属性相同, 直接使用属性名则调用时内部类属性

可以通过内部类来实现java多继承:这将在以后的博文中叙述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值