Java学习-匿名内部类和代码块

Java学习-匿名内部类和代码块
1.代码块
2.内部类的使用方式
1.代码块
1.局部代码块: 局部位置,用于限定变量的声明周期,及早释放,有助于内存利用率,多个代码块,按照顺序来执行
public class CodeDemo {
    public static void main(String[] args) {
        //局本部代码块 --> 局部位置,用于限定局部变量的声明周期,及早释放,有助于内存利用率
        {
            int x =10;
            System.out.print(x);
        }
        //报错
        System.out.print(x);
    }
}

2.构造代码块:在类中成员变量的位置,用{}括起来,每次调用构造方法执行前,都会优先执行构造代码块。作用:可以把多个构造方法中的共同代码放到一起
class Code  {
    {
        int x = 100;
        System.out.print(x);
    }
    
    public Code() {
        System.out.print("无惨构造方法");
    }
    
    public Code(int a) {
        System.out.print("有参构造方法");
    }
}
 


3.静态代码块: 在类中的成员位置,用{}括起来,只不过它用static修饰。作用:一般是 对类的初始化,且只执行一次。
3个代码块的执顺序:静态代码块(只执行一次)-构造代码块 -构造方法 -局部代码块
2.内部类的使用方式
内部类:把类定义在其他类的内部,这个类就被称为内部类。在成员位置定义的类,叫成员内部类;在局部位置定义的类,被称为局部内部类
访问特点:

内部类可以直接访问外部成员变量,包括私有
外部要访问内部类的成员,必须创建对象。
public class InnerClassTest {
    
    public static void main(String[] args) {
        
        //第一种方法访问内部内
        new Outer().method();

        //如何访问成员内部类
        //外部类.内部类 对象名 = 外部类对象.内部内对象
        Outer.Inner inner = new Outer().new Inner();
        inner.show();
    }
}

class Outer {
    private int num = 10;
    
    /*
     * 成员内部类
     */
    class Inner {
        public void show() {
            
            System.out.print("内部类方位外部成员" + num );
        }
    }
    
    public void method() {
        System.out.print("外部访问内部类通过对象方位" + "\n");
        new Inner().show();
    }
}

如果内部类被private修饰,就不能被直接访问了,那么只能通过一个公共的方法来访问内部类,为了保证数据的安全性
/*
     * 访问private修饰的内部类,通过一个公共方法来访问
     */
    private class Inner2 {
        public void show2() {
            System.out.println("private修饰的内部类");
        }
    }
    
    public void method3() {
        Inner2 inner2 = new Inner2();
        inner2.show2();
    }


    //访问方式(匿名对象访问)
    new Outer().method3();

内部类被静态修饰符(static)修饰,因为内部类可以看做是外部类的成员,静态内部类访问的外部类数据必须使用静态修饰。 内部类使用static修饰的原因是,为了方便访问数据
访问方式: 外部类名.内部类名 对象名 = new 外部类名.内部类名()
/*
     * static 修饰的内部类
     */
    private static int tempNum = 400;
    public static class Inner3 {
        public void show3() {
            System.out.print("静态修饰符修饰内部类访问外部类" + tempNum);
        }
        
        public static void method3() {
            System.out.print("静态修饰符修饰内部类访问外部类" + tempNum);
        }
    }
    //static 修饰内部类的访问方式
        // 外部类名.内部类名 对象名称 = new 外部类名.内部类名()
        Outer.Inner3 inner3 = new Outer.Inner3();
        inner3.show3();
        inner3.method3()

    //method3的另外一种调用模式,静态修饰,调用可以直接类名.调用
        Outer.Inner3.method3();

局部内部类: 可以直接访问外部类的成员,在局部位置可以创建局部内部类对象,通多对象调用内部类方法,来使用局部内部类的功能
/*
     * 局部内部类
     */
    class Outer {
    public void method2() {
    final int cacheCount = 100;
        class TempInner {
            public void show() {

                System.out.print("局部内部类方位外部成员" + cacheCount);
            }
        }
        
        TempInner tempInner = new TempInner();
        tempInner.show();
    }
    }
    new Outer().method2();

局部内部类访问局部变量:在局部内部类中访问局部对象,必须被声明为最终类型**(final修饰)**,为什么 : 因为局部变量会随着方法的调用完毕而消失,这个时候局部对象并没有立刻从堆内存中回收,还要使用这个变量,为了让数据继续使用,使用final修饰,这样在堆内存里面存的其实是一个常量值. 堆内存是在垃圾回收期空闲时期的时候回收。

**匿名内部类:**本质上是一个继承了该类或者实现了该接口的子类匿名对象。实现格式: new 类或则接口名(){} 。如何匿名内部类的方法:

interface TempClass {
    public abstract void show();
    public abstract void show2();
}

/*
     * 匿名内部类的用法
     */
    public void method4() {
        //第一种方法,当只有一个方法时调用,实质是创建一个类或接口的子类对象,然后调用方法
//        new TempClass() {
//            @Override
//            public void show() {
//                // TODO Auto-generated method stub
//                System.out.println("匿名内部类的第一种调用方法");
//            }
//        }.show();
        
        
        //如果有多个方法的时候我们可以使用多态来调用
        TempClass tempClass = new TempClass() {
            
            @Override
            public void show2() {
                // TODO Auto-generated method stub
                System.out.println("多个方法使用多态的方式来调用");
            }
            
            @Override
            public void show() {
                // TODO Auto-generated method stub
                System.out.println("多个方法使用多态的方式来调用");
                
            }
        };
        
        tempClass.show();
        tempClass.show2();
    }


匿名内部类用完之后,没有东西指向它,用完之后是垃圾,内存立即被回收,在android中用的比较多
————————————————
版权声明:本文为CSDN博主「GY-93」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yong_19930826/article/details/107304787

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值