内部类简单总结

本文讲解了Java内部类的四种类型(成员、静态、局部和匿名)、Lambda表达式的基础用法,以及异常处理的关键概念、分类、try-catch机制和自定义异常。通过实例演示了如何使用这些特性来提升代码效率和错误处理能力。

内部类

1、学会成员内部类、静态内部类、局部内部类、匿名内部类的定义及使用;
2、学会使用Lambda表达式简化代码;
3、理解异常的概念、异常的分类以及Java中的异常处理机制;
4、学会使用try-catch-finally语句捕获处理异常;
5、学会使用throw、throws抛出异常;
6、学会使用自定义异常;
7、了解断言机制及使用
  重点
成员内部类、匿名内部类的定义与使用、Lanmbda表达式的基本用法;异常的概念、分类及处理机制,使用try-catch捕获异常,使用throws声明抛出异常,使用throw抛出异常,自定义的异常。
难点:
匿名内部类的定义与使用,使用try-catch捕获异常。


成员内部类

定义在另一个类范围内的类 除了成员变量和成员方法之外的另一个成员 包含内部类的那个类称为外部类

内部类 被 另一个类 使用 我们把前者定义为内部类

public class Test {
    public class A{
        
    }
}
//A为 Test 的一个内部类

内部类的使用

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        Test.A a = test.new A();
        a.show();
    }
    int a = 0 ;
    int b = 0;
    void m()
    {
        b = 12;
    }
    public  class A{
      int  a = 0;

       void show(){
           a = 100;

            Test.this.a = 10;
            m();
           b = 11;
           System.out.println("内部类成员" + a);
           System.out.println("外部类成员" + Test.this.a);
           System.out.println("外部类成员 在内部类操作" + b);
       }
    }
}
/*
输出:
内部类成员100
外部类成员10
外部类成员 在内部类操作11
*/

以上程序 可以看出 若是内部类的成员 与 外部类成员变量名相同 则 要调用外部类的成员使用特殊语法 Outcalss.this.内部类成员 且 : 要操作成员变量时 应在内部类的方法里面进行操作。 原因 :内部类不仅在形式上和外部类有关系(写在外部类的里面), 在逻辑上也和外部类有联系:
如内部类对象的创建依赖于外部类对象;
内部类对象持有指向外部类对象的引用,因此内部类可以通过外部类对象的引用访问外部类的成员。
编译器自动为内部类添加一个成员变量, 其类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;
编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为所添加的成员变量赋值;
在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。

内部类的修饰问题⭕

⭕内部类 可以使用 static 进型修饰  但是 外部类 是不可以的
⭕静态内部类创建对象的语法 : 外部类.内部类 内部类对象引用 = ⭕new 外部类.内部类(参数)  因为 内部类是可以直接用类名进行访问 的  所以 static 创建对象相对于 不用static 来说要 好一点

⭕静态内部类 在逻辑上 和外部类并没有直接的关系 这点和不用static修饰的内部类 是有很大的不同。

局部内部类

将一个内部类定义在外部类的成员方法中,这样的内部类 成为局部内部类
特征:
局部类 :仍然是个类 作用域在代码块或代码块中
		定义在方法或代码块中。
⭕ 不能 被 public 和 private 修饰、
⭕可以用final 来进行修饰。
⭕它对外界是完全隐藏的



局部类访问外部类的特点 :
⭕既可以直接访问外部类的成员变量 还可以访问自己所在代码块的局部变量  
⭕被局部类访问的局部变量 必须 要用 final 关键词修饰 要保证他们被=赋值一次  jdk1.8 以后  不用final也行了 弹药保证被赋值一次。

⭕外部类 使用 内部类 在外部类中创建内部类的对象 然后调用方法即可。

测试代码

package exp8;

public class Test2 {
    private int a;
    void show(){
        int a = 30;//局部变量
        final int  b = 40;
      final    class InnerClass{
             int a = 50; // 内部类成员变量
             public void show(int c){
                 System.out.println();
                 System.out.println("内部类员变量"+a);
                 System.out.println("外部类成员变量"+Test2.this.a);
                 System.out.println("内部类成员变量" + b);
                 System.out.println("参数" + c);
             }
        }
            InnerClass innerClass  = new InnerClass();
            innerClass.show(1);
    }

    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.show();
    }
}
/*输出:
50
内部类成员变量50
外部类成员变量0
内部类成员变量40
参数1*/

很重要!!!匿名内部类

本质 : ①一个类 ②内部类 ③没有名字 系统给你命名

**是一个类 又是一个对象。 **

基本语法

//Anonymous  匿名的
//在接口中的使用。
package exp8;
interface a{
    void speak();
}
public class AnonymousClass {
    a a = new a(){
        @Override
        public void speak() {
            System.out.println("我爱你");
        }
    };

    public static void main(String[] args) {
       AnonymousClass as = new AnonymousClass();
       as.a.speak();
    }
}
//抽象类使用也是如此 
//不能重写构造方法

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值