JAVA高级-1

常用API

第一章 API

产品说明书

第二章 Scanner类(输入)

功能:获取键盘输入

package day7_12.demo01_Scanner;

import  java.util.Scanner;      //1、导包
/*
功能:获取键盘输入

引用类型一般使用步骤
    1、导包:
        import 包路径 类名称
        如果需要使用的目标类和当前类处于同一个包下,则可以省略导包语句
        只有java.lang包下的内容不需要导包,其余的都需要import语句
    2、创建
        类名称 对象名=new 类名称();
    3、使用
        对象名.成员方法名()
*/

/*
    获取键盘输入的一个int数字:int num =sc.nextInt();
    获取键盘输入的一个字符串:String str =sc.next();
*/
public class demo01_Scanner {
    public static void main(String[] args) {
        //2、创建
        Scanner sc=new Scanner(System.in);
        //system.in表示从键盘输入

        //3、获取键盘输入的int数字
        int num =sc.nextInt();
        System.out.println("输入的int数字是:"+num);

        String str =sc.next();
        System.out.println("输入的字符串是:"+str);
    }
}

image.png

练习题

1、获取键盘输入的两个数字求和

package day7_12.demo01_Scanner;
import java.util.Scanner;

public class Scanner_exercise01 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int one=scanner.nextInt();
        int two=scanner.nextInt();
        System.out.println(one+"+"+two+"="+(one+two));
    }
}

image.png

package day7_12.demo01_Scanner;
import java.util.Scanner;

public class Scanner_exercise01 {
    public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
        int one=scanner.nextInt();
        int two=scanner.nextInt();
        int san=scanner.nextInt();
        int a=one>two?one:two;
        int max=a>san?a:san;
        System.out.println("最大值是:"+max);
    }
}

image.png

匿名对象

只能使用一次

new person().name="张三";			//把张三交给匿名对象

image.png

第三章 Random(随机数)

功能:用来生成随机数

package cn.java_gj.demo713;

import java.util.Random;

public class demo01random {
    public static void main(String[] args) {
        Random r =new Random();
        int num=r.nextInt();
        System.out.println("随机数是:"+num );
    }
}

image.png
指定生成的随机值范围(左闭右开区间)

package cn.java_gj.demo713;

import java.util.Random;

public class demo01random {
    public static void main(String[] args) {
        Random r =new Random();
        int num=r.nextInt(1000)+1;	//生成1-1000之间的随机数字
        System.out.println("随机数是:"+num );
    }
}

猜数字

package cn.java_gj.demo713;

import java.util.Random;
import java.util.Scanner;

public class demo01random {
    public static void main(String[] args) {
        Random r =new Random();
        Scanner s=new Scanner(System.in);
        int num=r.nextInt(100)+1;
        int num1=0;
        do {
             num1= s.nextInt();
             if (num>num1){
                 System.out.println("猜小了");
             }else if(num<num1){
                 System.out.println("猜大了");
             }else{
                 System.out.println("OK!");
             }
        }while (num!=num1);
    }
}

image.png

第四章 Arraylist(集合)

package cn.java_gj.demo713;
import java.util.ArrayList;
/*
数组的长度不可以发生改变
但是ArrayList集合的长度是可以随意变化的


对于ArrayList来说,有一个尖括号<E>代表泛型
泛型:也就是装在集合元素当中所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
**/

public class demo02ArrayList {
    public static void main(String[] args) {
        //创建了一个ArrayList集合,集合的名称是list,里面装的全都是string类型的数据
        ArrayList<String> list=new ArrayList<>();
        //直接打印输出不会输出地址值,而是会输出保存的内容
        //如果内容是空,输出[];
        //如果有多个字符串,会用,进行分割
        System.out.println(list);
        list.add("张三");
        System.out.println(list);
        list.add("罗翔");
        list.add("张大仙");
        list.add("树叶");
        list.add("马保国");
        System.out.println(list);
    }
}

创建数据类型后不要放入其他数据类型,会报错
image.png

集合常用的操作语句
package cn.java_gj.demo713;
import java.util.ArrayList;
/*
数组的长度不可以发生改变
但是ArrayList集合的长度是可以随意变化的


对于ArrayList来说,有一个尖括号<E>代表泛型
泛型:也就是装在集合元素当中所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
**/

public class demo02ArrayList {
    public static void main(String[] args) {
        //创建了一个ArrayList集合,集合的名称是list,里面装的全都是string类型的数据
        ArrayList<String> list=new ArrayList<>();
        //直接打印输出不会输出地址值,而是会输出保存的内容
        //如果内容是空,输出[];
        //如果有多个字符串,会用,进行分割
        System.out.println(list);
     /*    list.add("张三");
       System.out.println(list);
        list.add("罗翔");
        list.add("张大仙");
        list.add("树叶");
        list.add("马保国");
        System.out.println(list);*/


        //添加.add,会返回一个布尔值来表示添加的状态
        boolean success=   list.add("张三");
        System.out.println(list);
        System.out.println("添加状态是否成功:"+success);
        list.add("罗翔");
        list.add("张大仙");
        list.add("树叶");
        list.add("马保国");

        //从集合中获取元素.get。索引值从0开始
        System.out.println(list.get(3));        //读取3号索引
        System.out.println(list);

        //从集合中删除元素.remove,并返回删除的值
        String whoremove = list.remove(3);//删除索引为3的值
        System.out.println(list);
        System.out.println("被删除的是:"+whoremove);


        //从集合中获取集合的长度.size(也就是元素的个数)
        int length=list.size();
        System.out.println("集合的长度是:"+length);
    }
}

image.png

集合的遍历
 //集合的遍历
        for (int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }

image.png

集合放置其他类型的数据

image.png
其他手法与上面字符串一模一样
image.png

练习

1

package cn.java_gj.demo713;

import java.util.ArrayList;
import java.util.Random;
//        生成6个1-33之间的随机整数,添加到集合并遍历
public class arraylist_lianxi {
    public static void main(String[] args) {

        ArrayList<Integer> intlist=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i <6 ; i++) {
            intlist.add(r.nextInt(33)+1);
        }
        //遍历
        for (int i = 0; i < intlist.size(); i++) {
            System.out.println(intlist.get(i));
        }
    }
}

image.png
2

package cn.java_gj.demo713;

public class student {
    public String name;
    public int age;
//使用快捷键alt+insert可进行自动生成下面代码
    public student() {
    }

    public student(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) {
        this.age = age;
    }
}

package cn.java_gj.demo713;

import java.util.ArrayList;
import java.util.Random;

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

        //自定义student类,创建四个学生对象,添加到集合
     /*   student a=new student("张三",18);
        student b=new student("李四",18);
        student c=new student("王五",18);
        student d=new student("赵六",18);*/
        ArrayList<student> studentlist=new ArrayList<>();
        studentlist.add( new student("张三",18));
        studentlist.add( new student("李四",18));
        studentlist.add( new student("王五",18));
        studentlist.add( new student("赵六",18));

        for (int i = 0; i < studentlist.size(); i++) {
            System.out.println(studentlist.get(i).getName()+":"+studentlist.get(i).getAge());
        }
    }
}

image.png

3 集合也能当做方法的参数的

package cn.java_gj.demo713;

import java.util.ArrayList;
import java.util.Random;

public class arraylist_lianxi {
    public static void main(String[] args) {
        //定义以指定格式打印集合的方法(ArrayList)作为参数,使用{}扩起来,使用@分割元素
        ArrayList<Integer> intlist=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i <6 ; i++) {
            intlist.add(r.nextInt(33)+1);
        }
        printArraylist(intlist);
    }
    //定义打印方法
    public static void printArraylist(ArrayList<Integer> list){
        System.out.print("{");
        //遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
            if (i==(list.size()-1)){

            }else {
                System.out.print(" @ ");

            }
        }
        System.out.print("}");
    }
}

image.png

4

package cn.java_gj.demo713;

import java.util.ArrayList;
import java.util.Random;

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

        //用一个大集合存入20个随机数字,然后筛选其中的偶数元素,放到小集合中
        ArrayList<Integer> intlist=new ArrayList<>();
        ArrayList<Integer> intlistso=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i <20 ; i++) {
            intlist.add(r.nextInt(33)+1);
        }
        intlistso= printArraylist(intlist);
        System.out.println(intlistso);
    }
    public static ArrayList<Integer> printArraylist(ArrayList<Integer> list) {
        ArrayList<Integer> lists=new ArrayList<>();
        //遍历
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) % 2 == 0) {
                lists.add(list.get(i));
            }
        }
        return lists;
    }

}

image.png

第五章 String类(字符串)

构造方法

image.png
image.png

常量池

image.png

字符串比较相关方法

image.png

package cn.gjdemo715;



public class demo01string {

    public static void main(String[] args) {
        String str1="Hello";
        String str2="Hello";
        char[] charArray={'H','e','l','l','o'};
        String str3=new String(charArray);

        //根据内容进行比较
        System.out.println(str1.equals(str2));  //true
        System.out.println(str2.equals(str3));  //true
        System.out.println(str2.equals("Hello"));  //true
        //比较格式推荐实用前面字符串后面是对象的格式,来避免空指针
        String str5=null;
        System.out.println("abc".equals(str5));     //推荐 false
//        System.out.println(str5.equals("abc"));     //不推荐 会报空指针异常的错误
        System.out.println("===========================");

        //忽略大小写比较
        String strA="Java";
        String strB="java";
        System.out.println(strA.equals(strB));  //false,严格区分大小写
        System.out.println(strA.equalsIgnoreCase(strB));    //true 忽略大小写

    }
}

字符串的获取相关方法
  • public int length () :返回此字符串的长度。
  • public String concat (String str) :将指定的字符串连接到该字符串的末尾。
  • public char charAt (int index) :返回指定索引处的 char值。
  • public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
