2021/07/13笔记

我们于2021/07/13 的学习目标是:数组工具、内部类与异常,核心任务为:

1、学习技术:

1)、常用操作数组的工具

2)、内部类

3)、成员内部类

4)、内部类的测试类

5)、内部类的同名变量的调用

6)、静态内部类

7)、私有内部类

8)、局部内部类

9)、匿名内部类

10)、Lambda 表达式

11)、异常

2、文档总结

1、学习技术:

1)、常用操作数组的工具

JDK有帮助手册,可以详细查找命令的名称、功能和作用。

在java.util.Arrays类中,具有很多实用工具。

  • 对比数组
static boolean equals(int[] a, int[] a2);

如果两个指定的int数组彼此相等 ,则返回 true

  • 返回指定数组内容的字符串表示形式
static String toString(int[] a);

返回指定数组内容的字符串表示形式。

  • 深度相等比较
static boolean deepEquals(Object[] a1, Object[] a2)

如果两个指定的数组彼此深度相等 ,则返回 true

  • 数组拷贝、截取与填充
static int[] copyOf(int[] original, int newLength)

当新数组长度=原数组长度:原数组的拷贝

当新数组长度<原数组长度:默认从原数组索引为0的位置开始拷贝,拷贝参数2个

当新数组长度>原数组长度:最后的空余位置使用默认值填充

  • 复制数组指定范围到新数组
static int[] copyOfRange(int[] original, int from, int to)

将指定数组的指定范围复制到新数组中。

新数组由copyOfRange方法内部创建

  • 排序
static int [] new_number_array=sorting(int []);

直接对原数组进行排序

2)、内部类(了解)

内部类,就是在类中再定义类。当一类中的成员,作为另外一种事物的时候,这个成员就可以定义为内部类。

3)、成员内部类

public class Class001_Outer {

    //成员: 类中方法外

    private int i = 1;

    private static int j = 5;



    //成员内部类

    class Inner{

        private int a = 10;



        public void testInner(){

            System.out.println("成员内部类中的成员方法");

            System.out.println(i);

            System.out.println(j);



            //outer();

        }

    }



    public void outer(){

        System.out.println("成员方法");

        Inner in = new Inner();

        System.out.println(in.a);

        in.testInner();

    }

}

一个类定义在外部类的成员位置就成为成员内部类,也具有类的特点,继承,实现等功能。成员内部类具有成员的特点,被成员修饰符修饰

注意:

在成员内部类中不能定义静态内容,除了静态常量,静态内部类才能任意定义静态内部

在成员内部类中可以使用外部类中的成员,包括私有的,静态的

在外部类中可以跟随成员内部类的对象使用成员内部类的成员

成员内部类的对象性需要通过外部类对象构建    外部类名.内部类类名 引用 = new 外部类().new 内部类();

跟随内部类的对象使用内部类的成员,注意访问权限

4)、内部类的测试类

测试成本员内部类使用

成员内部类的对象性需要通过外部类对象构建

//1)

Class001_Outer out = new Class001_Outer(); //外部类对象

Class001_Outer.Inner in = out.new Inner();

//2)

Inner in = new Class001_Outer().new Inner();

in.testInner();

5)、内部类的同名变量的调用

对于:

public class Class003_OuterTest {

    int i=1;



    class Inner{

        int i=2;

        public void inner(){

            int i=3;



            //在此调用局部变量i=3

            //在此调用内部类成员变量i=2

            //在此调用外部类成员变量i=1

        }

    }

}

要调用局部变量i:

System.out.println(i);  //i = 3

要调用内部类成员变量i:

System.out.println(this.i); //i = 2

要调用外部类成员变量i:

System.out.println(Class003_OuterTest.this.i); //i = 1

6)、静态内部类   

public class Class004_Outer {

    //成员: 类中方法外

    private int i = 1;

    private static int j = 5;





    //静态内部类

    static class Inner{

        //成员变量

        int a = 1;

        //静态变量

        static int b = 10;



        //成员方法

        public void test(){

            System.out.println(j);

            System.out.println(new Class004_Outer().i);

        }

        //静态方法

        public static void testStatic(){

            System.out.println(j);

            System.out.println(new Class004_Outer().i);

        }



    }



    void outer(){

        //静态内部类对象

        Inner in = new Inner();

        System.out.println(in.a);

        System.out.println(in.b);

        System.out.println(Inner.b);



        Inner.testStatic();

        in.test();

    }



}

可以定义静态内容(成员),成员内部类中不可以直接定义静态内容除了静态常量以外

静态内部类中可以直接使用外部类中静态内容,需要通过外部类对象使用外部类中的成员(因为内部类本身是静态的)

外部类中可以直接通过内部类对象使用内部类成员,可以通过内部类的类名使用内部类静态内容

其他类中使用静态内部类中内容:

静态内部类中的静态内容 : 外部类类名.内部类类名.静态内容

静态内部类中的成员内容: new 外部类类名.内部类类名();

通过内部类对象调用它成员

7)、私有内部类

