java匿名内部类

内部类中的变量访问

java的内部类主要分为,普通内部类,静态内部类,局部内部类,匿名内部类。内部类中变量的访问,主要由以下几点:
- 内部类可以访问主类中的任何变量,包括私有的变量。但是如果是静态内部类就只能访问主类中的静态变量,不能访问主类中的非静态变量。
- 对于局部内部类来说,如果里面的参数变量不会发生任何改变,在jdk8中即使不用final关键字修饰,编译器也不会报错,也就是说局部内部类只能使用final修饰的变量
具体的示例如下:

/**
 * All rights reserved.
 * Created by zhaideyin on 2017/10/26.
 * Description:
 */
public class InnerClass {
    public InnerClass(String name){
        System.out.println(name);
    }
    public String  name="I am out";
    public  static  String ststicName="I am static variable " ;
    private static  String privateName="I am private variable " ;
    //静态内部类
    public static class InnerClassA{
        void showA(String A_name){
            System.out.println("静态内部类");
           // System.out.println("InnerClassA"+name);添加这一行编译器会报错,静态内部类不能访问主类的非静态变量
            System.out.println(" InnerClassA:"+ststicName);//静态内部类能够访问主类的公共变量
            System.out.println(" InnerClassA:"+privateName);//静态内部类能够访问主类的私有变量
        }
    }
    //普通内部类
    class InnerClassB extends BaseClass{
        void showB(){
            System.out.println("普通内部类");
            System.out.println("InnerClassB:"+name);//普通内部类能够访问主类的公共变量
            System.out.println("InnerClassB:"+ststicName);//普通内部类能够访问主类的静态变量
            System.out.println("InnerClassB:"+privateName);//普通内部类能够访问主类的私有变量
        }
    }
    public  void show(){
        int a=10;
        //局部内部类
      /*private*/  class InnerClassC{//局部内部类不能有访问修饰符,任何的访问修饰符都会报错
         void showC(){
             //a=29;局部内部类的访问的局部变量必须为final类型,在jdk8中,int a=10;的声明并不会报错,只要不修改a的值。jdk8以下会报错
             System.out.println("局部内部类");
             System.out.println("InnerClassC:"+name);//局部内部类可以访问主类的普通变量
             System.out.println("InnerClassC:"+ststicName);//局部内部类可以访问主类的静态变量
             System.out.println("InnerClassC:"+privateName);//局部内部类可以访问主类的私有变量
        }
        }
    }
    public BaseClass getInnerClass(){
         int a=10;
         final int   b=20;
        //匿名内部类,如果匿名内部类内部的方法需要修改形参的话,则该参数只能声明为final类型,否则编译器会报错 jdk8以下的必须用final修饰,
        return new BaseClass(){

            public void show() {
                //a=90;
                System.out.println(a);
                System.out.println("匿名内部类");
                System.out.println("InnerClassD:"+name);//匿名内部类可以访问主类的普通变量
                System.out.println("InnerClassD:"+ststicName);//匿名内部类可以访问主类的静态变量
                System.out.println("InnerClassD:"+privateName);//匿名内部类可以访问主类的私有变量
            }
           int  test(){
                 // a=30;//编译器会报错,默认引用的参数必须是final类型的,否则编译器会报错
                return a+b;
            }
        };
    }
    public static void main(String[] args) {
        InnerClass innerClass=new InnerClass("mainClass");
        // InnerClassB innerClassB1=new InnerClassB();该行代码会报错,普通内部类的实现是必须依赖于外部类的实现
        InnerClass.InnerClassB innerClassB=innerClass.new InnerClassB();
        InnerClassA innerClassA=new InnerClassA();//静态内部类的实现并不依赖外部类的实现
        //对于匿名内部类的获取通常是通过方法来获取的
        BaseClass baseClass= innerClass.getInnerClass();
    }
}
class BaseClass{
    void show(){};
}

这里解释以下为什么局部内部类所使用的变量都必须用final 修饰:
匿名内部类,如果匿名内部类内部的方法需要修改形参的话,则该参数只能声明为final类型,否则编译器会报错 jdk8以下的必须用final修饰,
主要是java在调用方法的时候,会在方法栈中为局部变量分配内存空间,方法调用结束后局部变量就得销毁, 可是局部内部类的是分配在堆中的,它的生命周期并不会随着方法的结局而结束,所以局部内部了访问和使用到的局部变量就不能随着方法的消亡而消亡,因此局部内部类的 变量就必须声明为final类型
谈一下个人对于java内部类的理解:
java的内部类的引入,根据java 编程思想上面的说法是为了让继承体系更加完整,内部类可以独立于主类之外去继承一个父类或者是接口,并且不受主类的影响,并且表现出不同的结构。除此之外,内部类也是实现代码隐藏的另一种非常好的方式,当然内部类能够灵活的于外部类进行通信。

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值