package cn.gjdemo715;

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

        ///计算字符串长度
        int len ="kjdashfkjdsahfkjsdahjkf".length();
        System.out.println("字符串长度是:"+ len);
        System.out.println("===========");

        //字符串的拼接(字符串不能随意改变)是常量
        String str1="Hello";
        String str2="World";
        String str3=str1.concat(str2);
        String str4=str1+str2;
        System.out.println(str1);       //Hello
        System.out.println(str2);       //World
        System.out.println(str3);   //HelloWorld
        System.out.println(str4);   //HelloWorld
        System.out.println("===========");

        //获取索引位置的单个字符串
        System.out.println(str3.charAt(1)); //e(从下标0开始计数)
        System.out.println("===========");

        //获取参数字符串在本来字符串中出现的第一次索引的位置
        //如果没有,就返回-1值
        System.out.println(str3.indexOf("llo"));    //2
    }
}

字符串的截取方法
  • public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符 串结尾。
  • public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
 package cn.gjdemo715;

public class demo03string_cut_out {
    public static void main(String[] args) {
        String str="helloWorld";
        System.out.println(str.substring(5));      //World
        System.out.println(str.substring(4,7));      //oWo

    }
}

字符串的转换方法
  • public char[] toCharArray () :将此字符串转换为新的字符数组。
  • public byte[] getBytes () :使用平台的默认字符集将该 String编码转换为新的字节数组。
  • public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
package cn.gjdemo715;

import java.nio.charset.StandardCharsets;

public class demo04string_convert {
    public static void main(String[] args) {
        //将字符串拆分成单个字符数组
        char[] chats="Hello".toCharArray();
        for (int i = 0; i < chats.length; i++) {
            System.out.println(chats[i]);
            //hello
        }
        System.out.println("===========================");

        //转化成字节数组
        byte[] bytes="Hello".getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }
        /*
        72
        101
        108
        108
        111
        */
        System.out.println("===========================");

        //替換指定字符串
        String str1="How do you do?";
        String str2=str1.replace("o","*");
        System.out.println(str1);   //How do you do?
        System.out.println(str2);   //H*w d* y*u d*?
        System.out.println("===========================");
    }
}

字符串的分割
  • public String[] split(String regex) :将此字符串按照给定的regex(规则)拆分为字符串数组。
package cn.gjdemo715;

public class demo05string_split { 
    public static void main(String[] args) {
        String str1="aaa,bbb,ccc,ddd";
        String [] array1=str1.split(",");
        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i]);
        }
/*
aaa
bbb
ccc
ddd
* */
    }
}

注意事项:split方法的参数其实是一个“正则表达式”,如果切割的标准是.(英文据点)需要使用转义\.来实现

练习
拼接字符串

定义一个方法,把数组{1,2,3}按照指定个格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。

package cn.gjdemo715;

public class stringlianxi {
    //定义一个方法,把数组{1,2,3}按照指定个格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。

    public static void main(String[] args) {
        int[] array={1,2,3};    //定义数组
        String s=forArrayToString(array);   //调用方法
        System.out.println(s);      //输出字符串
        //[1#2#3]
    }

    public static String forArrayToString(int[] array){
        String s = new String("[");
        for (int i = 0; i < array.length; i++) {
            if (i== array.length-1){
                s=s.concat(array[i]+"]");
            }else {
                s=s.concat(array[i]+"#");
            }
        }
        return s;
    }
}

统计字符个数

键盘录入一个字符,统计字符串中大小写字母及数字字符个数

 public static void main(String[] args) {
        Scanner inster=new Scanner(System.in);
        String s=inster.next();

        int bigCount=0;
        int smallCount=0;
        int numberCount=0;

        for (int i = 0; i <s.length() ; i++) {
            char ch=s.charAt(i);
            if (ch>='A'&& ch<='Z'){
                bigCount++;
            }else if (ch>='a'&& ch<='z'){
                smallCount++;
            }else if (ch>='0'&& ch<='9'){
                numberCount++;
            }else {
                System.out.println("该字符串:"+ch+" 非法!");
            }
        }

        System.out.println("大写字母个数为:"+bigCount);
        System.out.println("小写字母个数为:"+smallCount);
        System.out.println("数字个数为:"+numberCount);
    }

image.png
或者使用tochararray转化成字符串数组后在进行比较
image.png

第六章 静态static关键字

关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。

修饰对象
package cn.gjdemo716;

public class demo01static {
    public static void main(String[] args) {
        student one=new student("张三",18);
        student.room="j1-101";
        System.out.println("姓名:"+one.getName()
                +",年龄:"+one.getAge()+",教室:"+one.room+",学号:"+one.getId());
        student two=new student("李四",18);
        System.out.println("姓名:"+two.getName()
                +",年龄:"+two.getAge()+",教室:"+two.room+",学号:"+two.getId());
    }
}

package cn.gjdemo716;

public class student {
    private int id;
    private String name;
    private int age;
    static  String room;
    private static int idCounter=0;  //学号计数器,每当new一个新对象,计数器++

    public student() {
        idCounter++;
    }

    public student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id=++idCounter;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

会把第一个用户设置的教室带入到全局
image.png

内存图

image.png

修饰方法
package cn.gjdemo716;

public class Myclass {
    public void method(){
        System.out.println("普通成员方法");
    }

    public static void methodStatic(){
        System.out.println("这是一个静态方法");
    }
}

 package cn.gjdemo716;

/*
如果没有static关键字,那么必须要先创建对象,然后通过对象才能使用它。
如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它。

无论是成员变量还是成员方法,如果有了static,都推荐实用类名称进行调用
静态变量:类名称.静态变量
静态方法:类名称.静态方法()
对于本类中的静态发放,可以省略类名称

注意事项:
1、静态不能直接访问非静态。
原因:因为在内存当中是【先】有静态内容,【后】有非静态内容
2、静态方法中不能使用this关键字
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象
*/
public class demo02staticmMethod {
    public static void main(String[] args) {
        Myclass obj=new Myclass();      //创建对象
        //使用咩有static关键字的内容
        obj.method();

        //对于静态方法来说,可以通过对象名进行调用,也可以通过类名调用
        Myclass.methodStatic();         //推荐
        obj.methodStatic();             //不推荐

    }

}

image.png

静态代码块
静态代码块
静态代码块:定义在成员位置,使用static修饰的代码块{ }。
位置:类中方法外。
执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。
格式:
// 访问类变量
类名.类变量名;
// 调用静态方法
类名.静态方法名(参数)public class StuDemo2 {
public static void main(String[] args) {
// 访问类变量
System.out.println(Student.numberOfStudent);
// 调用静态方法
Student.showNum();
}
}

小贴士:
static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况
下,去调用方法。下面将介绍两个工具类,来体现static 方法的便利。

image.png

第七章 Arrays

public static String toString(int[] a) :返回指定数组内容的字符串表示形式。
public static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。

  1. 如果是数值,sort默认按照升序从小到大
  2. 如果是字符串,sort默认按照字母升序
  3. 如果是自定义的列席,那么这个自定义的类需要有Comparable或者Comparator接口支持
package cn.gjdemo717;

import java.util.Arrays;

public class demo01arrays {
    public static void main(String[] args) {
        int [] intArray={66,11,88,99,55,22};
        String intStr= Arrays.toString(intArray);
        System.out.println(intStr);
        //[66, 11, 88, 99, 55, 22]

        //public static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
        Arrays.sort(intArray);
        System.out.println(Arrays.toString(intArray));
        //[11, 22, 55, 66, 88, 99]

        //练习请使用 Arrays 相关的API,将一个随机字符串中的所有字符升序排列,并倒序打印
        /*String two=Arrays.toString(intArray);
        for (int i = two.length()-1; i >0 ; i--) {
            System.out.println(two.charAt(i));
        }*/
        String str="ndksahbfjkdsahfjksdahjklfh";
        char[] chars=str.toCharArray();         //把字符串变成字符数组
        Arrays.sort(chars);                     //排序
        //倒印
        for (int i = chars.length-1; i >0 ; i--) {
            System.out.print(chars[i]+" , ");
        }
    }

}

image.png

第八章 Math类

java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。

  • public static double abs(double a) :返回 double 值的绝对值。
  • public static double ceil(double a) :返回大于等于参数的最小的整数。(不是四舍五入,是取整)
  • public static double floor(double a) :返回小于等于参数最大的整数。(不是四舍五入,是取整)
  • public static long round(double a) :返回最接近参数的 long。(相当于四舍五入方法)
  • public PI:表示圆周率
package cn.gjdemo717;

public class demo02Math {
    public static void main(String[] args) {
        //取绝对值
        System.out.println(Math.abs(3.14)); //3.14
        System.out.println(Math.abs(0));    //0
        System.out.println(Math.abs(-250));     //250
        System.out.println("==========================");

        //向上取整
        System.out.println(Math.ceil(3.1));  //4.0
        System.out.println("==========================");

        //向下取整
        System.out.println(Math.floor(4.9));   //4.0
        System.out.println("==========================");

        //四舍五入
        System.out.println(Math.round(4.5));    //5
        System.out.println(Math.round(4.4));    //4

    }
}

练习

请使用 Math 相关的API,计算在 -10.8 到 5.9 之间,绝对值大于 6 或者小于 2.1 的整数有多少个?
image.png

package cn.gjdemo717;

public class Mathlx {
    public static void main(String[] args) {
        int count=0;    //用来统计个数
        double min =-10.8;
        double max=5.9;
        for (int i = (int) min; i <max ; i++) {
            if (Math.abs(i)>6||Math.abs(i)<2.1){
                System.out.print(i+" ");
                count++;
            }
        }
        System.out.println(count);
    }
}
//-10 -9 -8 -7 -2 -1 0 1 2 9

继承与多态

第一章 继承

继承:就是子类继承父类的属性行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接 访问父类中的非私有的属性和行为。image.png

继承的基本格式

例子

package cn.gjdemo718;

public class demo01jc {
    public static void main(String[] args) {
        Student one=new Student();
        one.method();           //父类method执行!
        one.print();

        System.out.println("===================");
        Student2 two=new Student2();
        two.method();           //父类method执行!
        two.print2();

        System.out.println("===================");
        Employee three=new Employee();
        three.method();
    }