只能在当前外部类中通过内部类对象使用

对于:

private class Inner{

        int a = 2;

        static final int B = 10;



        void test(){

            System.out.println("私有内部类中的成员方法");

            System.out.println(i);

            System.out.println(j);

        }

}

在外部需要先创建对象,后使用

void outer(){

        System.out.println("外部类中的成员方法");

        Inner in = new Inner();

        System.out.println(in.a);

        System.out.println(in.B);

        System.out.println(Inner.B);

    }

8)、局部内部类

public void test(){

   class Inner{}

}

1、不能被成员修饰符(public,private,protected,static)等修饰

2、局部内部类中不能定义静态内容,除了静态常量

3、局部内部类中可以直接使用外部类成员,可以使用所在方法中的局部变量

4、局部内部类智能在当前所在的方法中通过内部类对象使用,其他位置无法使用

5、在局部内部类中使用了所在方法中的局部变量|形参,这个局部变量会默认被final修饰。从JDK8开始默认被final修饰,JDK7及以前的版本需要显示被final修饰。

9)、匿名内部类

public class Class007_Outer {

    public static void main(String[] args) {

        //匿名对象 : 只能在当前行使用一次

        new String();



        //创建 实现类对象调用重写后的抽象方法

        new Demo().smoking();



        //匿名内部类

        //1) 匿名内部类对象 : 没有引用指向的匿名对象 :只能在当前行使用一次

        new Smoke() {//实现类的类体

            @Override

            public void smoking() {

                System.out.println("一边哈哈笑一边吸烟...");

            }

        }.smoking();



        //2. 引用指向的匿名内部类对象 : 通过引用后续使用多次

        Smoke s =  new Smoke(){

            @Override

            public void smoking() {

                System.out.println("一边吸气一边吸烟");

            }

        };



        s.smoking();//调用重写的方法

        s.smoking();



        //3.匿名内部类对象作为实参传递

        test( new Smoke(){

            @Override

            public void smoking() {

                System.out.println("一边吸气一边吸烟");

            }

        });



        //通过匿名 内部类简化子类

        Car car = new Car(){

            @Override

            void run() {

                System.out.println("run....");

            }

        };

        car.run();

    }



    static void test(Smoke smoke){

        smoke.smoking();

    }

}



//抽象类

abstract class Car{

    abstract void run();

}



//接口

interface Smoke{

    void smoking();

}



//实现类 ,重写抽象方法

class Demo implements Smoke{

    @Override

    public void smoking() {

        System.out.println("一边呲着牙一边吸烟...");

    }

}

作用: 用来简化没有本身自己作用的实现类|子类

上层 : 接口 | 抽象类

10)、Lambda 表达式

从JDK8开始新增Lambda表达式,作用是简化匿名内部对象。使用的前提是只有一个必须被重写的抽象方法的接口,即函数式接口。

@FunctionalInterface
interface the_interface{}

可检测接口是否为函数式接口。

语法:

()->{}

() :  匹配要重写的抽象方法的参数列表

-> : 箭头函数  箭头符号

{} : 要重写的抽象方法的方法体

注意: 当方法的形参为一个函数式接口,实参可以为lambda表达式

对于接口:

@FunctionalInterface

interface Run{

    boolean run(int x);

    static void test(){}

}

要编写的匿名内部类对象:

Run r =  new Run(){



            @Override

            public void run() {

                System.out.println("run....");

            }

        };



lambda写法1 : ()->{}

        Run r = ()->{

            System.out.println("run....");

        };



        r.run();

lambda写法2: 当方法体只有一句 ,前后的{}可以省略

        Run r = ()->System.out.println("跑....");



        r.run();

lambda写法3: 当方法具有参数,参数的类型可以省略

        Run r = (a,b)->System.out.println("跑...."+(a+b));



        r.run(1,2);

lambda写法4: 当方法的参数只有一个 ,前后的()可以省略

        Run r = a -> System.out.println("跑...."+(a));



        r.run(1);

lambda写法5: 当方法存放返回值,并且{}中的语句体只有一句,就是return语句,前后的{}与return关键字可以一起省略

        Run r = a -> a>0;

11)、异常

异常指程序无法正常执行完毕

Throwable又分为Error和Exception。其中Error是错误,一般由虚拟机生成并脱出,无需要程序猿管理;Exception是异常,又分为CheckedException和RuntimeException。

CheckedException指编译时异常或者检查时异常,发生在程序编译期间。程序如果遇到编译时异常没有处理,程序无法正常运行。

RuntimeException 运行时异常指发生程序运行期间的异常。一般可以通过增强程序健壮性的代码if处理。

注意:如果程序遇到异常没有处理,无法继续执行

常见的一些运行时异常:

  • 空指针异常 NullPointerException
  • 数组越界异常 ArrayIndexOutOfBoundsException
  • 数组长度负数异常 NegativeArraySizeException
  • 类型转换异常 ClassCastException
  • 数学异常 ArithmeticException
  • 数字格式异常 NumberFormatException

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值