JavaSE总结

这篇博客详细总结了Java SE的主要概念,包括方法重载、递归、数组、面向对象(构造器、封装、继承、多态等)、异常处理、常用类(如Object、Random等)以及集合、IO流、网络编程、反射和动态代理等。对于每个主题,博客都提供了关键知识点和示例。
摘要由CSDN通过智能技术生成

一、方法重载

注意:static方法不能调用非静态方法,但非静态方法往往可以调用static方法。因为static会先实例化,静态方法和静态属性都是。 

方法名称相同,参数类型和数目不同,返回值类型可以相同也可以不同。

    public static void main(String[] args) {
        double m = max(10,20);
        System.out.println("最大值是"+m);
    }

    public static double max(double a,double b){
        double m;
        if (a==b){
            return 0;
        } else if (a>b) {
            m = a;
        }else {
            m = b;
        }
        return m;
    }
    public static int max(int a,int b){
        int m;
        if (a==b){
            return 0;
        } else if (a>b) {
            m = a;
        }else {
            m = b;
        }
        return m;
    }

    public static int max(int a,int b,int c){
        int m;
        if (a==b){
            return 0;
        } else if (a>b) {
            m = a;
        }else {
            m = b;
        }
        return m;
    }

二、递归

两个部分:

(1)递归头:什么时候不调用自身,没有将陷入死循环。

(2)递归体:什么时候调用自身。

三、数组

1、使用new操作来创建数组:

//直接定义
int[] arrays0;
//用new来创建数组
int[] arrays1 = new int[10];
String[] arrays2 = new String[100];
//二维数组
int[][] arrays4 = new int[10][10];
//对象数组
Demo01[] arrays3 = new Demo01[10];

2、冒泡排序

        //冒泡排序
        for (int i = 0; i < arrays1.length-1; i++) {
            for (int j = arrays1.length-1; j > i; j--) {
                if (arrays1[j-1]>arrays1[j]){
                    swap(arrays1[j],arrays1[j-1]);
                }
            }
        }

四、Arrays类的常用方法

        //Arrays方法的使用
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

五、面向对象

1、什么是面向对象、构造器

以类的方式组织代码,以对象的组织封装数据。 

构造器的使用:

public class Person {
    String name;
    int age;

    //构造器,无参构造
    public Person() {
    }

    //有参构造:实例化对象初始值
    //一旦定义了有参构造,就一定要声明无参构造
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

2、封装

程序要讲究“高内聚,低耦合”,封装的核心是属性私有,get/set。

public class Person {
    private String name;
    private int age;

    //构造器,无参构造
    public Person() {
    }

    //有参构造:实例化对象初始值
    //一旦定义了有参构造,就一定要声明无参构造
    //Alt+Insert
    public Person(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) {
        if (age > 100 || age <1){
            this.age = 18;
        }else {
            this.age = age;
        }
    }
}

封装的作用:

(1)提高程序的安全性,保护数据。

(2)隐藏代码的实际细节

(3)统一接口

(4)系统可维护性提高 

3、继承

extends:子类可以使用父类的所有方法,但是私有属性必须通过get/set方法访问。所有类都默认继承Object类。

super:
1、super调用父类的构造方法,必须在构造方法的第一个
2、super 必须只能出现在子类的方法或者构造方法中!
3、super和 this 不能同时调用构造方法!

this:
代表的对象不同:
        this: 本身调用者这个对象
        super:代表父类对象的应用
前提:
        this:没有继承也可以使用
        super: 只能在继承条件才可以使用
构造方法:
        this() ;本类的构造
        super():父类的构造!

重写(Alt+Insert):需要有继承关系,子类重写父类方法

1、方法名必须相同

2、参数列表必须相同

3、修饰符范围可以扩大,不能缩小:public>protected>Defult>private

4、抛出的异常可以缩小,不能扩大:Exception(大) ==> ClassNotFoundException

子类重写的方法与父类只有方法体不同。

为什么需要重写:父类的方法子类不一定需要或不满足。 

4、多态

1、只有方法才有多态,属性没有多态

2、存在条件:继承关系,方法需要重写,父类引用指向子类对象: father f = new son(); 

3、instanceof及强制转换

//判断对象与类之间是否存在继承或被继承的关系
System.out.println(b1 instanceof B);
//强制类型转换,将父类对象强制转换为子类对象,以便使用子类方法
((B)b2).eat();

5、抽象类和抽象方法

public abstract class Demo10 {

    //没有方法体,必须由继承的子类重写方法
    //抽象类中可以写普通的方法,但非抽象类中不能写抽象方法
    //不能new,只能靠子类去实现
    public abstract void print();
}

6、接口

//interface接口
public interface UserService {

    //默认抽象方法
    void add();
    void delete();
    void update();
    void query();
}
public interface TimerService {
    void timer();
}
//接口实现类,implements
//必须重写接口的方法
//可以多继承
public class UerServiceImpl implements UserService, TimerService {
    public UerServiceImpl() {
        super();
    }