    //父类只能执行自己的方法
    //子类可以执行自己和父类的方法,但是不能执行其他子类的方法
    
}

package cn.gjdemo718;

public class Employee {
    public void method(){
        System.out.println("父类method执行!");
    }
}

package cn.gjdemo718;

public class Student2 extends Employee{
    public void print2(){
        System.out.println("子类student2执行");
    }
}

package cn.gjdemo718;

//子类使用extends引用父类名称
public class Student extends Employee{
    public void print(){
        System.out.println("子类student执行");
    }
}

执行效果
image.png

当参数与父类重名的时候,优先使用本类的参数。如果本类没有,才去向父类继承。

继承的子、父、局部变量的使用方式
  • 局部变量:直接写成员变量名
  • 本类成员变量:this.成员变量名
  • 父类成员变量:super.成员变量名
package cn.gjdemo718.demo02;

public class my_threeMethod {
    public static void main(String[] args) {
        zi zi=new zi();
        zi.method();
    }
}

package cn.gjdemo718.demo02;

public class fu {
    int num=10;
}

package cn.gjdemo718.demo02;

public class zi  extends fu{
    int num=20;
    public void method(){
        int num=30;
        System.out.println(num);            //30,局部变量
        System.out.println(this.num);       //20,本类成员变量
        System.out.println(super.num);      //10,父类成员变量
    }
}

image.png
如果是方法,也是同上,谁创建优先用谁,如果子类没有,则向上找。

继承中方法的覆盖重写

方法覆盖重写的注意事项:
1、必须保证父子类之间方法的名称相同,参数列表也相同。
@Override:写在方法前面,用来检测是不是有效的正确覆盖重写

当出现不一致时检测会报错
image.png

2、子类方法的返回值必须【小于等于】父类方法的返回值范围
前提:java.lang.object类是所有类的公共最高父类,其他的类都比他小

image.png

3、子类方法的权限必须【大于等于】父类方法的权限修饰符。
小扩展提示:public > protected > (default)> private
备注:(default)不是关键字default,而是什么都不写,留空。

小于就会报错
image.png

package cn.gjdemo718.demo03;

public class Zi extends Fu{
    @java.lang.Override
    public String method(){
        return null;
    }
}

package cn.gjdemo718.demo03;

public class Fu {
    public Object method(){
        return 0;
    }
}

覆盖重写的应用

设计原则:对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性内容,并且添加改动新内容。

举例说明
当一个手机要新增加来电显示头像和名字时,采用覆盖重写的方法
其中使用到super关键字

package cn.extend.demo01;

//老手机
public class Phone {
    public void call(){
        System.out.println("打电话");
    }
    public void send(){
        System.out.println("发短信");
    }
    public void show(){
        System.out.println("显示号码");
    }
}

package cn.extend.demo01;

//新手机多出来电显示功能
public class NewPhone extends Phone {
    @Override
    public void show(){
        super.show(); //把父类的show方法拿过来接着使用
        System.out.println("显示姓名");
        System.out.println("显示头像");
    }
}

package cn.extend.demo01;

public class RunPhone {
    public static void main(String[] args) {
        //老手机
        Phone phone=new Phone();
        phone.call();
        phone.send();
        phone.show();
        System.out.println("==================");


        NewPhone newPhone=new NewPhone();
        newPhone.call();
        newPhone.send();
        newPhone.show();
    }

    /* 显示
打电话
发短信
显示号码
==================
打电话
发短信
显示号码
显示姓名
显示头像
* */
}

继承关系中构造方法的访问特点

1、子类构造方法中有一个默认隐含的“super()”调用。所以一定先调用父类后子类
2、如果父类不是无参构造方法(父类方法需要传参),则可以使用super(参数)来实现重载调用
3、super的父类构造待用,必须是子类构造方法的第一个语句。且不能多次调用

举例

package cn.extend.demo02;

public class Fu {
    public  Fu(){
        System.out.println("父类无参构造方法!");
    }
    public  Fu(int num){
        System.out.println("父类有参构造方法!");
    }
}

package cn.extend.demo02;

public class Zi extends Fu{
    public  Zi(){
//        super();    系统自带,对应父类无参构造方法
        super(1);    //当父类有参时,用super实现重载调用
        System.out.println("子类构造方法!");
    }
}

package cn.extend.demo02;

public class Run {
    public static void main(String[] args) {
        Zi zi =new Zi();


    }

/*输出:先父后子
父类构造方法!
子类构造方法!
* */
}

super关键自的三种用法

1:在子类的成员方法中,访问父类的成员变量
2:在子类成员中,访问父类的成员方法
3:在子类的构造方法中,访问父类的构造方法

package cn.extend.demo03;

public class Fu {
    int num=666;
    public void  method(){
        System.out.println("父类方法");
    }
}

package cn.extend.demo03;

public class Zi extends Fu{
    int num=7777;
    public void methodZi(){
    //用法1,在子类成员中,访问父类的成员变量
        System.out.println(super.num);
    }

    //用法2:在子类成员中,访问父类的成员方法
    public void  method(){
        super.method(); //访问父类方法
        System.out.println("子类方法");
    }

    //用法3:在子类的构造方法中,访问父类的构造方法
    public Zi(){
        //默认赠送super
    }
}

package cn.extend.demo03;

public class Run {
    public static void main(String[] args) {
        Zi zi =new Zi();
        zi.methodZi();
        zi.method();
    }
}

image.png

this关键字的用法

super关键字用来访问父类内容,this关键字用来访问本类内容
1、在本类成员方法中,访问本类的成员变量
2、在本类的成员方法中,访问本类的另一个成员方法。
3、在本类的构造方法中,访问本类的另一个构造方法。
a:其中this也必须是构造方法的第一个语句,也是唯一一个
b:super和this两种构造调用不能同时使用,因为他们都要求唯一(使用this后将不会默认赠送super)

package cn.extend.demo04;

public class Fu {
    int num=30;
}

package cn.extend.demo04;

public class Zi extends Fu{
/*
 super关键字用来访问父类内容,this关键字用来访问本类内容


 1、在本类成员方法中,访问本类的成员变量
 2、在本类的成员方法中,访问本类的另一个成员方法。
 3、在本类的构造方法中,访问本类的另一个构造方法。
    a:其中this也必须是构造方法的第一个语句,也是唯一一个
    b:super和this两种构造调用不能同时使用,因为他们都要求唯一(使用this后将不会默认赠送super)
* */
    int num =20;
    public void showNum(){
        int num=10;
        System.out.println(num);  //输出局部变量
        System.out.println(this.num);  //输出子类成员变量
        System.out.println(super.num);  //输出父类成员变量
    }

    public void methodA(){
        System.out.println("AAA");
    }

//2、在本类的成员方法中,访问本类的另一个成员方法。
    public void methodB(){
        methodA();
        //或者
        this.methodA();  //与上面功效一样,起强调作用,表示它不来自于父类
        System.out.println("BBB");
    }

//3、在本类的构造方法中,访问本类的另一个构造方法。(也叫构造方法的重载调用)
    public Zi(){
        this(123);  //本类的无参构造调用本类的有参构造
    }
    public Zi(int n){
        System.out.println(n);
    }
}

package cn.extend.demo04;

public class Run {
    public static void main(String[] args) {
        Zi zi=new Zi();
        zi.showNum();  //方法1
        System.out.println("================");
        zi.methodB();  //方法2
    }
}

第二章 抽象类

介绍:
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有 意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法 的类就是抽象类

定义:
**抽象方法 **: 没有方法体的方法。
抽象类:包含抽象方法的类。

使用方法
如何使用抽象类和抽象方法:
1、不能直接创建new抽象类对象
2、必须用一个子类来继承抽象父类
3、子类必须用覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后不上方法体和大括号
4、创建子类对象进行使用

定义一个抽象类

package cn.abstraction.demo01;

/*
抽象方法:就是加上abstract关键字,然后去掉大括号直接分号结束
抽象类:抽象方法所在的类,必须是抽象类才行,在class之前加上abstract即可

如何使用抽象类和抽象方法:
1、不能直接创建new抽象类对象
2、必须用一个子类来继承抽象父类
3、子类必须用覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后不上方法体和大括号
4、创建子类对象进行使用


* */
public abstract class Animal {
//    这是一个抽象方法,代表吃东西,但是具体吃什么(大括号内容)不确定。
    public abstract void eat();


}

使用一个子类来调用父类(抽象类)

package cn.abstraction.demo01;

//2、必须用一个子类来继承抽象父类

public class Zanimal extends Animal{

    //3、子类必须用覆盖重写抽象父类当中所有的抽象方法。
    //覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后不上方法体和大括号
    public void eat(){
        System.out.println("这是重写后的抽象类");
    }
}

最后起一个方法进行运行

package cn.abstraction.demo01;

public class cat {
    public static void main(String[] args) {
//        4、创建子类对象进行使用
        Zanimal zanimal=new Zanimal();
        zanimal.eat();
    }
}

输出子类的内容
image.png

注意事项

关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

  1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
    理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
  2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
    理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。

  1. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象
    类。
    理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有
    意义。(如果有两个类,需要全部重写才能避免报错,两个类可以被多层嵌套,可以嵌套到孙子类)
综合案例

image.png

user类

用来存储user信息和输出用户余额

package cn.abstraction.demo02;

public class User {
    private String name; //名字
    private float money; //金额

