zoukankan      html  css  js  c++  java
  • java内部类

    1         Java内部类

    一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

    1.1  成员内部类

    class Circle {

        private double radius = 0;

     

        public Circle(double radius) {

            this.radius = radius;

            getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问

        }

         

        private Draw getDrawInstance() {

            return new Draw();

        }

         

        class Draw {     //内部类

            public void drawSahpe() {

                System.out.println(radius);  //外部类的private成员

            }

        }

    }

    (1)类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

    (2)不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:外部类.this.成员变量,外部类.this.成员方法;

    (3)外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问.

    Outter outter = new Outter();

    Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建

    //第二种方式:

    Outter.Inner inner1 = outter.getInnerInstance();

     

    1.2  局部内部类

    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。所以局部内部类需要继承一个外面公共的类,返回值也是父类,否则局部类对象将无法依附,因为局部内部类的定义在方法内部。

    class People{

    public People()

    {}}

    class Man{

        public Man(){

             

        }

         

        publicPeople getWoman(){

            classWoman extendsPeople{   //局部内部类

                intage =0;

            }

            return new Woman();

        }

    }

    局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

    1.3  匿名内部类

    当我们定义了一个抽象类,抽象类有一个抽象方法,如果要创建对象,需要重新定义一个类,继承抽象类,并实现抽象方法。再用这个继承类去new对象。而匿名内部类就是不去显示的继承实现这个抽象类,而是直接在实参中去实现抽象方法并创建对象,并没有给出继承类名称,而是用抽象类名称去new对象,并实现抽象类的方法。例子如下:

    public abstract class Bird //抽象类

    {

        public abstract int fly();//抽象方法

    }

    public class Test

     {

        public void test(Bird bird){//形参为抽象类的引用

            System.out.println( "能够飞 " + bird.fly() + "米");

     }

    public static void main(String[] args)

    {

            Test test = new Test();

            test.test(new Bird()//匿名内部类

    {

                public int fly() {//实现抽象方法

                    return 10000;

                }

            });

        }

    }

    匿名内部类的定义方法

    new 父类构造器(参数列表)|实现接口() 

        //匿名内部类的类体部分 

    }

    匿名内部类总结

    (1)            创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。如果我们需要多次使用,建议重新定义命名类,而不是使用匿名内部类。

    (2)            使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

    (3)            匿名内部类中是不能定义构造函数的。

    (4)            匿名内部类中不能存在任何的静态成员变量和静态方法。

    (5)            匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

    (6)            匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

    1.4  静态内部类

     静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类对象的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。

     创建静态内部类对象的一般形式为:  外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

    创建成员内部类对象的一般形式为:  外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

    1.5  内部内的常见问题

    1.5.1            局部内部类和匿名内部类只能访问局部final变量

    学习:https://blog.csdn.net/sf_climber/article/details/78326984

    因为匿名内部类是new出来的对象,在堆上创建,当对象不再使用时,由垃圾回收机制回收。生命周期结束。如果传入的是局部变量,方法调用结束后,局部变量就销毁,可能造成匿名内部类对象使用一个销毁的变量。所以用finanl修饰变量,,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的”copy”。这样就好像延长了局部变量的生命周期。

    class OutClass {

         private int age = 12;

         public void outPrint(final int x) {

             class InClass {

                  public void InPrint() {

                       System.out.println(x);

                       System.out.println(age);

                  }

             }

             new InClass().InPrint();

         }

    }

                           

    内部类中会创建两个变量,一个用来保存外部类的指针,一个用来保存变量x的备份。

    将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?就将局部变量设置为final,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。这实际上也是一种妥协。

    若变量是final时:

    若是基本类型,其值是不能改变的,就保证了copy与原始的局部变量的值是一样的;

    若是引用类型,其引用是不能改变的,保证了copy与原始的变量引用的是同一个对象。

    这就使得局部变量与内部类内建立的拷贝保持一致。

    1.5.2            为什么成员内部类可以无条件访问外部类的成员

    虽然我们在定义的内部类的构造器是无参构造器,编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,所以成员内部类中的Outter this&0 指针便指向了外部类对象,因此可以在成员内部类中随意访问外部类的成员。从这里也间接说明了成员内部类是依赖于外部类的,如果没有创建外部类的对象,则无法对Outter this&0引用进行初始化赋值,也就无法创建成员内部类的对象了。

    http://www.cnblogs.com/hwaggLee/p/4492415.html

    自己编了一个股票监控软件,有如下功能,有兴趣的朋友可以下载;

    (1)   个股监测。监测个股实时变化,可以监测个股大单交易、急速拉升和下降、主力入场和出场、股票最高点和最低点提醒。检测到最高点、最低点、主力进场点、主力退场点、急速拉升点、急速下跌点,给出语音或者声音提醒,不用再时刻看着大盘了,给你更多自由的时间;

    (2)   大盘监测。监测大盘的走势,采用上证、深证、创业三大指数的综合指数作为大盘走势。并实时监测大盘的最高点和最低点、中间的转折点。

    (3)   股票推荐。还能根据历史数据长期或短期走势进行分析,对股市3千多个股票进行分析对比,选出涨势良好的股票,按照增长速度从大到小排序,推荐给你涨势良好的股票;

    下载地址:

    1.0.3版本(修复大盘指数崩溃缺陷)下载地址:

    链接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取码:003h

    更新链接:

    https://www.cnblogs.com/bclshuai/p/10621613.html

  • 相关阅读:
    git 命令参考手册 git中文命令参考手册大全
    php常用命令大全
    freemarker中的list 前端模板
    jquery-懒加载技术(简称lazyload)
    JavaScript跨域总结与解决办法 什么是跨域
    Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域
    jQuery- v1.10.2 源码解读
    css技巧
    前端异常捕获与上报
    兼容性/pollyfill/shim/渐进增强/优雅降级
  • 原文地址:https://www.cnblogs.com/bclshuai/p/10157269.html
Copyright © 2011-2022 走看看