    @Override
    public void add() {

    }

    @Override
    public void delete() {

    }

    @Override
    public void update() {

    }

    @Override
    public void query() {

    }

    @Override
    public void timer() {

    }
}

 作用:

1、约束
2、定义一些方法,让不同的人实现
3、public static final
4、接口不能被实例化,接口中没有构造方法
5、implements可以实现多个接口
6、必须要重写接口中的方法

六、异常

public class Demo11 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //捕获异常,往往用于IO、资源的关闭  Ctrl+Alt+T
        try{
            new Demo11().run(a,b);
        }catch (Exception e){
            e.printStackTrace(); //打印错误的栈信息
        }finally {
            System.out.println("finally");
        }
    }

    //throw、throws抛出异常,用于方法
    public void run(int a,int b) throws Exception{
        if (b == 0){
            throw new Exception();
        }
    }

}

 七、常用类

1、Object类

(1)toString(),equals()都是与地址值直接相关,而我们往往需要具体的变量,故需要对该类方法进行重写(toString()可以右键)。

(2)clone():被克隆的对象需要实现接口Cloneable,然后再重写clone()类,之后才可被新建的对象调用

浅克隆:基本数据类型和引用数据类型(地址)都拷贝过来,Object的clone是浅克隆。

深克隆:把基本数据类型拷贝过来,会建立新的引用数基础类型。

3、 Random类

1、public Random()

此构造方法是以系统自身的时间为种子数来构造Random对象。

2、public Random(long seed)

此构造方法可以手动选定具体的种子来构造Random对象。

使用方式:

new一个Random对象,用nextInt()方法赋值。

        //Random类
        Random random = new Random();
        int r = random.nextInt();
        System.out.println(r);
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Random r1 = new Random(n);
        System.out.println(r1.nextInt());

4、包装类

即基本数据类型对应的对象,在JDK5以后,提出自动装箱和自动拆箱的机制。

自动装箱:将基本数据类型自动转换为对象的包装类

自动拆箱:将包装类自动转换为对应的基本数据类型

包装类应用于数据转换:

        //将整数转换为二进制
        String  n1 = Integer.toBinaryString(200);
        System.out.println(n1);

        //将整数转换为八进制
        String  n2 = Integer.toOctalString(200);
        System.out.println(n2);

        //将整数转换为八进制
        String  n3 = Integer.toHexString(200);
        System.out.println(n3);

        //转换为整数
        //注意:每一种类型都有对应的parseXxx进行转换
        int n4 = Integer.parseInt("999");
        System.out.println(n4);

        String s = "true";
        boolean n5 = Boolean.parseBoolean(s);
        System.out.println(n5);

注意:以后默认输入就用nextLine()。

public class Demo13 {
    public static void main(String[] args) {
        //Integer应用于键盘输入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数据:");
        String str = sc.nextLine();
        double v = Double.parseDouble(str);
        System.out.println(v+1);

    }
}

5、SimpleDateFormat

 作用:把时间变成合适的格式;把字符串表示的时间变成Date对象。

时间格式:yyyy-MM-dd HH:mm:ss  或  yyyy年MM月dd日 HH:mm:ss

时间格式化:

public class Demo14 {
    public static void main(String[] args) {

        //无参构造
        SimpleDateFormat sf1 = new SimpleDateFormat();
        Date d1 = new Date(System.currentTimeMillis());
        String str1 = sf1.format(d1);
        System.out.println(str1); //1970/1/1 上午8:00

        //有参构造
        SimpleDateFormat sf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
        Date d2 = new Date(System.currentTimeMillis());
        String str2 = sf2.format(d2);
        System.out.println(str2);
    }
}

6、Calendar类

注意:Calendar是一个抽象类,不能直接new,而是通过静态方法获取子类对象(getInstance())

1、会通过不同时区来获取不同的日历对象,默认表示当前时间。

2、会把时间当中的字段放到一个数组中。

 

 3、获取日历的某个字段信息

public class Demo15 {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        System.out.println(c);

//        //修改时间
//        Date d = new Date(0L);
//        c.setTime(d);
//        System.out.println(c);

        //获取日历的某个字段信息
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int date = c.get(Calendar.DAY_OF_MONTH);
        int week = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(year + "年" + month + "月" + date + "日" + " " + getWeek(week));
    }

    public static String getWeek(int week){
        switch (week){
            case 0: return "";
            case 1: return "星期日";
            case 2: return "星期一";
            case 3: return "星期二";
            case 4: return "星期三";
            case 5: return "星期四";
            case 6: return "星期五";
            case 7: return "星期六";
            default: return "无";
        }
    }
}

4、修改和增加

7、JDK8时间类

 8、StringBuilder类

 可以看作一个容器,创建的内容是可变的,提高字符串的操作效率。

作用场景:

1、字符串的拼接

2、字符串的反转

StringBuilder的使用:

public class Demo16 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值