    //无参构造
    public User() {

    }

    //两个传参
    public User(String name, float money) {
        this.name = name;
        this.money = money;
    }

    //getter和setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getMoney() {
        return money;
    }

    public void setMoney(float money) {
        this.money = money;
    }

//    展示当前用户的余额
    public void show(){
        System.out.println("我叫:"+name+","+"我有:"+money+"元");
    }
}

群主类

用来下发红包

package cn.abstraction.demo02;

import java.util.ArrayList;

public class owner extends User{
    public owner() {
    }

    public owner(String name, float money) {
        super(name, money);
    }
    public ArrayList<Float> send(int totalMoney ,int count){
//        使用集合来存储若干红包的金额
        ArrayList<Float> redList=new ArrayList<>();
//          看一下群主自己有多少钱
        float leftMoney=super.getMoney(); //群主当前的余额
        if (totalMoney>leftMoney){
            System.out.println("余额不足");
            return redList;  //返回空集合
        }
//        扣钱,其实就是重新设置余额
        super.setMoney(leftMoney-totalMoney);
        float avg =totalMoney/count;
        float mod=totalMoney%count;

        //把钱放到红包中
        for (int i = 0; i <count-1 ; i++) {
            redList.add(avg);
        }
//        最后一个红包
        float last=avg+mod;
        redList.add(last);
        return redList;
    }

}

群员类

用来领红包

package cn.abstraction.demo02;

import java.util.ArrayList;
import java.util.Random;

public class mass extends User{
    public mass() {
    }

    public mass(String name, float money) {
        super(name, money);
    }

    public void receive(ArrayList<Float>list){
        int index=new Random().nextInt(list.size());
//        根据索引,从集合中删除
        float delta=list.remove(index);
//        获取我当前钱包的金额
        float money=super.getMoney();
//        修改金额为抢红包后的金额
        super.setMoney(money+delta);
    }
}

主体
package cn.abstraction.demo02;

import java.util.ArrayList;

public class run {
    public static void main(String[] args) {
//        设置群主
        owner owners=new owner("群主",200);
//        设置群员
        mass one=new mass("群员A",0);
        mass two=new mass("群员B",20);
        mass three=new mass("群员C",0);

        owners.show();
        one.show();
        two.show();
        three.show();
        System.out.println("===============");

//        群主发红包
        ArrayList<Float>redList=owners.send(80,3);
//        群员领红包
        one.receive(redList);
        two.receive(redList);
        three.receive(redList);
//        打印红包余额
        owners.show();
        one.show();
        two.show();
        three.show();
    }


}

第三章 接口

package cn.prot.demo01;


/*
接口就是多个类的公共规范
接口是一种引用数据类型,最重要的内容就是其中的抽象方法

如何定义一个接口格式
public interface 接口名称{
    //接口内容
}

备注:换成了关键字interface之后,编译生成的字节码文件仍然是:.java -->.class。

如果是java 7,那么接口中可以包含的内容有
1、常量
2、抽象方法

如果是java8还可以包含
1、默认方法
2、静态方法

如果是java9还可以包含
私有方法


接口使用步骤
1、接口不能直接使用,必须有个“实现类”来实现该接口
格式:
public class 实现类名称 inmplements 接口名称{
    //...
}
2、接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
实现:去掉abstract关键字,加上方法体大括号

3、创建实现类的对象进行使用。
注意事项:
如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类

*/
public class interfaces {
    public static void main(String[] args) {
//        错误写法!不能直接new接口对象使用
//        Myinterface inter =new Myinterface();

//        创建实现类的对象使用
        MyInterfacerun impl =new MyInterfacerun();
        impl.methodAbs1();
//        输出:这是第一个方法 
    }

}

定义接口

image.png

package cn.prot.demo01;

/*
任何版本的java中,接口都能定义抽象方法
格式:
public abstract 返回值类型 方法名称(参数列表);

注意事项:
1、接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
2、上面两个关键字修饰符可以选择性省略
3、方法的三要素可以随意定义


*/

public interface Myinterface {

//    这是一个抽象方法
    public abstract void methodAbs1();
    abstract void methodAbs12();
    public void methodAbs13();
    void methodAbs14();
}

实现抽象方法

使用alt+回车快捷键补全
image.png
实现类

package cn.prot.demo01;

public class MyInterfacerun implements Myinterface{
    @Override
    public void methodAbs1() {
        System.out.println("这是第1个方法");
    }

    @Override
    public void methodAbs12() {
        System.out.println("这是第2个方法");
    }

    @Override
    public void methodAbs13() {
        System.out.println("这是第3个方法");
    }

    @Override
    public void methodAbs14() {
        System.out.println("这是第4个方法");
    }
}

接口的默认方法的使用
package cn.prot.demo02;
/*
从java8开始,接口里允许定义默认方法
public default 返回值类型 方法名称(参数列表){
    方法体
}
备注:接口当中的默认方法,可以解决接口升级的问题

* */

public interface MyInterfaceDefaultI {
//    抽象方法
    public abstract void methodAbs();
//    当你再使用上面的方法定义一个新的抽象方法时,需要重新覆盖重写,你又不想覆盖重写,就需要用到默认方法

//    新添加的方法改成默认方法
    public default void methodAbs2(){
        System.out.println("这是新添加的默认方法");
    }
}

package cn.prot.demo02;

public class MyInterfaceDefault implements MyInterfaceDefaultI{

    @Override
    public void methodAbs() {
        System.out.println("实现了抽象方法AAA");
    }
}

package cn.prot.demo02;

public class MyInterfaceDefaultB implements MyInterfaceDefaultI{
    @Override
    public void methodAbs() {
        System.out.println("实现了抽象方法BBB");
    }

    @Override
    public void methodAbs2() {
        /*MyInterfaceDefaultI.super.methodAbs2();*/
        System.out.println("实现类B覆盖重写了接口的默认方法");
    }
}

package cn.prot.demo02;
/*
1、接口的默认方法,可以通过接口实现类对象,直接调用
2、接口的默认方法,也可以被接口实现类进行覆盖重写
 */
public class demo02run {
    public static void main(String[] args) {
        MyInterfaceDefault a=new MyInterfaceDefault();
        a.methodAbs();  //实现了抽象方法AAA
        a.methodAbs2(); //这是新添加的默认方法

        System.out.println("===============");
        MyInterfaceDefaultB B=new MyInterfaceDefaultB();
        B.methodAbs();
        B.methodAbs2();

    }
}
实现了抽象方法AAA
这是新添加的默认方法
===============
实现了抽象方法BBB
实现类B覆盖重写了接口的默认方法
接口的静态方法的使用
package cn.prot.demo03;
/*
从java8开始,接口当中允许定义静态方法
public static 返回值类型 方法名称(参数列表){
    方法体
}
提示:就是将abstract或者default换成static即可,带上方法体
* */
public interface MyinterfaceStatic {
    public static void methodStatic(){
        System.out.println("这是接口的静态方法!");
    }
}

package cn.prot.demo03;

public class MyinterfaceStaticImpl implements MyinterfaceStatic{

}

	package cn.prot.demo03;
/*
注意事项:不能通过接口实现类的对象来调用接口当中的静态方法
正确用法:通过接口名称,直接调用其中的静态方法
格式:
接口名称.静态方法名
 */
public class Demo03Interface {
    public static void main(String[] args) {
//        创建实现类对象
        MyinterfaceStaticImpl A=new MyinterfaceStaticImpl();

        //        错误写法
        //        A.methodStatic();

//        直接通过接口名称调用静态方法
        MyinterfaceStatic.methodStatic(); //这是接口的静态方法!


// 可以不用创建实现类对象直接通过接口名称调用静态方法

    }
}

接口的私有方法的使用
package cn.prot.demo04;

public interface MyInterfacePrivateA {


    public default void methodDefault1(){
        System.out.println("默认方法1");
        methodCommon();
    }
    public default void methodDefault2(){
        System.out.println("默认方法2");
        methodCommon();
    }

/*
问题描述:
需要抽取一个共有方法用来解决两个默认方法之间重复代码的问题
但是这个共有方法不应该让实现类使用。(私有化,不能单独使用)
* */
/*//    去掉重复代码,解决方案一
    public default void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
    }*/

/*
解决方案:
从java9开始,接口当中允许定义私有方法
1、普通私有方法,解决多个默认方法之间重复代码问题
格式:
private 返回值类型 方法名称(参数列表){
    方法体
}

2、静态私有方法,解决多个静态方法之间重复代码问题
private static 返回值类型 方法名称(参数列表){
    方法体
}
* */
    private void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
    }

//    静态方法
    public static void methodStatic1(){
        System.out.println("静态方法1");
        methodCommon1();
    }
    public static void methodStatic2(){
        System.out.println("静态方法2");
        methodCommon1();
    }

    private static void methodCommon1(){
        System.out.println("AAA");
        System.out.println("BBB");
    }
}

package cn.prot.demo04;

public class MyinterfacePrivateAlmpl implements MyInterfacePrivateA{
    public void methodAnother(){
        //直接访问到了接口中的默认方法,这样是不合法的应该只允许被接口中的默认方法调用,而不是被单独调用
//        methodCommon();
    }

}

package cn.prot.demo04;

public class Demo04Interface {
    public static void main(String[] args) {
//        访问接口私有的静态方法
        MyInterfacePrivateA.methodStatic1();
        MyInterfacePrivateA.methodStatic2();
    }
}

image.png

接口的常量定义和使用
package cn.prot.demo05;

/*
接口当中也可以定义“成员变量”,但是必须使用public static final三个关键字进行修饰。
从效果来看,这相当接口的【常量】
格式:
public static final 数据类型 常量名称=数据值
注意:
一旦使用final关键字进行修饰,说明不可改变。

注意事项:
接口中的常量,可以省略public static final,但是默认添加
接口中的常量,必须赋值
* */
public interface MyInterfaceConst {
    //这其实就是一个常量,一旦赋值,不可修改(不可变的量大写命名,用下划线分割单词)
    public static final int NUM=10;

}

