java学习笔记012

一.匿名内部类

没有名字的一个内部类

作用: 没有类本身作用,只为了重写一些抽象方法,方便调用这个方法 ,匿名内部类可以简化这种实现类。简化符合需求的实现类,子类->接口|抽象父类

public class Inner {
    public static void main(String[] args) {
        Demo d = new Demo();
        d.smoking();
       //2)引用接收: 接口多态
        Smoke s = new Smoke(){  //匿名内部类的类体
            @Override
            public void smoking() {
                System.out.println("边吸烟边跳舞...");
            }
        };
        s.smoking();//边吸烟边跳舞...
        //1)匿名对象-> 无引用接收匿名内部类对象地址:  匿内部类对象的后面直接调用
        //创建一个Smoke接口的一个没名字的实现类(匿名内部类)的对象
        new Smoke(){  //匿名内部类的类体
            @Override
            public void smoking() {
                System.out.println("边吸烟边玩手机...");
            }
        }.smoking();//边吸烟边玩手机...
        //3)作为方法的实参
        test(new CH());
        test(new Demo());
        test(new Smoke() {
            @Override
            public void smoking() {
                System.out.println("边吸烟边笑...");
            }
        });
    }
​
    static void test(Smoke smoke){
        smoke.smoking();
    }
​
}
​
//吸烟接口
interface Smoke{
    void smoking();
}
//实现类 ,本身具类本身的含义
class CH implements Smoke{
    public String name;
    int age;
    @Override
    public void smoking() {
        System.out.println("边吸烟边敲代码");
    }
}
//实现类 : 本身没有自己的含义与作用,为了重写抽象方法smoking,便于调用
class Demo implements Smoke{
    @Override
    public void smoking() {
        System.out.println("边吸烟边吐烟圈...");
    }
}

二.lambda表达式

作用:该功能就是为了简化内部类结构,前提是内部类实现的是函数式接口。只存在一个必须被重写的抽象方法的接口就是函数式接口,可以利用 @FunctionalInterface 检查一个结口是否为函数式接口。

定义结构: ( )-> { }

( ) : 重写的抽象方法的参数列表。

-> : lambda 符号,也称为箭头符号,具有上下文推导的作用。

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

public class Lambda {
    public static void main(String[] args) {
        Test01_Lambda.test();
    }
    static void test(){
        //lambda标准写法省略方法名
        Lmabda1 lmabda1 = ()->{ System.out.println("方法一"); };
        lmabda1.lambda1();
        //当lambda体中的语句体只有一句,前后的{}可以省略
        lmabda1 = () -> System.out.println("方法二");
        lmabda1.lambda1();
        //参数列表的数据类型可以省略
        Lmabda2 lmabda2 = (i) -> System.out.println("方法三"+i);
        lmabda2.lambda2(8);
        //如果参数只有一个,前后的()可以省略 ,如果参数个数为2~多个,前后()不能省略
        lmabda2 = i -> System.out.println("方法四单参数"+i);
        lmabda2.lambda2(9);
        Lmabda3 lmabda3 = (a,b) -> System.out.println("方法四多参数"+(a+b));
        lmabda3.lmabda3(6,6);
        //如果方法存在返回值,并且{}中语句体只有一句,为return 带出返回值语句,前后的{}与return关键字可以一起省略
        lmabda4 = (c,d) -> c+d;//方法五       
        System.out.println(lmabda4.lmabda4(11,22));//方法五的返回值
    }
}
interface Lmabda1{
    void lambda1();
}
interface Lmabda2{
    void lambda2(int i);
}
interface Lmabda3{
    void lmabda3(int i,int j);
}
interface Lmabda4{
    int lmabda4(int m,int n);
}

 

三.异常 Exception

1.意义

意义:异常就是程序出现了问题,程序一旦遇到异常,后面代码无法正常执行,这时控制台中展示异常的详细信息|细节问题,便于程序猿的调试。主要分为 Error 与 Exception 。

Error :一般指由虚拟机生成并脱出的异常,无需程序员解决处理。

Exception : 异常,如果不处理,程序无法正常执行,需要程序员在代码层面上处理异常。分为 RuntimeException (运行时异常):运行期间才会发生的异常;CheckedException (编译时异常|检查时异常):编译期间发生的异常,不处理程序无法运行。

重点注意:

1)所有的异常都可以通过标准异常处理方案来处理。 2)运行时异常一般通过增强程序健壮性的代码就可以解决 -> if判断。 3)编译时异常只能通过异常处理方案来处理。

常见运行异常:

NullPointerException 空指针异常
    s = null;System.out.println(s.length());
ArithmeticException 数学异常
    System.out.println(5/0); 
ArrayIndexOutOfBoundsException 数组索引越界异常
    int[] arr = {1,2,3};System.out.println(arr[5]); 
NegativeArraySizeException 数组长度负数异常
    int[] arr = new  int[-3];
ClassCastException 类型转换异常
    Object obj = "张三";
    System.out.println((自定义类)obj);
NumberFormatException 转换格式异常
    String str = "123abc";
    System.out.println(Integer.valueOf(str));

2.异常的处理

异常抛出:throws :把异常抛出到上一层,谁调用谁处理。

异常捕获:异常对象当场抓住捕获,直接处理。

try { 
    可能出现异常的代码//出现异常代码后直接执行catch,异常代码后的所有代码不再执行。
}  catch ( 异常类型  e ){ 
    e.printStackTrace ( ); 
}  catch (Exception e){
    e.printStackTrace ( );//所有异常都可捕捉(接盘侠)接收区间最大,一般放在后面,捕获区间越大越放在后面。可放n个catch
}......finally { //无论怎样都会被执行,一般放在最后
    执行代码
}   

