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