package cn.prot.demo05;
//使用接口常量
public class Demo05Interface {
    public static void main(String[] args) {
        System.out.println(MyInterfaceConst.NUM);
        //输出10
    }
}

总结

在java9+版本中接口的内容可以有

1、成员变量其实是常量,格式:
[public] [static] [final] 数据类型 常量名称 =数据值;

注意:
常量必须进行赋值,而且一旦赋值不能改变
常量名称完全大写,多个单词用下划线进行分隔。

2、接口中最重要的就是抽象方法,格式:
[public] [abstract] 返回值类型 方法名称(参数列表);

注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类

3、从java8开始,接口里允许定义默认方法,格式:

用来解决接口新增问题,默认接口可以不用重写直接使用,当然也可以被覆盖重写

[public] default 返回值类型 方法名称(参数列表){方法体}

注意:默认方法也可以被覆盖重写

4、从java8开始,接口里允许定义静态方法,格式:
[public] static 返回值类型 方法名称(参数列表) {方法体}

注意:应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法

5、从java9开始,接口里允许定义私有方法,格式:
普通私有方法:private 返回值类型 方法名称(参数列表){方法体}
静态私有方法:private static 返回值类型 方法名称(参数列表){方法体}

注意:private的方法只有自己才能调用,不能被实现类或别人使用

继承父类并实现多个接口
package cn.prot.demo06;

public interface Demo06InterfaceA {

    //错误写法!接口不能有静态代码块
    /*    static {

    }*/
    //错误写法!接口不能有构造方法
  /*  public MyInterface(){

    }*/


    public abstract void methodA();
    public abstract void methodAbs();

    public default void methodDefault(){
        System.out.println("默认方法AAA");
    }


}

package cn.prot.demo06;

public interface Demo06InterfaceB {

   public abstract void methodB();
   public abstract void methodAbs();

   public default void methodDefault(){
      System.out.println("默认方法BBB");
   }
}

package cn.prot.demo06;


//使用接口的时候,需要注意
/*
 * 1、接口是没有静态代码块或者构造方法的。
 * 2、一个类的直接父类是唯一的,但是一个类可以同时实现多个接口
 *
 * 格式:
 * public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB{
 *   //覆盖重写所有的抽象方法
 * }
 *
 * */
public class MyInterfaceImpl implements Demo06InterfaceA,Demo06InterfaceB{
    @Override
    public void methodA() {
        System.out.println("覆盖重写了A");
    }



    @Override
    public void methodB() {
        System.out.println("覆盖重写了B");
    }

    /*
     * 3、如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
     * */
    @Override
    public void methodAbs() {
        System.out.println("覆盖重写了AB接口都有的抽象方法");
    }

    @Override
    public void methodDefault() {
        System.out.println("对多个接口当中冲突的默认方法进行覆盖重写");
    }
}

package cn.prot.demo06;
/*
 * 4、如果实现类没有覆盖重写所有接口当中所有抽象方法,那么实现类就必须是一个抽象类。
 * */
public abstract class  MyInterfaceAbstract implements Demo06InterfaceB,Demo06InterfaceA{
    @Override
    public void methodA() {

    }

    @Override
    public void methodAbs() {

    }

/*
* 5、如果实现类所实现的多个接口当中存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
* */
    @Override
    public void methodDefault() {
        System.out.println("对多个接口当中冲突的默认方法进行覆盖重写");
    }


}

父优先于接口

package cn.prot.demo06;

public interface MyInterface {
    public  default void method(){
        System.out.println("接口的默认方法");
    }
}

package cn.prot.demo06;

public class Fu {
    public void method(){
        System.out.println("父类方法");
    }
}

package cn.prot.demo06;

public class Zi extends Fu implements MyInterface{
    /*
     * 在java中继承是要优先于接口的
     * 6、一个类如果直接父类当中的方法和接口当中的默认方法产生了冲突,优先采用父类的方法
     *
     * */

}

接口之间的多继承
package cn.prot.demo07;

/*
* 1、类与类之间是单继承的,直接父类只能有一个
* 2、类与接口之间是多实现的,一个类可以实现多个接口。
* 3、接口与接口之间是多继承的。
*
* 注意事项
* 1、多个父接口中的抽象方法如果重复,没有关系(因为他们没有方法体)
* 2、多个父接口中的默认方法如果重复,就有关系,子接口必须进行默认方法覆盖重写,而且必须带有default关键字
* */
public class Demo07Relations {


}

package cn.prot.demo07;

public interface MyInterfaceA {
    public abstract void methodA();
    public abstract void methodCommon();

    public default void methodDefault(){
        System.out.println("AAA");
    }
}

package cn.prot.demo07;

public interface MyInterfaceB {
    public abstract void methodB();
    public abstract void methodCommon();

    public default void methodDefault(){
        System.out.println("AAA");
    }
}

1、多个父接口中的抽象方法如果重复,没有关系(因为他们没有方法体)

package cn.prot.demo07;
/*
* 可以看见覆盖重写了4个方法,其中methodCommon方法为AB共有,所以这里只算一个
* */
public class MyInterfaceImp implements MyInterface {
    @Override
    public void method() {

    }

    @Override
    public void methodA() {

    }

    @Override
    public void methodB() {

    }

    @Override
    public void methodCommon() {

    }
}

2、多个父接口中的默认方法如果重复,就有关系,子接口必须进行默认方法覆盖重写,而且必须带有default关键字

package cn.prot.demo07;

public interface MyInterface extends MyInterfaceA,MyInterfaceB{
    public abstract void method();


    @Override
    default void methodDefault() {
        MyInterfaceA.super.methodDefault();
    }
}

第三章 多态

image.png

多态使用方法
父子继承:

相当于子类会被当成父类运行

package cn.polymorphic.demo01;

public class FU {
    public void method(){
        System.out.println("父类方法");
    }
}

package cn.polymorphic.demo01;

public class Zi extends FU {
    @Override
    public void method() {
        System.out.println("子类方法");
    }
}

使用接口实现
package cn.polymorphic.demo01;

public interface test {
    public abstract void test();
}

package cn.polymorphic.demo01;

public class runTest implements test{
    @Override
    public void test() {
        System.out.println("用接口实现多态");
    }
}

package cn.polymorphic.demo01;
/*
* 代码当中体现多态性其实就是一句话:父类引用指向子类对象。
* 格式:
* 父类名称 对象名=new 子类名称();
* 或者:
* 接口名称 对象名=new 实现类名称();
* */
public class Demo01Multi {
    public static void main(String[] args) {
//        使用多态的写法
//        左侧父类的引用,指向了右侧子类的对象
        FU obj=new Zi();

        obj.method();  //会运行子类方法

//        使用接口实现多态
        test t=new runTest();
        t.test();       //用接口实现多态

    }
}

多态中成员变量的使用特点
package cn.polymorphic.demo02;

public class Fu {
    int num=10;

    public void showNum(){
        System.out.println(num);
    }
}

package cn.polymorphic.demo02;

public class Zi extends Fu{
    int num=20;

    @Override
    public void showNum() {
        System.out.println(num);  //子类覆盖重写
    }
}

package cn.polymorphic.demo02;

import cn.polymorphic.demo01.runTest;
import cn.polymorphic.demo01.test;

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




        Fu obj=new Zi();
//        直接通过对象名称访问成员变量,值取等号左边,没有再向上访问
        System.out.println(obj.num);  //输出10(父类的量)

//        间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有就向上找
        obj.showNum();  //输出20,虽然属于父类,但是在子类中覆盖重写了,就变成20了
    }
}

多态中成员方法的使用特点
package cn.polymorphic.demo03;

public class Fu {
    public void method(){
        System.out.println("父类方法");
    }
    public void methodFu(){
        System.out.println("父类特有方法");
    }
}

package cn.polymorphic.demo03;

public class Zi extends Fu{
    public void method(){
        System.out.println("子类方法");
    }
    public void methodZi(){
        System.out.println("子类特有方法");
    }
}

package cn.polymorphic.demo03;

/*
* 在多态代码中,成员方法的访问规则是:
*   看new的是谁,就优先用谁,没有就向上找
口诀:编译看左边,运行看右边。
*
成员变量:编译看左边,运行还看左边
成员方法:编译看左边,运行看右边。





*/


public class Demo03MultiMethod {
    public static void main(String[] args) {
        Fu obj=new Zi();
        obj.method();   //输出子类方法,因为子类有,所以直接输出子类
        obj.methodFu(); //输出父类特有方法,因为子类没有所以向上查找找到父类

        //错误写法,编译的时候优先看左边,左边父类没有methodZi这个方法
//        obj.methodZi();


    }

}

多态的好处

无论右边的定义换成什么,左边的调用方法都不变
image.png

多态对象向上转型

一般向上转型不会出现问题
image.png
父类定义抽象类

package cn.polymorphic.demo04;

public class Animal {
    public void eat(){

    }
}

子类覆盖重写

package cn.polymorphic.demo04;

public class cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

最后输出,编译看左边,父类存在该方法,

package cn.polymorphic.demo04;

public class demo04Main {
    public static void main(String[] args) {
//        对象的向上转型就是:父类引用指向之类对象
        Animal animal=new cat();
        animal.eat();
    }
}

多态对象的向下转移

image.png

//        向下转型,进行“还原”动作
        cat Cat=(cat) animal;   //将动物还原成猫
        Cat.catchMouse();  //调用猫自己的特有子类
多态使用关键字instanceof来判断父类引用本来
package cn.polymorphic.demo04;