注意:

1.异常一旦处理,不影响程序的继续执行 2.try中代码可能出现异常,可能不会出现异常,如果没有出现异常,try{}中的代码执行完毕,try...catch结束。 try中代码一旦异常,try后面的代码不会执行,直接执行catch的判断,从上到下一次判断,判断当前的catch是否能够捕获出现的异常对象,如果能,执行后面的{}中的代码,如果不能匹配,继续向下判断,如果所有的都不能匹配,当前的异常对象没有处理,中止程序的执行。 3.一个try后面可以跟1~n个catch。 4.如果一个异常已经通过catch处理不影响后面代码的执行。 5.接收范围较大的异常的catch,需要定义在后面。 6.finally 最终的,无论try中是否会出现异常,finally中的代码肯定最后会执行一般会定义一些资源的关闭等代码。

public class Class002_Exception {
    public static void main(String[] args){
        //编译时期异常
        //InputStream is = new FileInputStream("");
        try {
            System.out.println("try开始了....");
            test();//出现异常直接执行catch,下面代码不再执行。
            System.out.println(5/0);
            System.out.println("try结束了....");
        } catch (FileNotFoundException e) {
            System.out.println("出现了文件未找到异常, 捕获异常...");
            e.printStackTrace();
        } catch (Exception e) {//一般定义在最后用来确定异常可以被捕获。
            System.out.println("接盘侠");
            e.printStackTrace();
        } finally {
            System.out.println("最后肯定会执行的代码");
        }
        System.out.println("main方法结束了....");
    }
    static void test() throws FileNotFoundException,NullPointerException {
        InputStream is = new FileInputStream("D://aaa.txt");//抛出异常
    }
}

3.自定义异常

异常类也是类:需要直接或者间接的继承自Exception,如果是运行时期异常必须直接或者间接的继承 RuntimeException。通过 throw 制造异常:。

public class Test01_AgeException {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        User user = new User();
        System.out.print("请输入姓名:");
        user.setName(scanner.nextLine());
        try {
            System.out.print("请输入年龄:");
            user.setAge(scanner.nextInt());
        } catch (AgeException e) {
            e.printStackTrace();
        }
        if(user.getAge()>18&&user.getAge()<80){
            System.out.println("创建成功"+user);
        }else {
            System.out.println("创建失败,年龄不合法");
        }
    }
}
//创建异常类
class AgeException extends Exception{
    public AgeException(){
        //空构造器
    }
    public AgeException(String massage){
        super(massage);
    }
}
​
//用户类
class User{
    private String name;
    private int age;
​
    public User() {
        //空构造器
    }
​
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) throws AgeException {
        if(age<18||age>65){
            throw new AgeException(age+"年龄不合法");
        }
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

四. String 字符串类

1.意义

本身是一个不可变长字符序列,String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。常见的如"abc" 是一个字符串常量存在于字符串常量池中(方法区),也可以创建:new String() 存在于方法堆中。

存储方式:

1)在 jdk11 中使用字节数组存储字符串数据 private final byte[] value;

2)在 jdk8 中使用字符数组存储字符串数据 private final char[] value;

2.String类中的常用方法

public class String_Method{
    public static void main(String[] args){
        String str1 = "abcdefghijklmn";
        String str2 = "Abcdefghijklmn";
        //char charAt(int index) 返回指定索引处的 char值。
        System.out.println(str.charAt(4));//e
        //int codePointAt(int index) 返回指定索引处的字符(Unicode代码点)。
        System.out.println(str1.codePointAt(4));//101
        //int compareTo(String anotherString) 按字典顺序比较两个字符串。
        System.out.println(str1.compareTo(str2));//32
        //int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,忽略大小写差异。
        System.out.println(str1.compareToIgnoreCase(str2));//0
        //String concat(String str) 将指定的字符串连接到此字符串的末尾。
        System.out.println(str1.concat(str2));//abcdefghijklmnabcdefghijklmnAbcdefghijklmnAbcdefghijklmn
        //boolean contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时,才返回true。
        System.out.println(str1.contains("tian"));//false
        //boolean equals(Object anObject) 将此字符串与指定的对象进行比较。
        System.out.println(str1.equals(str2));//false
        //boolean equalsIgnoreCase(String anotherString) 将此 String与另一个 String比较,忽略了大小写。
        System.out.println(str1.equalsIgnoreCase(str2));//true
        //boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
        System.out.println(str1.endsWith("klmn"));//true
        //static String copyValueOf(char[] data) 相当于 valueOf(char[]) 。把一个字符数组转为字符串
        String str3 = String.copyValueOf(new char[]{'a','b','c'});
        System.out.println(str3);//abc
        //void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将此字符串中的字符复制到目标字符数组中。
        char[] ch = new char[10];
        System.out.println(Arrays.toString(ch));//[ ,  ,  ,  ,  ,  ,  ,  ,  ,  ]
        str1.getChars(3,11,ch,1);
        System.out.println(Arrays.toString(ch));//[ , d, e, f, g, h, i, j, k,  ]
        //int indexOf(String str) 返回指定子字符串第一次出现的字符串中的索引。
        System.out.println(str1.indexOf("efg"));//4
         //int indexOf(String str, int fromIndex) 从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
        System.out.println(str1.indexOf("efg",5));//18
        //int lastIndexOf(int ch) 返回指定字符最后一次出现的字符串中的索引。
        System.out.println(str1.lastIndexOf("efg"));//18
        //int lastIndexOf(int ch, int fromIndex) 返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
        System.out.println(str1.lastIndexOf("efg",5));//4
    }
}

 

上一篇:修改镜像源013(接012)


下一篇:1381:城市路(Dijkstra)