Java语言基础学习之内部类实例讲解
小标 2018-11-05 来源 : 阅读 697 评论 0

摘要:本文主要向大家介绍了Java语言基础学习之内部类实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了Java语言基础学习之内部类实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

在Java中有一种特殊的语法。就是一个类的内部定义一个类,那么就成为这个类为内部类,外层的就叫做外部类(外围类)。根据内部类在外部类中所处的位置不同,可将内部类分为局部内部类和成员内部类。


局部内部类:定义在外部类方法体内的内部类成员内部类:定义在外部类方法体外的内部类


正如成员变量有静态和非静态之分,那么成员内部类也分为静态内部类和实例内部类。而两者最大的区别就是:实例内部类的对象实例,必须在有定义它的外部类对象实例存在的情况下才能创建。静态内部类对象创建实例则不受此限制。 实例内部类中不能定义静态成员,而静态内部类则可以定义任意形式的成员。



内部类的使用


外部类和外部类都是相对而言的,因为内部类是可以多次嵌套的,使用内部类我们应该注意下面的问题


顶级类只有两种访问权限即public和默认的,而内部类有4中访问权限 public , protected , 默认 , private内部类不能和外部类重名


class Outer{

    private String str = "外部类的私有属性str";

     

    public class Inner{

        public void say() {  //定义内部类的方法

            System.out.println("我是内部类Inner");

        }

        public void getStr() {

            System.out.println(str);//定义内部类的方法,获取外部类的私有属性

        }

    }

    public void getInfo() {

        new Inner().getStr(); //直接实例化内部类对象并调用其方法

    }

}

public class Demo {

    public static void main(String[] args) {

        Outer outer = new Outer();//创建外部类实例

        outer.getInfo();//调用外部类方法

         

        Outer.Inner inner = new Outer().new Inner();//创建内部类实例,需要通过内部类的完整类名来访问

        inner.say();  //调用内部类方法

    }

}


 

外部类的私有属性str

我是内部类Inner

   


下面我们看一下把内部类放到外面这种情况


class Outer{

    private String str = "外部类的私有属性str";

     

     

    public String getStr() {

        return str;

    }

    public void setStr(String str) {

        this.str = str;

    }

 

 

    public void getInfo() { //调用Inner类的getStr()方法

        new Inner().getStr(); 

    }

}   

class Inner{

    private Outer outer;

     

    public void say() {  //定义内部类的方法

        System.out.println("我是内部类Inner");

    }

    public void getStr() {

        System.out.println(new Outer().getStr());//定义内部类的方法,获取外部类的私有属性

    }

}

 

public class Demo {

    public static void main(String[] args) {

        Outer outer = new Outer();//创建外部类实例

        outer.getInfo();  //调用外部类方法

         

        Inner inner = new Inner();//创建内部类实例

        inner.say();  //调用内部类方法

    }

}


外部类的私有属性str

我是内部类Inner

   


从程序的运行结果可以看出来,所实现的功能是相同的。上个例子我们内部类在外部类的内部,那么内部类可以直接访问外部类的private属性。而下面的这个程序,内部类在外部类的外面,所以需要通过外部类的方法getStr()访问私有属性。


静态内部类


静态内部类是声明在外部类中,作为外部类的静态成员的内部类,即用static关键字修饰的内部类,遵守类的静态成员所应遵守的规则,比如不能访问外部类的非静态成员。静态内部类无法直接存取外部类的非静态成员,若需要访问,应该创建外部类的对象,再用该对象去调用外部类的非静态成员


class Outer{

    private int a = 66;

    private static int b = 99;

     

    public static class Inner{//定义静态内部类

        private int x = 6;

        private static int y = 9;

         

        public void add(){  //定义实例方法

            int aa = new Outer().a;  //通过外部类的实例对象调用外部类的非静态成员

            System.out.println(aa+"+"+x+"="+(aa+x));

        }

         

        public static void mul(){

            System.out.println(b+"*"+y+"="+(b*y));//直接调用外部类的成员

        }

    }

 

    public void getInfo(){

        new Inner().add();//通过内部类对象访问静态内部类的非静态方法

        Inner.mul(); //直接通过"静态内部类名.静态方法"形式访问静态内部类的静态方法

    }

}

public class Demo{

    public static void main(String[] args) {

        Outer outer = new Outer();

        outer.getInfo();

         

        Outer.Inner inner = new Outer.Inner();//创建内部类实例

        inner.add();

        inner.mul();

    }

}


66+6=72

99*9=891

66+6=72

99*9=891

   


从上面的程序可以发现,静态内部类可以直接调用外部类的静态成员,包括私有的静态成员。但是如果要访问外部类的非静态成员时,需要通过外部类的实例访问。


局部内部类


局部内部类是指定义在方法体内的捏不累,局部内部类仅在该方法里面有效。因此,局部内部类不能被外部类和外部类以外的其他类访问,所以局部内部类是不需要访问控制符和static修饰的。


class Outer{

    public void fun(){

        class Inner{

            public int a = 10;

        }

        Inner inner = new Inner();

        System.out.println(inner.a);

    }

}

public class Demo{

    public static void main(String[] args) {

        Outer outer = new Outer();

        outer.fun(); //10

    }

}

   


使用局部内部类需要注意事项:


局部内部类不能使用任何访问修饰符,记住了是任何!局部内部类只在其所定义的方法体内有效,不能被外部类和外部类以外的其他类访问。局部内部类不类不能定义static成员局部内部类可以访问外部类的所有成员,包括私有成员


匿名内部类


匿名内部类是指在定义是没有名称的内部类,必须在声明时使用new语句声明类。并且匿名内部类一般只使用一次


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程