/*

如何才能知道一个父类引用的对象本来是什么子类?

格式:
对象 instanceof 类名称
这将会得到一个boolean值结果,也就是判断前面的对象能不能当作后面类型的实列


* */
public class Demo04Instanceof {
    public static void main(String[] args) {
        Animal animal =new cat();
        animal.eat();

        //如果希望调用子类特有方法,需要向下转型
        //判断父类引用是不是cat
        if(animal instanceof cat){
            cat Cat=(cat) animal;
            Cat.catchMouse();
        }

    }
}

综合案例
package cn.polymorphic.demo05;

public interface USB {
    public abstract void open();    //打开设备
    public abstract void close();   //关闭设备

}

package cn.polymorphic.demo05;

public class Mouse implements USB{

    @Override
    public void open() {
        System.out.println("打开鼠标");
    }

    @Override
    public void close() {
        System.out.println("关闭鼠标");
    }

    public void click(){
        System.out.println("鼠标点击");
    }
}

package cn.polymorphic.demo05;

public class Keyboard implements USB{

    @Override
    public void open() {
        System.out.println("打开键盘");
    }

    @Override
    public void close() {
        System.out.println("关闭键盘");
    }

    public void types(){
        System.out.println("键盘输入");
    }
}

package cn.polymorphic.demo05;

public class Computer {
    public void powerOn(){
        System.out.println("电脑开机");
    }
    public void powerOff(){
        System.out.println("电脑关机");
    }

//使用usb设备的方法,使用接口作为方法的参数
    public void useDevice(USB usb){
        usb.open();

        if (usb instanceof Mouse){
            Mouse mouse=(Mouse) usb; //向下转型
            mouse.click();
        }else if (usb instanceof Keyboard){
            Keyboard keyboard=(Keyboard) usb;
            keyboard.types();
        }

        usb.close();
    }
}

package cn.polymorphic.demo05;

public class DemoMain {
    public static void main(String[] args) {
//        创建一个笔记本电脑
        Computer computer=new Computer();
        computer.powerOn();
//准备一个鼠标
//        Mouse mouse=new Mouse();
//        向上转型
        USB usbMouse=new Mouse();  //多态写法,左父右子
        computer.useDevice(usbMouse);


//        创建一个键盘
        Keyboard keyboard=new Keyboard();
        computer.useDevice(keyboard);

        computer.powerOff();
    }
}

第四章 final关键字

简介

package cn.Finals.demo01;

/*
final关键字代表最终,不可改变的
1、可以用来修饰一个类
2、可以用来修饰一个方法
3、可以用来修饰一个局部变量
4、可以用来修饰一个成员变量



*/
public class demo01 {

}

1、可以用来修饰一个类
package cn.Finals.demo01;

/*
当final关键字用来修饰一个类的时候,格式:
public final class 类名称{
  //...
}
含义:当前这个类不能有任何子类(太监类),但是允许有父类
* */

public final class MyClass {

}

2、可以用来修饰一个方法
package cn.Finals.demo01;

/*
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能覆盖重写。
格式:
修饰符 final 返回值类型 方法名称(参数列表){
    //方法体
}

注意事项:
对于类、方法来说,abstract 关键字和final关键字不能同时使用,因为矛盾
* */
public class Fu {
    public final void method(){
        System.out.println("父类方法执行");
    }
}

package cn.Finals.demo01;

public class Zi extends Fu{
    @Override
    public void method() {  //当fu添加final关键字后,zi 这边如果尝试覆盖就会报错
        System.out.println("子类覆盖重写");
    }
}

3、可以用来修饰一个局部变量
package cn.Finals.demo01;


/*
final一旦用来修饰局部变量,将使得该变量不可改变

* */
public class finalInt {
    public void method(){
        int num=10;
        final  int num1=20;
//        num1=30; //会报错,因为不可改变

    }

    public static void main(String[] args) {
//        对于基本类型来说,不可变的是变量当中的数据不可改变
//        对于引用类型来说,不可变说的是变量当中的地址值不可改变

        student student=new student("张三");
        System.out.println(student);
        System.out.println(student.getName());

        student=new student("李四");  //第二次new重新赋值会改变地址值
        System.out.println(student);
        System.out.println(student.getName());

        final student student1=new student("王五");
//        student1=new student("老毕登");    //会报错,不能更改地址值
        System.out.println(student1);
        student1.setName("老壁灯");        //但是你可以用方法进行值的更变,虽然更变值,但是地址没变,允许
        System.out.println(student1.getName());
    }
}

image.png

4、可以用来修饰一个成员变量
package cn.Finals.demo01;

/*
对于成员变量来说,如果使用final这个关键字修饰,那么这个变量也照样不可变
1、由于成员变量具有默认值,所以使用final之后必须手动赋值,不会再给默认值了
2、对于final成员变量,要么使用直接复制,要么通过构造方法赋值
3、必须保证类当中所有重载的构造方法,最终都会对final的成员变量进行赋值。
* */
public class Person {
    //这里加final会报错,因为这里默认会取默认值定为不可改变,不符合逻辑
    private /*final*/ String name;


//    private final String name1="zhang";  //方法2,直接赋值

