0715-Java基础知识

64 阅读9分钟

异常处理

img

RuntimeException

1.NullPointerException - 空指针引用异常
​
2.ClassCastException - 类型强制转换异常
​
3.IllegalArgumentException - 传递非法参数异常
​
4.IndexOutOfBoundsException - 下标越界异常
​
5.NumberFormatException - 数字格式异常

非RuntimeException

1.ClassNotFoundException - 找不到指定class的异常
​
2.IOException - IO操作异常

Error

1.NoClassDefFoundError - 找不到class定义的异常
​
2.StackOverflowerError - 深递归导致栈被耗尽而抛出的异常
​
3.OutOfMemoryError - 内存溢出异常

多重捕获块

可以在 try 语句后面添加任意数量的 catch 块。
​
如果保护代码中发生异常,异常被抛给第一个 catch 块。
​
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
​
如果不匹配,它会被传递给第二个 catch 块。
​
如此,直到异常被捕获或者通过所有的 catch 块。

throws 与 throw 关键字

https://blog.csdn.net/Rachel_pan/article/details/101623044

Scanner

next()和nextLine()的区别

next()在输入有效字符之后,将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
​
nextLine()方法的结束符只是Enter键

方法-可变参数

public class VarargsDemo {
    public static void main(String[] args) {
        // 调用可变参数的方法
        printMax(34, 3, 3, 2, 56.5);
        printMax(new double[]{1, 2, 3});
    }
 
    public static void printMax( double... numbers) {
        if (numbers.length == 0) {
            System.out.println("No argument passed");
            return;
        }
 
        double result = numbers[0];
 
        for (int i = 1; i <  numbers.length; i++){
            if (numbers[i] >  result) {
                result = numbers[i];
            }
        }
        System.out.println("The max value is " + result);
    }
}

日期

java.util.Date

第一个构造函数使用当前日期和时间来初始化对象。
Date( )
第二个构造函数接收一个参数,该参数是从 197011 日起的毫秒数。
Date(long millisec)

使用 SimpleDateFormat 格式化日期

import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String[] args) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
 
      System.out.println("当前时间为: " + ft.format(dNow));
   }
}

测量时间

import java.util.*;
  
public class DiffDemo {
 
   public static void main(String[] args) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

Calendar类

​
​
import java.util.Calendar;
​
public class t5 {
    public static void main(String[] args) {
        //1.创建Calendar类对象,不能new
        Calendar cal= Calendar.getInstance();
        //打印出当前日期
        System.out.println(cal.getTime().toLocaleString());
        //获取毫秒值
        System.out.println(cal.getTimeInMillis());
​
        //2.获取时间信息
        //获取年
        int year=cal.get(Calendar.YEAR);//里面的参数可以用1代替
        //获取月
        int month=cal.get(Calendar.MONTH);//里面的参数可以用2代替
        //获取日
        int day=cal.get(Calendar.DAY_OF_MONTH);//
        //获取小时,Hour表示12小时,HOUR_OF_DAY表示24小时
        int hour=cal.get(Calendar.HOUR_OF_DAY);//里面参数可以用11代替
        //获取分钟
        int minute=cal.get(Calendar.MINUTE);//里面参数可以用12表示
        //获取秒
        int second=cal.get(Calendar.SECOND);//里面参数可以用13表示
        System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+"时"+minute+"分"+second+"秒");
​
    }
}

正则表达式

继承

Java 不支持多继承,但支持多重继承
​
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

重写和重载

重写规则:
参数列表与被重写方法的参数列表必须完全相同。
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
父类的成员方法只能被它的子类重写。
声明为 final 的方法不能被重写。
声明为 static 的方法不能被重写,但是能够被再次声明。
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 privatefinal 的方法。
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 publicprotected 的非 final 方法。
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
构造方法不能被重写。
如果不能继承一个类,则不能重写该类的方法。
​
​
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。

多态

方式一:重写:
这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
​
方式二:接口
1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。
​
方式三:抽象类和抽象方法

接口&抽象类&枚举

接口

接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
接口不能包含成员变量,除了 staticfinal 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
​
接口特性:
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
​
抽象类和接口的区别:
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
​
注意:
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
一个类可以同时实现多个接口。
一个类只能继承一个类,但是能实现多个接口。
一个接口能继承另一个接口,这和类之间的继承比较相似。
在Java中,类的多继承是不合法,但接口允许多继承。
​
标记接口:
最常用的继承接口是没有包含任何方法的接口。
标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

抽象类

1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
​
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
​
3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
​
4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
​
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

枚举

在这里插入图片描述

自定义枚举类

package com.atguigu.java;
​
/**
 * 一、枚举类的使用
 * 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类
 * 2.当需要定义一组常量时,强烈建议使用枚举类
 * 3.如果枚举类中只有一个对象,则可以作为一种单例模式的实现方式。
 *
 * 二、如何定义枚举类
 * 方式一:jdk5.0之前,自定义枚举类
 * 方式二:jdk5.0,可以使用enum关键字定义枚举类
 *
 *///自定义枚举类
class Season{
    //1.声明Season对象的属性:private final修饰
    private final String seasonName;//final修饰的,要么直接赋值,要么构造器赋值
    private final String seasonDesc;
​
    //2.私有化类的构造器,并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
​
    //3.提供当前枚举类的多个对象:public static final的
    public static final Season SPRING = new Season("春天","春暖花开");
    public static final Season SUMMER = new Season("夏天","夏日炎炎");
    public static final Season AUTUMN = new Season("秋天","秋高气爽");
    public static final Season WINTER = new Season("冬天","冰天雪地");
​
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }
​
    public String getSeasonDesc() {
        return seasonDesc;
    }
    //4.其他诉求1:提供toString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + ''' +
                ", seasonDesc='" + seasonDesc + ''' +
                '}';
    }
}
//测试使用自定义枚举类
public class SeasonTest {
​
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);//Season{seasonName='春天', seasonDesc='春暖花开'}
        
    }
​
}

Enum关键字

package com.atguigu.java;
​
public class SeasonTest2 {
    public static void main(String[] args) {
        Season1 summer = Season1.SUMMER;
        //toString():返回枚举类对象的名称
        System.out.println(summer.toString());//SUMMER
​
        System.out.println(Season1.class.getSuperclass());//父类是 class java.lang.Enum
        //即定义的枚举类默认继承于java.lang.Enum类
}
​
//使用enum关键字枚举类(class在这改为enum)
enum Season1 {
        //public static final Season1 SPRING = new Season1("春天","春暖花开");
       // 把自定义枚举类中的public static final Season1 ,new Season1都去掉。
     //此处要求对象SPRING,SUMMER,AUTUMN, WINTER要写着最上边 不然报错
    //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
    SPRING("春天","春暖花开"),//多个对象之间用逗号,
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","冰天雪地");
​
    //2.声明Season对象的属性:private final修饰
    private final String seasonName;
    private final String seasonDesc;
​
    //3.私有化类的构造器,并给对象属性赋值
​
    private Season1(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
​
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }
​
    public String getSeasonDesc() {
        return seasonDesc;
    }
​
}
}

\