    public Person() {
        name="zhang";   //方法二,构造方法赋值
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

第五章 权限修饰符

java中有四种权限修饰符
  public 》protected (保护的,专门给子类用的)》(default)不写 》private
同一个类
同一个包
不同包子类
不同包非子类
publicprotected(default)private
同一个类yesyesyesyes
同一个包yesyesyesNO
不同包子类yesyesNONO
不同包非子类yesNONONO
同一个类
//演示同一个类能访问


public class MyClass {

    //    int num =10;
    public void method(){
        System.out.println(num);
    }
}
同一个包
//    演示同一个包
    //    public int num=1; //ok
//     int num=1; //ok
     protected int num=1; //ok
//    private      int num=1; //NO


第二个类

package cn.demo02.authority.demo01;

public class MyClass01 {


    public void anotherMethod(){
        System.out.println(new MyClass().num);
    }
}

不同包子类
    //不同包子类
//    public int num =10;     //ok
//    protected int num =10;     //ok
//    int num =10;     //NO
    private int num =10;     //NO
package cn.demo02.authority.demo01.ZI;

import cn.demo02.authority.demo01.MyClass01;

public class Zi extends MyClass01 {
    public void method(){
        System.out.println(super.num);
    }
}

不同包非子类
    //不同包非子类
    public int num =10;     //ok
//    protected int num =10;     //NO
//    int num =10;     //NO
//    private int num =10;     //NO
package cn.demo02.authority.demo01.ZI;

import cn.demo02.authority.demo01.MyClass01;

public class zI1 {
    public void method(){
        System.out.println(new MyClass01().num);
    }
}

第六章 内部类

成员内部类定义
package cn.demo02.interior.demo01;
/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
 内部类单独列出不能正常使用

 分类:
 1、成员内部类
 2、局部内部类(包含匿名内部类)

成员内部类定义格式
修饰符 class 外部类名称{
    修饰符 class 内部类名称{
        //。。
    }
    //..
}

注意:内用外,随意访问;外用内,需要内部类对象

* */
public class Demo01InnerClass {
}

成员内部类的使用
package cn.demo02.interior.demo01;
/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
 内部类单独列出不能正常使用

 分类:
 1、成员内部类
 2、局部内部类(包含匿名内部类)

成员内部类定义格式
修饰符 class 外部类名称{
    修饰符 class 内部类名称{
        //。。
    }
    //..
}

注意:内用外,随意访问;外用内,需要内部类对象


=======================================
如何使用成员内部类?有两种方式:
1、间接方式:在外部类的方法当中,使用内部类:然后main知识调用外部类的方法
2、直接方式:
        公式: 类名称 对象名 =new 类名称();
        外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
* */
public class Demo01InnerClass {
    public static void main(String[] args) {
        Body body=new Body(); //外部类对象
        //1、通过外部类对象调用外部方法间接调用内部类
        body.methodBody();

        System.out.println("==================================");
        //2、直接方式
        Body.Heart heart=new Body().new Heart();
        heart.beat();
    }
}

package cn.demo02.interior.demo01;

public class Body {   //外部类

    public class Heart{  //成员内部类
//        内部类的方法
        public void beat(){
            System.out.println("运转");
            System.out.println("我叫"+name);
        }


    }
//    外部成员变量
    private String name;

//    外部类方法
    public void methodBody(){
        System.out.println("外部类的方法");
        new Heart().beat();  //匿名对象
    }

    public Body() {
    }

    public Body(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

内部类的同名变量访问
package cn.demo02.interior.demo01;

public class Outer {
    int num=10;   //外部类成员变量
    public class Inner{
        int num=20;   //内部类的成员变量


        public void methodInner(){
            int num=30;  //内部类方法的局部变量
            System.out.println(num); //局部变量,就近原则
            System.out.println(this.num); //内部类的成员变量
            System.out.println(Outer.this.num); //外部类的成员变量

        }
    }
}

package cn.demo02.interior.demo01;

public class Demo01innerClass02 {
    public static void main(String[] args) {
        Outer.Inner obj=new Outer().new Inner();
        obj.methodInner();
    }
}

image.png

局部内部类定义
package cn.demo02.interior.demo02;

/*
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类
“局部”:只有当期那所属的方法才能使用它,出了这个方法外面就不能用了

定义格式:
修饰符 class 外部类名称{
    修饰符 返回值名称 外部类方法名称(参数列表){
        class 局部内部类名称{
            // ...
        }
    }
}
*/
public class Outer {

    public void methodOuter(){
        class Inner{    //局部内部类
            int num =10;
            public void methodInner(){
                System.out.println(num);
            }
        }
//        只能自己使用,如果需要调用,需要在方法内部进行调用
        Inner inner=new Inner();
        inner.methodInner();
    }
}

package cn.demo02.interior.demo02;

public class demoMain {
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.methodOuter();
    }
}

局部内部类的final问题
package cn.demo02.interior.demo02;

//局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】也就是不能改变的

/*
原因:
1.new出来的对象在堆内存当中
2.局部变量是跟踪方法走的,在栈内存当中,方法运行完毕后,立刻出栈,局部变量会消失
3.但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。
* */
//也就是说堆没了,但是对象会收录堆中传递的局部变量,进行记载,直到垃圾回收

public class MyOuter {
    public void methodOuter(){
        int num=10; //所在方法的局部变量

        class MyInner{
            public void methodInner(){
                System.out.println(num);
            }
        }
    }
}

匿名内部类

定义接口

package cn.demo02.interior.demo03;

public interface MyInterface {
    public void method();
}

覆盖重写

package cn.demo02.interior.demo03;

public class MyInterfaceImpl implements MyInterface{
    @Override
    public void method() {
        System.out.println("传统方法覆盖重写接口");
    }
}

匿名内部类定义

package cn.demo02.interior.demo03;

/*
如果接口的实现类(或者父类的子类)只需要使用唯一一次,那么这种情况下可以省略该类的定义
也就是说可以省略创建重写文件,而改为使用【匿名内部类】

匿名内部类的定义格式:
接口名称 对象名 =new 接口名称(){
   //覆盖重写所有抽象方法

};

* */




public class DemoMain {
    public static void main(String[] args) {
//        传统方法覆盖重写接口
        MyInterfaceImpl objs=new MyInterfaceImpl();
        objs.method();



//        定义匿名内部类
        MyInterface obj=new MyInterface() {
            @Override
            public void method() {
                System.out.println("匿名内部类实现了方法!");
            }
        };
        obj.method();
    }
}

运行结果
image.png

类作为成员变量类型

成员变量不仅仅可以使用基本类型,还能使用类

package cn.demo02.interior.demo04;

public class Hero {

    private String name; //名字
    private int age;     //年龄
    private Weapon weapon;  //英雄武器

    public Hero() {
    }

    public Hero(String name, int age, Weapon weapon) {
        this.name = name;
        this.age = age;
        this.weapon = weapon;
    }

    public void attack(){
        System.out.println("名字:"+name+",年龄:"+age+",武器:"+weapon.getCode());
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Weapon getWeapon() {
        return weapon;
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }
}

package cn.demo02.interior.demo04;

public class Weapon {
    private String code;  //武器代号

    public Weapon() {
    }

    public Weapon(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

package cn.demo02.interior.demo04;

public class demoMain {
    public static void main(String[] args) {
        //创建一个英雄
        Hero hero=new Hero();
        hero.setName("赵云");
        hero.setAge(18);

        //创建一个武器对象
        Weapon weapon=new Weapon("破军");

        //配备武器
        hero.setWeapon(weapon);

        hero.attack();


    }
}

image.png

接口作为成员变量类型

定义名称、类型

package cn.demo02.interior.demo05;

public class Hero {
    private String name;
    private Skill skill;

    public Hero() {
    }

    public Hero(String name, Skill skill) {
        this.name = name;
        this.skill = skill;
    }

    public void attack(){
        System.out.println("名字:"+name);
        skill.use();
        System.out.println("技能释放完成!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Skill getSkill() {
        return skill;
    }

    public void setSkill(Skill skill) {
        this.skill = skill;
    }
}

创建一个接口,创建一个类

package cn.demo02.interior.demo05;

public interface Skill {
    void use();
}

覆盖重写

package cn.demo02.interior.demo05;

public class Skillmpl implements Skill{
    @Override
    public void use() {
        System.out.println("实现技能释放!");
    }
}

运行

package cn.demo02.interior.demo05;

public class DemoGame {
    public static void main(String[] args) {
        Hero hero=new Hero();
        hero.setName("赵云");

        //设置技能
//        方法一(老方法)
//        hero.setSkill(new Skillmpl());


//        方法二(使用匿名类)
/*        Skill skill=new Skill() {
            @Override
            public void use() {
                System.out.println("实现匿名类的技能释放!");
            }
        };
        hero.setSkill(skill);*/

//        方法三
        hero.setSkill(new Skill() {
            @Override
            public void use() {
                System.out.println("实现匿名类的技能释放2!");
            }
        });
        hero.attack();

    }
}

运行结果
image.png

package cn.demo02.interior.demo05;

import java.util.ArrayList;
import java.util.List;

public class DemoInterface {
    public static void main(String[] args) {
        List<String> list =new ArrayList<>();

        List<String> result= addNames(list);
        for (int i = 0; i <result.size() ; i++) {
            System.out.println(result.get(i));
        }
    }

    public static List<String> addNames(List<String>list){
        list.add("test1");
        list.add("test2");
        list.add("test3");
        list.add("test4");
        return list;
    }
}

image.png

常用API第二部分

第一章 Object类

toString方法

概述:
public String toString():返回该对象的字符串表示。
toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如自定义的Person类:

package cn.demo03.ObjectS.demo01;

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

    public Objects() {
    }

    public Objects(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) {
        this.age = age;
    }

/*
    @Override
    public String toString(){
        return "1Person{"+"name='"+name+'\''+",age="+age+'}';
    }
*/



}

package cn.demo03.ObjectS.demo01;

public class Omian {
    public static void main(String[] args) {
        Objects objects=new Objects();
        objects.setAge(18);
        objects.setName("张三");
        System.out.println(objects);
       
    }
}

重写前
image.png
重写后
image.png
能看到可读性有所提升

equals方法

默认比较对象的地址值image.png

基本使用

package cn.demo03.ObjectS.demo01;

public class equalsMain {
    public static void main(String[] args) {
        Objects P1=new Objects("张三",18);
        Objects P2=new Objects("李四",18);
        System.out.println("p1:"+P1);  //p1:cn.demo03.ObjectS.demo01.Objects@2cb4c3ab
        System.out.println("p2:"+P2);   //p2:cn.demo03.ObjectS.demo01.Objects@13c78c0b

        boolean set =P1.equals(P2);
        System.out.println(set);        //false
    }
}

image.png

使用覆盖重写把他们变成比较内容

    @Override
    public boolean equals(Object o) {
       //使用向下转型,把obj转换成Person类型
        Objects p =(Objects)o;
        //比较两个对象的属性,一个对象是this(p1),一个对象是p(obj-》p2)
        return this.name.equals(p.name) && this.age==p.age;
    }

使用效果:
当内容name和age都一样的时候,即使内存地址不一样,也会返回true
image.png

防止空指针异常

package cn.demo03.ObjectS.demo01;

public class equalsMain {
    public static void main(String[] args) {
        Objects P1=new Objects("张三",18);
        Objects P2=new Objects("张三",18);
        System.out.println("p1:"+P1);  //p1:cn.demo03.ObjectS.demo01.Objects@2cb4c3ab
        System.out.println("p2:"+P2);   //p2:cn.demo03.ObjectS.demo01.Objects@13c78c0b

        boolean set =P1.equals(P2);
        System.out.println(set);        //false

        boolean set1= java.util.Objects.equals(P1,P2);      //防止空指针异常
        System.out.println(set1);
    }
}

当P1或者P2赋值为空的时候,使用objects.equals(P1,P2)方法来避免空指针异常报错
image.png

第二章 日期时间类

Date类
package cn.demo03.DATAS.demo01;

import java.util.Date;
//表示日期和时间的类,精确到毫秒,也就是千分之一秒


public class time {
    public static void main(String[] args) {
        demo04();

    }

    public static void demo01(){
        System.out.println(System.currentTimeMillis());
//        获取当前系统时间到1970年1月1日 00:00:00 经历了多少毫秒

//        把毫秒转化为日期
//        1天=24*60*60=86400秒,中国属于东八区,需要增加8个小时
    }

    public static void demo02(){
        Date date=new Date();
        System.out.println(date);       //Sun Oct 29 14:39:15 CST 2023 星期日 10月 cst中国的标准时间

    }
    //构造方法,date传参,输出毫秒对应的时间,这里输出0毫秒也就是初始时间
    public static void demo03(){
        Date date=new Date(0L);
        System.out.println(date);   //Thu Jan 01 08:00:00 CST 1970
    }

    //把日期转化成毫秒
    public static void demo04(){
        Date date=new Date();
        long time=date.getTime();
        System.out.println(time);
        //1698562118876
    }
}

DateFormat方法

image.pngimage.png
image.png

使用alt+回车来让编译器忽略错误,交给虚拟机处理
image.png
image.png

package cn.demo03.DATAS.demo01;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DataForm {
    public static void main(String[] args) throws ParseException {
        dome01();
        dome02();
    }
    //把字符串还原成date日期
    public static void dome02() throws ParseException {
        SimpleDateFormat time1=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 中国");
        Date date=time1.parse("2023年10月29日 15时53分27秒 中国");
        System.out.println(date);

    }

    //使用dateformat类中的方法把日期转化为文本
    public static void dome01(){
        //设置指定模式
        SimpleDateFormat time1=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 中国");
        //把date数据转化成指定的格式输出
        Date date=new Date();
        String d=time1.format(date);
        System.out.println(date);
        System.out.println(d);
    }
}

image.png

第三章 日历类

Calendar类:

image.png

package cn.demo03.Calend.demo01;

import java.util.Calendar;

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

产出

java.util.GregorianCalendar[time=1698567177129,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=9,WEEK_OF_YEAR=44,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=302,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=12,SECOND=57,MILLISECOND=129,ZONE_OFFSET=28800000,DST_OFFSET=0]

进程已结束,退出代码0

image.png

通过日历读取和设置年月日

package cn.demo03.Calend.demo01;

import java.util.Calendar;
import java.util.Date;

public class Calender01 {
    public static void main(String[] args) {
        domo02();

    }




    //日历:通过.get(指定参数),获取指定的参数值
    private static void domo02() {

        Calendar calendar=Calendar.getInstance();
        //设置年,月,日
        calendar.set(calendar.YEAR,2044);
        calendar.set(calendar.MONTH,10);
        calendar.set(calendar.DATE,30);


        //获取年月日
        int year=calendar.get(calendar.YEAR);
        System.out.println(year);
        int mouth=calendar.get(calendar.MONTH);
        System.out.println(mouth);
        int date =calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(date);


    }

    //输出全部日历内容
    public static void domo01(){
        Calendar calendar=Calendar.getInstance();
        System.out.println(calendar);
    }
}

image.png

package cn.demo03.Calend.demo01;

import java.util.Calendar;
import java.util.Date;

public class Calender01 {
    public static void main(String[] args) {
//        domo03();
//        domo04();
        domo05();
    }
    //把日历对象转换成日期对象
    private static void domo05() {
        Calendar calendar=domo01();
        Date date=calendar.getTime();
        System.out.println(date);
    }

    //对日历进行增加与减少操作
    private static void domo04() {
        Calendar calendar=domo01();
        //增加2年
        calendar.add(Calendar.YEAR,2);
        //减少两月
        calendar.add(Calendar.MONTH,-2);

        domo03(calendar);
    }

    //输出时间日期
    private static void domo03(Calendar calendar) {

        //获取年月日
        int year=calendar.get(calendar.YEAR);
        System.out.println(year);
        int mouth=calendar.get(calendar.MONTH);
        System.out.println(mouth);
        int date =calendar.get(calendar.DAY_OF_MONTH);
        System.out.println(date);

    }


    //日历:通过.get(指定参数),获取指定的参数值
    private static void domo02(Calendar calendar) {
        //设置年,月,日
        calendar.set(calendar.YEAR,2044);//单独设置
        calendar.set(calendar.MONTH,10);
        calendar.set(calendar.DATE,30);
        calendar.set(2048,11,11);//通过重载方法进行批量设置
    }

    //输出全部日历内容
    public static Calendar  domo01(){
        Calendar calendar=Calendar.getInstance();
//        System.out.println(calendar);
        return calendar;
    }
}

第四章 system类

image.png

currentTimeMillis来打印程序的执行时间
package cn.demo03.systems.dome01;

public class systemctl01 {
    public static void main(String[] args) {
        dome01();
    }

     //使用currentTimeMillis来打印程序的执行时间
    public static void dome01(){
        long s=System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
        System.out.println("程序共耗时"+":"+(System.currentTimeMillis()-s)+"毫秒" );
    }
}

image.png

arraycopy方法,将数组中的数据拷贝到另一个数组中去

image.png

 private static void dome02() {
        int [] src={1,2,3,4,5};
        int [] los={6,7,8,9,10};
        System.out.println("拷贝前"+ Arrays.toString(los));
        System.arraycopy(src,0,los,0,3);
        //复制src的数组从下标0开始到数组los下标0开始3个元素
        System.out.println("拷贝后"+ Arrays.toString(los));

    }

image.png

第五章 StringBuilder类

也叫字符串缓冲区

字符拼接问题

image.png

package cn.demo03.StringBuilders.demo01;

public class demo1 {
    public static void main(String[] args) {
        dome01();
    }

    public static void dome01(){
    //空参数的构造方法
        StringBuilder stringBuilder=new StringBuilder();
        System.out.println("to1:"+stringBuilder.length());
    //带参数的构造方法
        StringBuilder stringBuilder1=new StringBuilder("abcdefg");
        System.out.println("to2:"+stringBuilder1);

    //使用append添加字符(链式编程)
        stringBuilder.append("adsahdujsdaf").append("true").append("你好");
        System.out.println("to3:"+stringBuilder);
    }
}

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入了解汉字转拼音转换工具:原理与应用

一、引言 汉字作为世界上最古老、最具象形意的文字之一&#xff0c;承载了数千年的历史文明。然而&#xff0c;在现代信息技术环境下&#xff0c;汉字的输入、输出和检索等方面存在一定的局限性。拼音作为汉字的一种音标表达方式&#xff0c;能够有效地解决这些问题。本文将为…

JS利用时间戳倒计时案例

我们在逛某宝&#xff0c;或者逛某东时&#xff0c;我们时常看到一个倒计时&#xff0c;时间一到就开抢&#xff0c;这个倒计时是如何做的呢&#xff1f;让我为大家介绍一下。 理性分析一下&#xff1a; 1.用将来时间减去现在时间就是剩余的时间 2.核心&#xff1a;使用将来的时…

完全背包问题 非零基础

目录 之前学过一遍&#xff0c;但是12月2日再练忘光光了&#xff1a; 忘记点1 —— 为什么每个物品要遍历k件&#xff1a; 忘记点2 —— 数学优化&#xff1a; 之前学过一遍&#xff0c;但是12月2日再练忘光光了&#xff1a; 【模板】完全背包_牛客题霸_牛客网 (nowcoder.c…

智慧公厕新风系统是什么?具体作用?

大家好&#xff0c;你们可曾在公厕里遇到那个臭味怪兽&#xff0c;闻得让人头晕目眩&#xff1f;别怕&#xff0c;我们有一把利剑&#xff0c;叫做“智慧公厕新风系统”&#xff01;不仅是空气净化器的升级版&#xff0c;还有一大堆高级功能等着你来领略&#xff01; 1. 风清气…

Linux常用命令——awk命令

在线Linux命令查询工具 awk 文本和数据进行处理的编程语言 补充说明 awk是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件&#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能…

1+x网络系统建设与运维(中级)-练习3

一.设备命名 AR1 [Huawei]sysn AR1 [AR1] 同理可得&#xff0c;所有设备的命名如上图所示 二.VLAN LSW1 [LSW1]vlan 10 [LSW1-vlan10]q [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type access [LSW1-GigabitEthernet0/0/1]port default vlan 10 [LSW1-GigabitEt…

SQL数据库知识点总结

前后顺序可以任意颠倒&#xff0c;不影响库中的数据关系 关系数据库的逻辑性强而物理性弱&#xff0c;因此关系数据库中的各条记录前后顺序可以任意颠倒&#xff0c;不影响库中的数据关系 一名员工可以使用多台计算机&#xff08;1&#xff1a;m&#xff09;&#xff0c;而一…

Knowledge Review(CVPR 2021)论文解析

paper&#xff1a;Distilling Knowledge via Knowledge Review official implementation&#xff1a;https://github.com/dvlab-research/ReviewKD 前言 识蒸馏将知识从教师网络转移到学生网络&#xff0c;可以提高学生网络的性能&#xff0c;作为一种“模型压缩”的方法被…

数据结构树,二叉树,堆

目录 ​编辑 1.树概念及结构 2. 树的表示 3.二叉树概念及结构 特殊的二叉树 二叉树的性质 ​编辑 二叉树选择题 二叉树的存储结构 4.堆的概念及结构 父亲孩子下标关系​编辑 堆的实现接口 堆结构体设计堆的初始化堆的销毁 堆的插入(附&#xff1a;向上调整算法) 堆…

[多线程]线程安全问题再讨论 - volatile

目录 1.引言 2.volatil关键字 2.1内存可见性 2.2指令重排序 1.引言 大家好,我是老cu,今天我们来继续聊聊线程安全问题 线程安全是我们在编程开发中遇到的非常常见,棘手 的问题.同时也是多线程部分很复杂的问题.为了线程安全我们要做很多努力.也要对线程安全部分的代码进行慎…

计算机网络的分类

目录 一、按照传输介质进行分类 1、有线网络 2、无线网络 二、按照使用者进行分类 1、公用网 (public network) 2、专用网(private network) 三、按照网络规模和作用范围进行分类 1、PAN 个人局域网 2、LAN 局域网 3、MAN 城域网 4、 WAN 广域网 5、Internet 因特…

【算法】直接插入排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.直接插入排序的方式和打牌一样&#xff0c;刚开始数组为空 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较&#xff0c;然后插入合适的位置 3.到最后&#xff0c;数组按照既定的顺序排序好 2. 举…

代码随想录算法训练营第五十三天【动态规划part14】 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义&#xff1a; dp[i][j]&#xff1a;长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序…

Tensorflow的日志log记录

if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)自动创建文件夹log

GEE:Sobel算子卷积和Roberts算子卷积对比

作者:CSDN @ _养乐多_ 本文介绍了Sobel算子卷积和Roberts算子卷积操作的代码,并进行了图像对比,可以观察到两个算子的细微差异。 文章目录 一、Sobel算子和Roberts算子对比二、完整代码三、代码链接一、Sobel算子和Roberts算子对比 详细介绍介绍参考《遥感数字图像处理教程…

基于搜索协议实现工业设备升级

目录 1、背景引入 2、技术分析 3、过程概述 4、服务器端流程 5、客户端流程 6、效果展示 7、源码 7.1 master&#xff08;主控&#xff09; 7.2 device&#xff08;设备&#xff09; 8、注意事项 1、背景引入 在工业生产中&#xff0c;设备的升级和维护是非常重要的…

Gossip 协议

Gossip 协议 背景 在分布式系统中&#xff0c;不同的节点进行数据/信息共享是一个基本的需求。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时共享最新信息给其他所有节点&#xff0c;比较适合中心化系统。这种方法的缺陷也很明显&…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

理解宏任务和微任务:JavaScript 异步编程的必备知识(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

借助SD地图的BEV静态感知

动机与出发点 纯视觉、视觉Lidar的感知系统在复杂城市道路场景下并不能如预期那般表现稳定&#xff0c;其中遮挡就是一个巨大挑战。现在的BEV静态感知方案多采用多趟重建的方式获取&#xff0c;这就导致无论前方是否有车辆、建筑物、绿化带等&#xff0c;只要能投影到BEV空间的…