JAVASE

JAVASE_01:JAVA基础语法

JAVA基础01:注释

  • Java中三种注释(书写注释是一种好的习惯)

  • 单行注释 (//)

  • 多行注释 (/* 文字 */)

  • 文档注释

public class HelloWord {
    public static void main(String[] args) {
        //输出一个Hello,Word!
        System.out.println("Hello,Word");

        //多行注释:可以注释多行文字  /* 注释*/
        /*
        我是多行注释
        我是多行注释
        我是多行注释
        */
        //JavaDoc:文档注释    /**   */
        /**
         * @Description HelloWorld
         * @Author 狂神说Java.
         */
    }

}

JAVA基础02:标识符

  • Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符

  • 关键字

abstract  assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return strictfp short static super switch synchronized this throw throws transient try void volatile while
  • 注意点:所有标识符都应该以字母(A-Z或者a-z),美元符($),或者下划线(_)开始
  • 首字符后可以是字母(A-Z或者a-z),美元符($),或者下划线(_)或数字任意字符组合
  • 不能使用关键字作为变量名或方法名
  • 标识符大小写敏感
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例:123abc、-salary、#abc
 public class Demo01_标识符 {
    public static void main(String[] args) {
        String Ahello="qinjiang";
        String hello="qinjiang";
        String $hello="qinjiang";
        String _hello="qinjiang";
        String 王者荣耀="永恒钻石";
        System.out.println(王者荣耀);
    }

}

JAVA基础03:数据类型

  • 强类型语言

    • 要求变量的使用严格符合规定,所有变量都必须先定义后才能使用
  • 弱类型语言

  • Java数据类型分为两类

public class Demo02_数据类型 {
    public static void main(String[] args) {
        //八大基本类型
        //整数
        int num1=10;
        byte num2=20;
        short num3=30;
        long num4=40L;

        //小数:浮点数
        float num5=50.1F;
        double num6=3.1415926435648;

        //字符
        char name='A';
        //字符串,String不是关键字,类
        //String name1="哈哈";

        //布尔值:是非
        boolean flag=true;
        //boolean flag=false;

        System.out.println(num1);
        System.out.println(num2);

        //整数拓展:   进制  二进制0b 十进制 八进制0 十六进制
        int i=10;//
        int i2=010;//八进制
        int i3=0x10;//十六进制
        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println("============================");
        //============================================
        //浮点数拓展?  银行业务怎么表示? 钱
        //============================================
        //float    有限 离散 舍入误差 大约 接近但不等于
        //double、
        //最好完全使用浮点数比较
        //最好完全使用浮点数比较
        //最好完全使用浮点数比较
        float f=0.1f;//0.1
        double d=1.0/10;//0.1
        System.out.println(f==d);//false

        float d1=23334224f;
        float d2=d1+1;
        System.out.println(d1==d2);//true

        //============================================
        //字符拓展?
        //============================================
        System.out.println("============================");
        char c1='a';
        char c2='中';
        System.out.println(c1);
        System.out.println((int)c1);//强制转换 97
        System.out.println(c2);
        System.out.println((int)c2);//强制转换 20013

        //所有字符本质还是数字
        //编码 Unicode 表 :  97=a  65=A
        //U0000 UFFF

        char c3='\u0061';  //a
        System.out.println(c3);//a
        //转义字符
        // \t  制表符
        // \n  换行
        System.out.println("Hello\nWord");

        System.out.println("============================");
        //对象 内存分析
        String sa=new String("hello word");
        String sb=new String("hello word");
        System.out.println(sa==sb);//false

        String sc="hello word";
        String sd="hello word";
        System.out.println(sc==sd);//true

        //布尔值拓展
        boolean flag1=true;
        if(flag1==true){} //新手
        if (flag1){}     //老手
        //Less is More! 代码要精简已读
    }
}

    • 基本类型(8种)

      • 整数类型:

        byte占1个字节范围:-128~127

        short占2个字节范围:-32768~32767

        int占4个字节范围:-2147483684~2147483647

        long占8个字节范围:-9223372036854775808~9223372036854775807

      • 浮点类型:

        float占4个字节

        double占8个字节

      • 字符类型:char占2个字节

      • boolean类型:占1位其值只有true和false两个

    • 引用类型(3种)

      • 接口

      • 数组

JAVA基础04:类型转换

由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换。

低------------------------------------------------->高

  • byte,short,char->int->long->float->double

运算中,不同类型的数据先转化为同一类型,然后进行运算。

强制类型转换

自动类型转换

public class Demo03_类型转换 {
    public static void main(String[] args) {
        int i=128;
        byte b=(byte) i;

        double d=i;
        //强制转换 (类型)变量名;高->低
        //自动转换   低->高
        System.out.println(i); //128
        System.out.println(b); //内存溢出 -128
        System.out.println(d); //128.0

        /*注意点
        1.不能对布尔值进行转换
        2.不能把对象类型转换为不相干的类型
        3.再把高容量转低容量时,强制转换
        4.转换的时候可能存在内存溢出,或精度问题
         */
        System.out.println("========================");
        System.out.println((int)23.7); //23
        System.out.println((int)-47.89f);//-47

        System.out.println("========================");
        char c='a';
        int i1=c+1;
        System.out.println(i1);//98
        System.out.println((char)i1);//b
    }

}

public class Demo04_内存溢出 {
    public static void main(String[] args) {
        //操作比较大的数的时候,注意溢出问题
        //JDK7新特性,数字之间可以用下划线分割
        int money=10_0000_0000;
        System.out.println(money);//1000000000
        int year=20;
        int total=money*year; //-1474836480
        int total2=money*year; //-1474836480
        long total3=money*((long)year);//20000000000
        System.out.println(total);//-1474836480,计算内存溢出
        System.out.println(total2);//默认是int,转换前已经出现问题了?
        System.out.println(total3);//先把一个数转换为long

        //L l
    }
}

JAVA基础05:变量 常量 作用域

变量

  • 变量是什么?:就是可以变化的量!
  • Java语言是一种强类型语言,每个变量都必须声明其类型。
  • Java变量是程序的最基本单位,其要素包括变量名,变量类型和作用域。
type varName [=value] [{,varName[=value]}];
//数据类型  变量名 = 值; 可以使用逗号隔开来声明多个同类型变量。

public class Demo05_变量 {
    public static void main(String[] args) {
        //int a ,b, c;
        //int a=1,b=2,c=3; //程序可读性
        String name="鲁班七号";
        char c='s';
        double d=3.14;
    }
}
  • 注意事项:
    • 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
    • 变量名必须是合法的标识符。
    • 变量声明是一条完整的语句,每一个声明都必须以分号结束

变量作用域

  • 类变量
  • 实例变量
  • 局部变量
public class Demo06_变量作用域 {

    //类变量 static
    static double salary=2500;

    //属性:变量

    //实例变量:从属于对象;如果不初始化,这个类型的默认值为0 0.0
    //布尔值:默认值false
    String name;
    int age;

    //main方法
    public static void main(String[] args) {
        //局部变量:必须声明和初始化值
        int i =10;
        System.out.println(i);

        //变量类型 变量名=new Demo06_变量作用域();
        Demo06_变量作用域 demo06=new Demo06_变量作用域();
        System.out.println(demo06.age);//0
        System.out.println(demo06.name);//null

        //类变量 static
        System.out.println(salary);//2500.0
    }

}

常量

  • 常量:初始化后不能再改变值。
  • 所谓常量可以理解为一种特殊的变量,它的值设定后,在程序运行过程中不允许改变。
public class Demo07_常量 {

    //final ,static为修饰符,不存在先后顺序
    final static double PI=3.14;
    public static void main(String[] args) {
        System.out.println(PI);//3.14
    }
}


  • 常量名一般使用大写字符。

变量的命名规范

  • 所有变量、方法、类名:见名知意
  • 类成员变量:首字母小写和驼峰原则:monthSalary
  • 局部变量:所字母小写和驼峰原则
  • 常量:大写字母和下划线:MAX_VALUE
  • 类名:首字母大写和驼峰原则:Man,GoodMan
  • 方法名:首字母小写和驼峰原则:run(),runRun()

JAVA基础06:基本运算符

运算符

Java语言支持如下运算符:

  • 算数运算符:+ ,-, *, /, %, ++, –
  • 赋值运算符:=
  • 关系运算符:>,<,>=,<=,==,!=instanceof
  • 逻辑运算符:&&,||,!
  • 位运算:&,|,^,~,>>,<<,>>>(了解!!!)
  • 条件运算符:?:
  • 扩展赋值运算符:+=,-=,*=,/=
package javaBase;

public class Demo08_基本运算符 {
    public static void main(String[] args) {
        //二元运算
        //Ctrl+D :赋值当前行到下一行
        int a=10;
        int b=20;
        int c=30;
        int d=40;
        System.out.println("===========");
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println(a/(double)b);
        System.out.println("===========");
        long l=313144141l;
        int i=123;
        short s=10;
        byte b1=8;
        System.out.println(l+i+b1+s);//Long
        System.out.println(i+b1+s);//Int
        System.out.println(l+i+b1+s);//Int
        System.out.println("===========");
        //关系运算符返回的结果:true false 布尔值
        //if
        int i1=10;
        int i2=20;
        int i3=73;

        //取余 ,模运算
        System.out.println(i3%i1);//73/10   =3

        System.out.println(i1>i2);
        System.out.println(i1<i2);
        System.out.println(i1==i2);
        System.out.println(i1!=i2);

        //++ -- 自增 自减  一元运算符
        int j=10;
        int k=j++;//执行完这行代码后,先给k赋值,再自增
        //j=j+1
        System.out.println(j);//11
        //j=j+1
        int p=++j;//执行完这行代码前,先自增,再给p赋值
        System.out.println(j);//12
        System.out.println(k);//10
        System.out.println(p);//12

        //幂运算2^3  2^2^2 =8 很多运算,我们会使用工具类来操作!
        double pow=Math.pow(2,3);
        System.out.println(pow);//8.0
    }

}


package javaBase;

public class Demo09_逻辑运算符位运算符 {
    public static void main(String[] args) {
        //与(and) 或(or) 非(取反)
        boolean a=true;
        boolean b=false;
        System.out.println("a&&b:"+(a&&b));//逻辑与运算:两个变量都为真,则真
        System.out.println("a||b:"+(a||b));//逻辑与运算:两个变量一个为假,则假
        System.out.println("!a&&b:"+!(a&&b));//如果为真,则变为假,如果为假,则变为真

        //短路运算
        int c=100;
        boolean d=(c<90)&&(c++<90);
        System.out.println(d);//false
        System.out.println(c);//100

        //位运算
        /*
        A=0011 1100
        B=0000 1101
        -----------------
        A&B=0000 1100
        A|B=0011 1101
        A^B=0011 0001
        ~B= 1111 0010

        2*8=16  2*2*2*2
        效率最高!!!
        <<  *2
        >>  /2

        0000 0000   0
        0000 0001   1
        0000 0010   2
        0000 0011   3
        0000 0100   4
        0000 1000   8
        0001 0000   16
         */
        System.out.println(2<<3);//2*2*2*2=16

        int a1=10;
        int b1=20;

        a1+=b1;//a1=a1+b1
        a1-=b1;//a1=a1-b1
        System.out.println(a1);

        //字符串连接符 +
        System.out.println(a1+b1);//30
        System.out.println(""+a1+b1);//1020
        System.out.println(a1+b1+"");//30
    }
}


package javaBase;
//三元运算符
public class Demo10_三元运算符 {
    public static void main(String[] args) {
        //x?y:z
        //如果x==true,则结果为y,否则结果为z

        int score =100;
        String type=score>=90?"优秀":"垃圾";
        //if
        System.out.println(type);
    }
}


JAVA基础07:包机制

包机制

  • 为了更好的组织类,Java提供了包机制,用于区别类的命名空间。
  • 包机制的语法格式为:
package pkg1[.pkg2[.pk3...]];

  • 一般利用公司域名倒置作为包名:www.baidu.com , com.baidu.www
  • 为乐能够使用某一个包的成员,我们需要在java程序中明确导入该包。使用”import“完成导入
import package1.[package2...].(classname|*);

package com.company.javaBase;

import java.util.Date;
import com.company.javaBase.Demo10_三元运算符;
//导入包下所有的类
import com.company.javaBase.*;
public class Demo11_包机制 {
    public static void main(String[] args) {
        int a=10;
        int b=20;
        System.out.println(a+b);

        Date date=new Date();
    }
}

JAVA基础08:JavaDoc生成文档

  • javadoc命令是用来生成自己的API文档的
  • 参数信息
    • @auther作者名
    • @version版本号
    • @since指明需要最早使用的jdk版本
    • @param参数名
    • @return返回值情况
    • @throws异常抛出情况

JAVA -JDK 1.8 API 帮助文档-中文版

  • 链接:https://pan.baidu.com/s/1cZJIoXkTAxYtnc2EA08p8g

  • 提取码:22jh

  • 使用命令行生成文档

    • 1.选择文件所在目录 cmd
    • 2.执行命令 javadoc -encoding UTF-8 -charset UTF-8 Demo12_JavaDoc.java
package com.company.javaBase;

/**
 * @author liruyi
 * @version 1.0
 * @since jdk1.8
 */
public class Demo12_JavaDoc {

    String name;

    /**
     * @auther kuangshen
     * @param name
     * @return
     * @throws Exception
     */
    public String getName(String name) throws Exception{
        return name;
    }

    //1.使用命令行生成JavaDoc文档
    //eg: javadoc 参数 Java文件,   javadoc  -encoding UTF-8 -charset UTF-8 Demo12_JavaDoc.java
    //2.学会查找使用Idea生成JavaDoc文档! 面向百度编程!
}

JAVASE_02:JAVA流程控制

JAVA流程控制01:用户交互Scanner

  • 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。
  • 基本语法:
Scanner s= new Scanner(System.in);
  • 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
package com.company.scanner;

import java.util.Scanner;

public class Demo01_用户交互Scanner {
    public static void main(String[] args) {
        //创建一个扫描器对象,用来接收键盘数据
        Scanner scanner=new Scanner(System.in);
        System.out.println("使用next方式接收:");

        //判断用户有没有输入字符串
        if(scanner.hasNext()){
            //使用next方式接收
            String str=scanner.next();
            System.out.println("输出的内容为:"+str);
        }
        //凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完关掉
        scanner.close();
    }
}


package com.company.scanner;

import java.util.Scanner;

public class Demo02_Scanner2 {
    public static void main(String[] args) {
        // //创建一个扫描器对象,用来接收键盘数据
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用nextLine方式接收:");

        //判断是否还有输入
        if(scanner.hasNextLine()){
            String string=scanner.nextLine();
            System.out.println("输出的内容为:"+string);
        }
        scanner.close();
    }
}


package com.company.scanner;

import java.util.Scanner;

public class Demo03_Scanner3 {
    public static void main(String[] args) {
        // //创建一个扫描器对象,用来接收键盘数据
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入参数:");

        String str=scanner.nextLine();
        System.out.println("输出的内容为"+str);
        scanner.close();
    }
}
  • Scanner对象

    next():

    • 1.一定要读取读取到有效字符才可以结束输入。
    • 2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
    • 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
    • 4.next()不能得到带有空格的字符串

    next Line():

    • 1.以enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
    • 2.可以获取空白。

JAVA流程控制02:Scanner进阶使用

package com.company.scanner;

import java.util.Scanner;

public class Demo04_Scanner4 {
    public static void main(String[] args) {
       Scanner scanner= new Scanner(System.in);

       //键盘接受数据
        int i=0;
        float f=0.1f;

        System.out.println("请输入整数");
        //如果。。。那么
        if(scanner.hasNextInt()){
            i=scanner.nextInt();
            System.out.println("整数数据"+i);

        }else{
            System.out.println("输入的不是整数数据");
        }
        System.out.println("请输入小数:");
        if(scanner.hasNextFloat()){
            f=scanner.nextFloat();
            System.out.println("小数数据:"+f);
        }

    }
}

package com.company.scanner;


import java.util.Scanner;

public class Demo05_Scanner5 {
    public static void main(String[] args) {
        //我们可以输入多个数字;并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字结束输入并输出执行结果
        Scanner scanner = new Scanner(System.in);

        //和
        double sum=0;
        //计算输入了多少个数字
        int n=0;

        //通过循环判读是否还有输入,并在里面对每一次进行求和统计
        while (scanner.hasNextDouble()){
            double xx=scanner.nextDouble();
            n=n+1;//n++
            sum=sum+xx;
            System.out.println("你输入了第"+n+"个个数,当前结果sum="+sum);
        }
        System.out.println(n+"个数的和为"+sum);
        System.out.println(n+"个数的平均数为"+sum/n);
        scanner.close();

    }
}

JAVA流程控制03:顺序结构

  • Java的基本结构就是顺序结构,处非特别声明,否则就按照顺序一句一句执行。
  • 顺序解构是最简单的算法结构。
  • 语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,她是任何一个算法都离不开的基本算法结构。
package com.company.struct;

public class Demo01_顺序结构 {
    public static void main(String[] args) {
        System.out.println("hello1");
        System.out.println("hello2");
        System.out.println("hello3");
        System.out.println("hello4");
        System.out.println("hello5");
    }
}

JAVA流程控制04:if选择结构

  • if单选择结构

    • 我们很多时候需要去判读一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示

    • 语法

if(布尔表达式){
	//如果为true将执行语句
}
package com.company.struct;

import java.util.Scanner;

public class Demo01_if结构 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);

        System.out.println("请输入内容");
        String string=scanner.nextLine();

        //equals:判断字符串是否相等
        if(string.equals("Hell0")){
            System.out.println(string);
        }
        System.out.println("End");
        scanner.close();
    }
}

  • if双选择结构
    • 需求:公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发。这样的需求一个if就搞不定了,需要一个双选择结构,所以就有了if-else结构。

    • 语法:

if(布尔表达式){
	//如果布尔值为true
}else{
	//布尔值为false
}
package com.company.struct;

import java.util.Scanner;

public class Demo02_ifelse双选择结构 {
    public static void main(String[] args) {
        //score >=60 及格 <60 不及格
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入分数");
        int score=scanner.nextInt();

        if(score>=60){
            System.out.println("及格了真棒");
        }else{
            System.out.println("不及格废物");
        }
        scanner.close();
    }
}
  • if多选择结构
    • 需求:成绩等级划分ABCD,90-100A,80-90B,70-80C,60-70D,所以我们需要一个多选择结构来处理。

    • 语法:

if(布尔表达式1){
	//布尔表达式1true执行
}else{
	//布尔表达式2true执行
}else{
    //布尔表达式3true执行
}else{
    //布尔表达式都不为true执行
}
package com.company.struct;

import java.util.Scanner;

public class Demo03_ifelse多选择结构 {
    public static void main(String[] args) {
        //score >=60 及格 <60 不及格
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入分数");
        int score=scanner.nextInt();

        if(score==100){
            System.out.println("恭喜你获得满分");
        }else if(score<100&&score>=90){
            System.out.println("A级");
        }else if(score<90&&score>=80){
            System.out.println("B级");
        }else if(score<80&&score>=70){
            System.out.println("C级");
        }else if(score<60&&score>0){
            System.out.println("成绩不理想请继续努力");
        }else {
            System.out.println("成绩不合法");
        }
        scanner.close();
    }

}

  • 嵌套的if结构
    • 使用嵌套的if…else语句是合法的,也就是说你可以在另一个if或者else if语句中使用if 或者else if语句。你可以像if语句一样嵌套else if…else.

    • 语法:

    • 思考?我们需要找一个数,在1-100之间

if(布尔表达式1){
	//如果布尔表达式1值为true执行代码
	if(布尔表达式2){
		//如果布尔表达式2值为true执行代码
	}
}
  • switch多选择结构

JAVA流程控制05:switch选择结构

  • 多选择还有一个实现方式switch case语句

  • switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

  • switch语句中的变量类型可以说:

    • byte ,short,int,或者char
    • 从Java SE 7开始
    • switch支持字符串String类型了
    • 同时case标签必须为字符串常量或字面量
package com.company.struct;

public class Demo02_Switch选择结构 {
    public static void main(String[] args) {
        String name="曹琳琳";
        //JDK7的新特性,表达式可以是字符串!!!
        //字符本质还是数字
        //反编译  java---class(字节码文件)---反编译
        switch (name){
            case "李如意":
                System.out.println("李如意");
                break;
            case "毛淋洁":
                System.out.println("毛淋洁");
                break;
            default:
                System.out.println("弄啥类");
                break;
        }
    }
}

JAVA流程控制06:循环结构

循环结构

  • while循环
while循环是最基本的循环,他的结构为:
while(布尔表达式){
	//循环内容
}

package com.company.struct;

public class Demo01_while {
    public static void main(String[] args) {
        //输出1-100
        int i=0;
        while (i<100){
            i++;
            System.out.println(i);
        }
    }

}

package com.company.struct;

public class Demo02_while {
    public static void main(String[] args) {
        //伪代码
        while (true){
            //等待客户端连接
            //定时检查 :闹钟
            //......死循环
        }
    }
}

  • 只要布尔表达式为true,循环就会一直执行下去

  • 我们大多数情况下是会让循环停止下来是的,我们需要一个让表达式失效的方式结束循环

  • 少部分情况下需要循环一直执行,比如服务器的请求响应监听

  • 循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应尽量避免死循环,影响程序性能或者造成程序卡死崩溃!!

  • 思考:计算1+2+3+…+100=?

  • do while循环

对于do ...while循环和while循环相似,不同的是,do...while循环至少会执行一次。
do(){
	//代码语句
}while(布尔表达式);
package com.company.struct;

public class Demo03_Dowhile {
    public static void main(String[] args) {
        int i=0;
        int sum=0;

        do {
            sum=sum+i;
            i++;
        }while (i<=100);
        System.out.println(sum);
    }
}

package com.company.struct;

public class Demo03_Dowhile {
    public static void main(String[] args) {
        int i=0;
        int sum=0;

        do {
            sum=sum+i;
            i++;
        }while (i<=100);
        System.out.println(sum);
    }
}
package com.company.struct;

public class Demo03_Dowhile2 {
    public static void main(String[] args) {
        int a=0;
        while (a<0){
            System.out.println(a);
        }
        System.out.println("***********");

        do {
            System.out.println(a);
        }while (a<0);
    }
}

  • while和do-while的区别;

    • while先判断后执行。dowhile是先执行后判断!
    • Do…while总是保证循环体至少执行一次!主要区别。
  • for循环

    • 虽然所有循环结构都可以用while或者do…while表示,但是java提供了另一种语句——for循环,是一些循环结构变得更加简单。

    • for循环语句是支持迭代的一些通用结构,是最有效、最灵活的循环结构。

    • for循环执行的次数是在执行前就确定的。

    • for循环语法:

for(初始化;布尔表达式;更新){
	//代码语句
}
package com.company.struct;

public class Demo01_for循环 {
    public static void main(String[] args) {
       int a=1;//初始化条件

       while(a<=100){//条件判断
           System.out.println(a);//循环体
           a++;//迭代
       }
        System.out.println("while循环结束");

        //初始化;布尔表达式;更新
       for (int i=1;i<=100;i++){
           System.out.println();
       }
        System.out.println("for循环结束");
       //for循环快捷键  100.for
        for (int i = 0; i < 100; i++) {
            
        }
        //死循环
        for (; ; ) {
            
        }
    }
}

package com.company.struct;

public class Demo03_for循环 {
    public static void main(String[] args) {
        //2:用while或for循环输出1-1000内能被5整除的数,每行可输出6个
        for (int i = 0; i <= 1000; i++) {
            if (i%5==0){
                System.out.print(i+"\t");
            }
            if (i%(5*6)==0){
                System.out.println();
               // System.out.print(i+"\n");
            }
        }
        //println输出完会换行
        //print输出不会换行
    }
}

package com.company.struct;

public class Demo04_for循环 {
    public static void main(String[] args) {
        //打印九九乘法表
        //1.先打印第一列
        //2.把固定的1在用一个循环体包起来
        //3.去掉重复项,i<=j
        //4.调整样式
        for (int j = 1; j <=9; j++) {
            for (int i = 1; i <=j; i++) {
                System.out.print(j+"*"+i+"="+j*i+"\t");
            }
            System.out.println();
        }

    }
}

  • 在java5中引入了一种主要用于数组的增强for循环
    • java增强for循环语法如下:
for(声明语句:表达式){
	//代码句子
}
  • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值于此时数组元素的值相等。
  • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
package com.company.struct;

public class Demo05_增强for循环 {
    public static void main(String[] args) {
        int [] numbers={10,20,30,40,50};

        for (int i = 0; i < 5; i++) {
            System.out.println(numbers[i]);
        }
        System.out.println("================");

        //遍历数组的元素
        for(int x:numbers){
            System.out.println(x);
        }
    }
}

JAVA流程控制07:break continue

  • break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余语句。(break语句也在switch语句中使用)
  • continue语句再循环语句中,用于终止某次循环过程,即跳过循环体中为执行的语句,接着进行下一次是否执行语句的判定
  • 关于goto关键字
    • goto关键字很早在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用:java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子----带标签的break和continue。
    • “标签”是指后面跟一个冒号的标识符,例如:labal:
    • 对于java来说唯一用到标签的方法是在循环语句之前,而在循环体之前设置标签的唯一理由是:我们希望在其中嵌套一套循环,由于break和continue关键字通常只中断当前循环,但若随标签使用,他们就会中断到存在标签的地方。
package com.company.struct;

public class BreakDemo {
    public static void main(String[] args) {
        int i=0;
        while (i<100){
            i++;
            System.out.println(i);
            if(i==30){
                break;
            }
        }
        System.out.println("end");
    }
}

package com.company.struct;

public class ContinueDemo {
    public static void main(String[] args) {
        int i=0;
        while (i<100){
            i++;
            if (i%10==0){
                System.out.println("**");
                continue;
            }
            System.out.print(i);
        }
        //break在任何循环语句的主体部分,均可用break控制循环的流程,**break用于强行退出循环**,不执行循环中剩余语句。(break语句也在switch语句中使用)
        //continue语句再循环语句中,**用于终止某次循环过程**,即跳过循环体中为执行的语句,接着进行下一次是否执行语句的判定
    }
}

package com.company.struct;

public class LabelDemo {
    public static void main(String[] args) {
        //打印101-150之间所有质数
        //质数是需在大于1的自然数中,除了1和它本身以外不在有其他因数的自然数
        int count=0;
        outer:for (int i = 101; i < 150; i++) {
            for (int j=2;j<i/2;j++){
                if (i%j==0){
                    continue outer;
                }
            }
            System.out.print(i+" ");//101 103 107 109 113 127 131 137 139 149
        }

    }
}

JAVA流程控制08:打印三角形及Debug

package com.company.struct;

public class TestDemo {
    public static void main(String[] args) {
        //打印三角形
        for (int i = 1; i <=5; i++) {
            for (int j = 5; j >= i; j--) {
                System.out.print(" ");
            }
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            for (int j=1;j<i;j++){
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

JAVASE_03:JAVA方法详解

Java方法01:什么是方法?

  • System.out.println(),那么它是什么呢?
  • Java方法是语句的集合,它们在一起执行一个功能。
    • 方法是解决一类问题的步骤的有序集合
    • 方法包含于类或对象中
    • 方法在程序中被创建,在其他地方被引用。
  • 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样有利于我们后期的拓展
  • 回顾:方法的命名规则?

Java方法02:方法的定义和调用

  • Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
  • **方法包含一个方法头和方法体。**下面是一个方法的所有部分:
  • 修饰符:这是可选的,告诉编译器如何调用该方法,定义了方法的访问类型。
  • 返回值类型:方法可能有返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。这种情况下,returnValueType是关键字
  • void。
  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  • 参数类型:参数像是一个占位符。其方法被调用时,传值传给参数。这个值被称为实参或变量。参数列表是指参数类型、顺序和参数个数。参数是可选的,方法可以不包含任何参数。
    • 形式参数:方法被调用时用于接收外界输入的数据.
    • 实参:调用方法时实际传给方法的数据。
  • 方法体:方法体包含具体的语句,定义该方法的功能。
修饰符  返回值类型 方法名(参数类型  参数名){
	...
	方法体
	...
	return 返回值;
}
  • 方法调用
  • 调用方法:对象名.方法名(实参列表)
  • java支持两种调用方法的方式,根据方法是否返回值来选择。
  • 当方法返回一个值的时候,方法调用通常被当作一个值。例如:
int larger=max(30,40);
  • 如果方法返回值是void,方法调用一定是一条语句。
System.out.println("Hello,linjie");
package com.company.method;

public class Demo01_方法 {
    //main方法
    public static void main(String[] args) {
        //实参:调用方法时实际传给方法的数据。
       int sum= add(1,2);
        System.out.println(sum);

        test();
    }
        //加法
        //形式参数:方法被调用时用于接收外界输入的数据。
    public static  int add(int a,int b){
        return a+b;
    }
    public static void test(){
        for (int i = 0; i <= 1000; i++) {
            if (i%5==0){
                System.out.print(i+"\t");
            }
            if (i%(5*3)==0){
                System.out.println();
            }
        }
    }
}

package com.company.method;

public class Demo02_方法 {
    public static void main(String[] args) {
        int max=max(10,20);
        System.out.println(max);
    }

    //比较大小
    public static int max(int number1,int number2){
        int result=0;
        if (number1==number2){
            System.out.println("number1==number2");
            return 0;
        }
        if (number1>number2){
            result=number1;
        }else{
            result=number2;
        }
        return result;
    }
}

    • 拓展:值传递(Java)和引用传递

Java方法03:方法的重载

    • 重载就是在一个类中,有相同的函数名程,但形参不同的函数。

    • 方法重载的规则:

      • 方法的名称必须相同。
      • 参数列表必须不同(个数不同,或类型不同,参数排列顺序不同等)。
      • 方法的返回类型可以相同也可以不同。
      • 仅仅返回类型不同不足以成为方法的重载。
    • 实现理论:

      • 方法名称相同时,编译器会根据方法的参数个数,参数类型等逐个去匹配,已选择对应的方法,如果匹配失效,择编译器报错。
package com.company.method;

public class Demo02_方法 {
    public static void main(String[] args) {
        double max=max(10.0,20.0);
        System.out.println(max);
    }

    //比较大小
    public static double max(double number1,double number2){
        double result=0;
        if (number1==number2){
            System.out.println("number1==number2");
            return 0;
        }
        if (number1>number2){
            result=number1;
        }else{
            result=number2;
        }
        return result;
    }
    public static int max(int number1,int number2){
        int result=0;
        if (number1==number2){
            System.out.println("number1==number2");
            return 0;
        }
        if (number1>number2){
            result=number1;
        }else{
            result=number2;
        }
        return result;
    }
    public static int max(int number1,int number2,int number3){
        int result=0;
        if (number1==number2){
            System.out.println("number1==number2");
            return 0;
        }
        if (number1>number2){
            result=number1;
        }else if(number2>number3){
            result=number2;
        }else{
            result=number3;
        }
        return result;
    }
}

Java方法04:命令行传参

  • 有时候你希望运行一个程序后再传递给他一个消息。这要靠传递命令行参数给main()函数实现
package com.company.method;
//命令行传参
public class Demo03 {
    public static void main(String[] args) {
        for (int i = 0; i <args.length ; i++) {
            System.out.println("args["+i+"]:"+args[i]);
        }
    }
}

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uO0tUGJo-1669206574813)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1636473433431.png)]

Java方法05:可变参数

    • JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
    • 在方法声明中,在指定类型后加一个省略号(…).
    • 一个方法中只能指定一个可变参数,它必须在方法的最后一个参数。任何普通的参数必须在他的之前声明。
package com.company.method;

public class Demo04_可变参数 {
    public static void main(String[] args) {
        //调用可变参数的方法
        printMax(34,35,67,30,12,66,88.6,39);
        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 = 0; i <numbers.length ; i++) {
            if (numbers[i]>result){
                result=numbers[i];
            }
        }
        System.out.println("The Max Value is"+result);
    }
}

Java方法06:递归

    • A方法掉B方法,很容易理解!
    • 递归就是:A方法掉A方法!就是自己调用自己
    • 利用递归可以用简单的程序来解决一些复杂的问题。通常把一个大型复杂的问题层层转化为一个与原问题相识的规模较小的问题来求解,递归策略只需要少量程序就可描述出解题过程中需要的多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
    • 递归结构包括:
      • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
      • 递归体:什么时候需要调用自身方法。
package com.company.method;

public class Demo05_递归 {
    public static void main(String[] args) {
        System.out.println(f(5));//120
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }else{
            return n*f(n-1);
        }
    }
}


JAVASE_04:JAVA数组结构

Java数组01:数组的定义

  • 数组是相同类型数据的有序集合
  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
  • 其中,每一个数据称为一个数组元素,每个数组元素可以通过一个下标来访问它们。

Java数组02:数组的声明和创建

  • 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar;//首选方法
或
dataType arrayRefVar[];//效果相同,但不是首选方法
  • dataType[] arrayRefVar;//首选方法

    dataType arrayRefVar[];//效果相同,但不是首选方法
  • Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRwefVar=new dataType[arraySize];
  • dataType[] arrayRwefVar=new dataType[arraySize];
  • 数组的元素是通过索引访问的,数组的索引从0开始。
  • 获取数组的长度:
arrays.length
  • arrays.length

Java数组03:三种初始化及内存分析

  • 三种初始化

  • 静态初始化

int [] a={1,2,3};
Man[] mans= {new Man(1,1),new Man(2,2)};
  • 动态初始化
int[] a =new int[2];
a[0]=1;
a[1]=2;
  • 数组的默认初始化

    数组是引用类型,他的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照是实例变量同样的方式被隐式初始化。

  • 内存分析

    • Java内存分析:

      1.堆:存放new的对象和数组;可以被所有的线程共享,不会存放别的对象引用。

      2.栈:存放基本变量类型(会包含这个基本类型的具体数值);引用对象的变量(会存放这个引用在堆里面的具体地址)

      3.方法区:可以被所有线程共享;包含了所有的class和static变量。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCjhDV6S-1669206574815)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1642924106416.png)]

​ 数组的四个基本特点:

    - 1数组长度是确定的,数组一旦被创建,他的大小不可以改变
    - 2其元素必须是相同类型,不允许出现混和类型
    - 3.数组中元素可以是任何数据类型,包括基本类型和引用类型
    - 4.数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就i是对象,Java中对象是存放在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组边界

  • 下标的合法区间[0,length-1],如果越界就会报错:
public static void main(String[]args){
     int[] a= new int[2];
     System.out.printIn(a[2]);
}
  • ArrayIndexOutOfBoundsException:数组下标越界异常!

数组使用

  • For-Each循环
  • 数组作方法入参
  • 数组作返回值
package com.company.array;

public class ArrayDemo01_声明创建数组 {
    //变量类型 变量名 =变量的值;
    //数组类型
    public static void main(String[] args) {
        int[] nums;//1.声明一个数组

        nums=new int[10];//2.创建一个数组

        //3.给数组元素赋值
        nums[0]=1;
        nums[1]=2;
        nums[2]=3;
        nums[3]=4;
        nums[4]=5;
        nums[5]=6;
        nums[6]=7;
        nums[7]=8;
        nums[8]=9;
        nums[9]=10;

        //计算所有数组元素的和
        int sum=0;
        //获取数组的长度:arrays.length
        for (int i = 0; i <nums.length ; i++) {
            sum+=nums[i];
        }
        System.out.println("元素和="+sum);
    }
}

package com.company.array;

public class ArrayDemo02_数组初始化 {
    public static void main(String[] args) {
        //1.静态初始化:创建+声明
        int[] a={1,2,3,4,5,6,7,8};
        System.out.println(a[0]);

        //2.动态初始化:包含默认初始化
        int[] b=new int[10];
        b[0]=10;
        b[1]=10;

        System.out.println(b[0]);
        System.out.println(b[1]);
        System.out.println(b[2]);
        System.out.println(b[3]);
    }
}


package com.company.array;

public class ArrayDemo03_数组使用 {
    public static void main(String[] args) {
        int[] arrays={1,2,3,4,5};

        //打印全部数组元素
        for (int i = 0; i <arrays.length ; i++) {
            System.out.println(arrays[i]);
        }
        System.out.println("==================");
        //计算所有元素的和
        int sum=0;
        for (int i = 0; i < arrays.length; i++) {
            sum+=arrays[i];
        }
        System.out.println("sum="+sum);
        System.out.println("==================");
        //查找最大元素
        int max=arrays[0];
        for (int i = 1; i <arrays.length ; i++) {
            if (arrays[i]>max){
                max=arrays[i];
            }
        }
        System.out.println("max="+max);
    }
}


package com.company.array;

public class ArrayDemo04_ForEach {
    public static void main(String[] args) {
        int [] arrays={1,2,3,4,5};
        //JDK1.5 foreach没有下标
        for (int array : arrays) {
            System.out.println(array);
        }

        printArray(arrays);
        System.out.println("=================");
        int[] reverse=reverse(arrays);
        printArray(reverse);
    }

    //打印数组元素
    public static void  printArray(int[] arrays){
        for (int i = 0; i <arrays.length ; i++) {
            System.out.print(arrays[i]+" ");
        }
    }

    //反转数组
    public  static int[] reverse(int[] arrays){
        int[] result=new int[arrays.length];
        
        //反转数组操作
        for (int i = 0,j=result.length-1;i <arrays.length ; i++,j--) {
            result[j]=arrays[i];
        }
        return result;
    }
}


  • 多维数组
  • 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
  • 二维数组
int a[][]=new int[2][5];

  • 解析:以上二维数组a可以看成一个两行五列的数组。
  • 思考:多为数组的使用?
package com.company.array;

public class ArrayDemo05_多维数组 {
    public static void main(String[] args) {
        //[4][2]
        /*
        1,2  array[0]
        2,3  array[1]
        3,4  array[2]
        4,5  array[3]
          */
        int [][] array={{1,2},{2,3},{3,4},{4,5}};

        for (int i = 0; i <array.length ; i++) {
            for (int j = 0; j <array[i].length ; j++) {
                System.out.println(array[i][j]);
            }

        }

       // printArray(array[0]);
        System.out.println(array[0][0]);
        System.out.println(array[0][1]);
        System.out.println(array[2][0]);
        System.out.println(array[2][1]);
    }

    //打印数组元素
    public static void  printArray(int[] arrays){
        for (int i = 0; i <arrays.length ; i++) {
            System.out.print(arrays[i]+" ");
        }
    }
}


  • Arrays类

  • 数组的工具类Java.util.Arrays

  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。

  • 查看JDK帮助文档

  • Arrays类中的方法都是static关键字修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使用对象来调用(注意:是“不用”而不是“不能”)

  • 具有以下常用功能

    • 给数组赋值:通过fill方法。
    • 对数组排序: 通过sort方法,按升序。
    • 比较数组:通过equals方法比较数组中元素值是否相等。
    • 查找数组元素:通过binarySearch方法·能·对排序好的数组进行二分查找法操作。
package com.company.array;

import java.util.Arrays;

public class ArrayDemo06_数组排序 {
    public static void main(String[] args) {
        int [] a={1,24,522,1234,4322,12,1324};
        System.out.println(a);//[I@1b6d3586
        //打印数组元素Arrays.toString

        Arrays.sort(a);//数组排序;升序
        System.out.println(Arrays.toString(a));
       // printArray(a);

        //Arrays.fill(a,0);//数组填充
        Arrays.fill(a,2,4,0);
        System.out.println(Arrays.toString(a));
    }


    public static void printArray(int[] a){
        for (int i = 0; i <a.length ; i++) {
            if (i==0){
                System.out.print("[");
            }if (i==a.length-1){
                System.out.print(a[i]+"]");
            }else
            System.out.print(a[i]+", ");
        }
    }
}


  • 冒泡排序
  • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!
  • 冒泡的代码还是很简单的·,两层循环,外层冒泡轮数,里层依次比较,江湖中人人皆知。
  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度o(n2)。
  • 思考:如何优化?
package com.company.array;

import java.util.Arrays;

public class ArrayDemo07_冒泡排序 {
    public static void main(String[] args) {
        int[] a={1,2,5,45,13,14,76,145};
        int [] sort=sort(a);
        System.out.println(Arrays.toString(sort));
    }

    //冒泡排序
    //1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
    //2.每一次比较,都会产生出一个最大,或者最小的数字;
    //3.下一轮就可以少一次排序!
    //4.依次排序,直到结束

    public  static int[] sort(int[] array){
        int temp=0;
        //外层循环,判断我们要走多少轮
        for (int i = 0; i <array.length-1 ; i++) {
            boolean flag = false;//通过flag的标识位减少没有意义的比较

            //内层循环,比较判断两个数,如果第一个数比第二个数大,交换位置
            for (int j = 0; j <array.length-1-i ; j++) {
                if (array[j+1]>array[j]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    flag=true;
                }
            }
            if(flag==false){
                break;
            }
        }
        return array;

    }
}



  • 稀疏数组

    • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jmyaLc3-1669206574816)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1644248585050.png)]
    • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。
    • 解决问题:稀疏数组
  • 稀疏数组介绍

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

  • 稀疏数组的处理方式是:

    • 记录数组一共有几行几列,有多少个不同值

    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

    • 如图:坐标是原始数组,右边是稀疏数组

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWzyey0z-1669206574817)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1644249033040.png)]

package com.company.array;
public class ArrayDemo08_稀疏数组 {
    public static void main(String[] args) {
        //1.创建一个二维数组 11*11 0:没有棋子  1:黑棋  2:白棋
        int[][]array1=new int[11][11];
        array1[1][2]=1;
        array1[2][3]=2;
        //输出原始的数组
        System.out.println("输出原始的数组");
        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    //转换为稀疏数组保存
    //1.获取有效值的个数
    int sum =0;
    for (int i = 0; i <11 ; i++) {
        for (int j = 0; j <11 ; j++) {
            if (array1[i][j]!=0){
                sum++;
            }
        }
    }
    System.out.println("有效值个数为"+sum);
    //2.创建一个稀疏数组的数组
    int[][] array2=new int [sum+1][3];
    array2[0][0]=11;
    array2[0][1]=11;
    array2[0][2]=sum;

    //3.遍历二维数组,将非零的值记录到稀疏数组中
    int count=0;
    for (int i = 0; i < array1.length; i++) {
        for (int j = 0; j <array1[i].length ; j++) {
            if (array1[i][j]!=0){
                count++;
                array2[count][0]=i;
                array2[count][1]=j;
                array2[count][2]=array1[i][j];
            }

        }

    }
    //输出稀疏数组
    System.out.println("稀疏数组");
    for (int i = 0; i <array2.length ; i++) {
        System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]);

    }
    System.out.println("==================================");
    System.out.println("还原");
    //1.读取稀疏数组的值
    int[][] array3=new int[array2[0][0]][array2[0][1]];
    //2.给其中的元素还原它的值
    for (int i = 1; i <array2.length ; i++) {
        array3[array2[i][0]][array2[i][1]]=array2[i][2];
    }
    //3.打印
    System.out.println("输出还原的数组");
    for (int[] ints : array1) {
        for (int anInt : ints) {
            System.out.print(anInt+"\t");
        }
        System.out.println();
    }
}

JAVASE_05:JAVA面向对象

面向对象01:什么是面向对象?

  • 面向过程&面向对象

    • 面向过程思想
      • 步骤清晰简单,第一步做什么,第二步做什么…
      • 面向过程适合处理一些较为简单的问题
    • 面向对象思想
      • 物理类聚,分类的思维模式,思考问题首先会解决问题需要那些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
      • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
      • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,任然需要面向过程的思路去处理。
  • 什么是面向对象?

  • 面向对象编程(Object-Oriented Programming,OOP)

  • 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。

  • 抽象

  • 三大特性:

    • 封装
    • 继承
    • 多态
    • 从认识论角度考虑是先有对象后有类。对象,是具体的事物,类,是抽象的,是对对象的抽象
    • 从代码运行角度考虑是现有类后有对象。类是对象的模板。

面向对象02:方法的回顾即调用?

  • 方法的定义

    • 修饰符
    • 返回类型
    • break:跳出switch ,结束循环和return 的区别
    • 方法名:注意规范就ok 见名知意
    • 参数列表:(参数类型,参数名)…
    • 异常抛出:疑问,后面讲解
  • 方法的调用:递归

  • 静态方法

  • 非静态方法

  • 形参和实参

  • 值传递和引用传递

  • this关键字

package com.company.oop;

public class Demo02_静态方法非静态方法调用 {
    //静态方法 static

    //非静态方法
    public static void main(String[] args) {
     //   Student.say();  静态方法 类名.方法名
        Student student = new Student();//非静态方法要先创建对象在调用
        student.say();
    }
    //和类一起加载的
    public static void a(){
     //   b();  存在的调用不存在的会报错
    };
    //类实例化 之后才存在
    public  void b(){};
}

package com.company.oop;

//学生类
public  class Student {
    //非静态方法
    public   void say(){
        System.out.println("学生说话了");
    }
}

package com.company.oop;

public class Demo03_形参和实参 {
    public static void main(String[] args) {
        //实参和形参的类型要对应
        int add= Demo03_形参和实参.add(1,2);
        System.out.println(add);
    }
    public static int add(int a,int b){
        return a+b;
    }
}

package com.company.oop;
//值传递
public class Demo04_值传递 {

    public static void main(String[] args) {
        int a=1;
        System.out.println(a);
        Demo04_值传递.change(a);
        System.out.println(a);//1
    }

    //返回值为空
    public static  void change(int a){
        a=10;
    }
}

package com.company.oop;
//引用传递本质还是值传递
public class Demo05_引用传递 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);//null
        Demo05_引用传递.change(person);
        System.out.println(person.name);//李如意
    }

    public static  void change(Person  person){
        //person是一个对象; 指向的---> Person person=new Person();这是一个具体的人,可以改变属性!
        person.name="李如意";
    }
    //定义一个Peoson类,有一个属性:name
    static class Person{
        String name;
    }
}

面向对象03:类与对象的创建

  • 类与对象的关系

    • 类是一种抽象的数据类型,它只对某一类事物整体描述/定义,但是并不能代表一个具体的事物
      • 动物、植物、手机、电脑。。。
      • Person类、Pet类、Car类等,这些类都是原来描述/定义某一类具体事物应该具备的特点和行为
    • 对象是抽象概念的具体实例
      • 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
      • 能够体现出特点,展示出功能的是具体的实例,而不是叫一个抽象的概念。
  • 创建与初始化对象

  • 使用new关键字创建对象

  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且有以下两个特点:

  • 1.必须和类的名字相同

  • 2.必须设有返回类型,也不能写void

  • 构造器必须要掌握

package com.company.object;
//学生类
public class Student {
    //属性:字段
    String name;//null
    int age;//0
    public  void study(){
        System.out.println(this.name+"在学习");
    };
}

package com.company.object;


//一个项目应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //类:抽象化,实例化
        //类实例化后会返回一个自己的对象!
        //student对像就是一个Student类的具体实例!
        Student student1=new Student();
        Student student2=new Student();
        student1.name="xiaoli";
        student1.age=10;
        System.out.println(student1.name);//xaioli
        System.out.println(student1.age);//10
        System.out.println(student2.name);//null
    }
}

构造器必须要掌握
package com.company.object;
//java--->class
public class Person {
//    一个类即使什么因为不写,它也会存在一个方法构造器产生构造方法
    String name;
// 实例化初始值
// 构造器作用
//    1.使用new关键字,本质是在调用构造器
    public Person() {
    this.name="大白";
}
//    有参构造:一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name) {
        this.name=name;
    }
//    alter+insert 生成构造方法快捷键
}

//java--->class  项目结构-->Modules-->Add Content Root-->添加Out根目录

/*
* //一个项目应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //new 实例化一个对象
        Person person = new Person();
        Person person1 = new Person("大龙");
        System.out.println(person.name);//大白
        System.out.println(person1.name);//大龙

    }
    * 构造器:
    * 1.和类名相同
    * 2.没有返回值
    * 作用:
    * 1.new 本身就在调用构造方法
    * 2.初始化对象的值
    * 注意点:
    * 1.定义有参构造之后,如果想使用无参构造,必须显示定义一个无参的构造
    *
    * alter+insert
    * */

面向对象04: 构造器详解

package com.company.object;
//java--->class
public class Person {
//    一个类即使什么因为不写,它也会存在一个方法构造器产生构造方法
    String name;
// 实例化初始值
// 构造器作用
//    1.使用new关键字,本质是在调用构造器
    public Person() {
    this.name="大白";
}
//    有参构造:一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name) {
        this.name=name;
    }
//    alter+insert 生成构造方法快捷键
}

//java--->class  项目结构-->Modules-->Add Content Root-->添加Out根目录

/*
* //一个项目应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //new 实例化一个对象
        Person person = new Person();
        Person person1 = new Person("大龙");
        System.out.println(person.name);//大白
        System.out.println(person1.name);//大龙

    }
    * 构造器:
    * 1.和类名相同
    * 2.没有返回值
    * 作用:
    * 1.new 本身就在调用构造方法
    * 2.初始化对象的值
    * 注意点:
    * 1.定义有参构造之后,如果想使用无参构造,必须显示定义一个无参的构造
    *
    * alter+insert
    * */
  • package com.company.object;
    //java—>class
    public class Person {
    // 一个类即使什么因为不写,它也会存在一个方法构造器产生构造方法
    String name;
    // 实例化初始值
    // 构造器作用
    // 1.使用new关键字,本质是在调用构造器
    public Person() {
    this.name=“大白”;
    }
    // 有参构造:一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name) {
    this.name=name;
    }
    // alter+insert 生成构造方法快捷键
    }

//java—>class 项目结构–>Modules–>Add Content Root–>添加Out根目录

/*

  • //一个项目应该只存在一个main方法
    public class Application {
    public static void main(String[] args) {
    //new 实例化一个对象
    Person person = new Person();
    Person person1 = new Person(“大龙”);
    System.out.println(person.name);//大白
    System.out.println(person1.name);//大龙

    }

    • 构造器:
    • 1.和类名相同
    • 2.没有返回值
    • 作用:
    • 1.new 本身就在调用构造方法
    • 2.初始化对象的值
    • 注意点:
    • 1.定义有参构造之后,如果想使用无参构造,必须显示定义一个无参的构造
      *
    • alter+insert
    • */

面向对象05:创建对象内存分析

package com.company.objmemoryanaly;

public class Pet_对象内存分析 {
   public String name;
   public int age;
//   无参构造
    public void shout(){
        System.out.println("叫了一声");
    }
}

package com.company.objmemoryanaly;

public class Application {
    public static void main(String[] args) {
        Pet_对象内存分析 dog = new Pet_对象内存分析();
        dog.age=3;
        dog.name="旺财";
        dog.shout();
        System.out.println(dog.age);
        System.out.println(dog.name);
        Pet_对象内存分析 cat = new Pet_对象内存分析();
        Pet_对象内存分析 girlfriend = new Pet_对象内存分析();
    }
}

package com.company.objmemoryanaly;

public class Pet_对象内存分析 {
   public String name;
   public int age;
//   无参构造
    public void shout(){
        System.out.println("叫了一声");
    }
}

package com.company.objmemoryanaly;

public class Application {
    public static void main(String[] args) {
        Pet_对象内存分析 dog = new Pet_对象内存分析();
        dog.age=3;
        dog.name="旺财";
        dog.shout();
        System.out.println(dog.age);
        System.out.println(dog.name);
        Pet_对象内存分析 cat = new Pet_对象内存分析();
        Pet_对象内存分析 girlfriend = new Pet_对象内存分析();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mf9tsEGw-1669206574818)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1651649331351.png)]

面向对象06:简单小结类与对象

package com.company;

public class Application {
    public static void main(String[] args) {
        /*
        * oop小结
        * 1.类与对象
        *   类是一个模板:抽象,对象是一个具体的实例
        * 2.方法
        *   定义、调用!
        * 3.对应的引用
        *   引用类型:基本类型(8)
        *   对象是通过引用来操作的:栈--->堆
        * 4.属性:字段filed成员变量
        *   默认初始化:
        *      数字:0  0.0
        *      char: u0000
        *      Boolean:false
        *      引用:null
        *    修饰符  属性类型 属性名=属性值 !
        * 5.对象的创建与引用
        *   -必须使用new 关键字创建对象,构造器 Person person =new Person ();
        *   -对象的属性  person.name
        *   -对象的方法  person.sleep()
        * 6.类:
        *    静态的属性:属性
        *    动态的行为:方法
        *
        * */
    }
}


- package com.company;

public class Application {
    public static void main(String[] args) {
        /*
        * oop小结
        * 1.类与对象
        *   类是一个模板:抽象,对象是一个具体的实例
        * 2.方法
        *   定义、调用!
        * 3.对应的引用
        *   引用类型:基本类型(8)
        *   对象是通过引用来操作的:栈--->堆
        * 4.属性:字段filed成员变量
        *   默认初始化:
        *      数字:0  0.0
        *      char: u0000
        *      Boolean:false
        *      引用:null
        *    修饰符  属性类型 属性名=属性值 !
        * 5.对象的创建与引用
        *   -必须使用new 关键字创建对象,构造器 Person person =new Person ();
        *   -对象的属性  person.name
        *   -对象的方法  person.sleep()
        * 6.类:
        *    静态的属性:属性
        *    动态的行为:方法
        *
        * */
    }
}

面向对象07:封装详解

  • 封装
  • 该露的露,该藏得藏
    • 我们程序设计要追求”高内聚,低耦合“。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
  • 封装(数据的隐藏)
    • 通常,应禁止直接访问一个对像中数据的实际表示,而应通过操作接口来访问,这称为数据的隐藏。
  • 记住这局话就够了:属性私有,get/set
package com.company.private_fz;

public class Student_封装 {
    private String name;
    private int age;
    private char sex;

    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<0){
            age=3;
        }else{
            this.age=age;
        }
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

package com.company.private_fz;

/*
* 1.提高程序的安全性,保护数据
* 2.隐藏代码的实现细节
* 3.统一接口
* 4.系统可维护性提高了
* */
public class Application {
    public static void main(String[] args) {
        Student_封装 s1 = new Student_封装();
        s1.setName("小明");
        System.out.println(s1.getName());

        s1.setAge(120);
        System.out.println(s1.getAge());
    }
}


面向对象08:继承

  • 继承的本质是对某一批类的抽象,从而实现对世界更好的建模
  • extends的意思是”扩展“。子类是父类的扩展。
  • JAVA中中只有单继承,没有多继承!
  • 继承是类与类之间的一种关系。除此之外,类与类之间的关系还有依赖‘,组合,聚合等。
  • 继承关系的两个类,一个为子类(派生类)。一个为父类(基类)。子类继承父类,使用关键字extends来表示。
  • 子类与父类之间,从意义上来讲应该具有”is a”关系
  • object类
  • super
  • 方法重写
package com.company.extends_jc;

//JAVA中所有的类默认继承object类  ctrl+H 查看类继承树
// 修饰符优先级顺序  public-protected-default-private
//父类属性用关键字private修饰,要提供get/set方法后,子类继承后方可调用
//Person 人:父类
public class Person {
    private int money=10_0000_0000;

    public int getMoney() {
        return money;
    }

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

    public void say(){
        System.out.println("说了一句话");
    }
}

package com.company.extends_jc;
//Student is 人   : 子类派生类
//子类继承父类,就会有父类的全部方法!
public class Student extends Person{

}

package com.company.extends_jc;

public class Teacher extends  Person{
}

package com.company.extends_jc;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.setMoney(10_0000_0000);
        System.out.println(student.getMoney());
        //System.out.println(student.money());
        // 继承的父类属性public修饰可直接.调用;父类属性private修饰通过set/get方法调用
        student.say();
    }
}


面向对象09:Super详解

  • super与this关键字
  • super代表父级,this指代当前类属性值中的
package com.company.super_this;

//JAVA中所有的类默认继承object类  ctrl+H 查看类继承树
// 修饰符优先级顺序  public-protected-default-private
//父类属性用关键字private修饰,要提供get/set方法后,子类继承后方可调用
//Person 人:父类
public class Person {
    public Person() {
        System.out.println("Person无参构造执行了");
    }

    protected  String name="李白";
    public void print(){
        System.out.println("person");
    }
}

package com.company.super_this;

//Student is 人   : 子类派生类
//子类继承父类,就会有父类的全部方法!
//ctrl+h  打开继承树

public class Student extends Person {
    public Student() {
        //隐藏代码:调用了父类的无参构造
        super();//调用父类的构造器,必须要在子类构造器的第一行
        System.out.println("Student无参构造执行了");
    }

    private String name="鲁班";
    public void print(){
        System.out.println("student");
    }
    public void test1(String name){
       print();//student
       this.print();//student
       super.print();//person

    }
    public void test(String name){
        System.out.println(name);//咬金
        System.out.println(this.name);//鲁班
        System.out.println(super.name);//李白

    }

}

package com.company.super_this;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        //student.test("咬金");
        //student.test1("韩信");

    }
}




super注意点:
    1.super调用父类的构造方法,必须在构造方法的第一个
    2.super必须只能出现在子类的方法或构造方法中!
    3.super和this不能同时调用构造方法!
vs  this:
    代表的对象不同:
        this:本身调用者这个对象
        super:代表父类对象的应用
    前提
        this:没有继承也可以使用
        super:只能在继承条件下才可以使用
    构造方法
        this();本类的构造
        super();父类的构造!

面向对象10:方法重写

package com.company.method_override;
//继承
public class A extends B{
    //Override重写
    @Override//注解:有功能的注解!
    public void test() {
        System.out.println("A=>test()");
    }
}


package com.company.method_override;
//重写就是方法的重写,和属性无关
public class B {
    public  void test(){
        System.out.println("B=>test()");
    }
}

package com.company.method_override;

public class Application {
    //静态的方法和非静态的方法区别很大!

       //静态方法: //方法的调用只和左边,定义的数据类型有关
       //非静态:重写
    public static void main(String[] args) {

        A a = new A();
        a.test();//A
        //父类的引用指向了子类
        B b = new A();
        b.test();//B

    }
}


重写:需要有继承关系,子类重写父类的方法!
    1.方法名必须相同
    2.参数列表必须相同
    3.修饰符:范围可以扩大但不能缩小:public>protected>default>private
    4.抛出的异常:范围,可以被缩小,但不能扩大:classNotFoundExceptoion-->Exception()
重写:子类的方法和父类必须要一致:方法体不同!
为什么要重写:
    1:父类的功能:子类不一定需要,或者不一定满足
    alter+insert override

面向对象11:什么是多态?

  • 多态
    • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
    • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
    • 多态存在的条件
      • 有继承关系
      • 子类重写父类方法
      • 父类引用指向子类对象
    • 注意:多态是方法的多态,属性没有多态性。
    • instanceof *(类型转换)引用类型
package com.company.polymorphism_dt;

public class Person {
    public void run(){
        System.out.println("run");
    }
}
/*
* 多态注意事项
* 1.多态是方法的多态,属性没有多态
* 2.父类和子类,有联系 类型转换异常 ClassCastException!
* 3.存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f=new Son();
*       不可重写的方法
*       1.static 方法,属于类,它不属于实例
*       2.final 常量;
*       3.private方法:
* */

package com.company.polymorphism_dt;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }

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

package com.company.polymorphism_dt;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Student();
        //new Person();

        //可以指向的引用类型就不确定了;父类的引用指向子类

        //Student 能调用的方法都是自己的或继承父类的!
        Student student = new Student();
        //Person 父类型,可以指向子类,但是不能调用子类独有的方法
        Person  student1 = new Student();
        Object student2= new Student();
        student.eat();

        //对象能执行那些方法,主要看对象左边的类型,和右边关系不大!
        ((Student)student1).eat();//子类重写了父类的方法,执行子类的方法体
    }
}


面向对象12:instanceof和类型转换?

package com.company.instanceof_leixingzh;

public class Person {
    public void run(){
        System.out.println("run");
    }
}

package com.company.instanceof_leixingzh;

public class Student extends Person {
    public void go(){
        System.out.println("go");
    }

}

package com.company.instanceof_leixingzh;

public class Teacher extends Person{
    public void go(){
        System.out.println("go");
    }
}

package com.company.instanceof_leixingzh;

public class Application {
    public static void main(String[] args) {
        //类型之间的转化:父 子

        //高
        Person obj = new Student();
        //obj.go(); 编译报错
        //student将这个对象转换为Student类型,就可以使用Student类型的方法了
        Student student=(Student) obj;
        student.go();
        //子类转换为父类。可能丢失自己本来的一些方法!
        Person person=student;
    }
}

/*
* 1.父类引用指向子类对象
* 2.把子类封装成父类,向上转型
* 3把父类转换为子类,向下转型;强制转换
* 4.方便方法的调用,减少重复的代码!简介
* 抽象 :封装  继承 多态
* */



/*
*  //Object>String
        //Object>Person>Teacher
        //Object>Person>Student
        Object object = new Student();

        //System.out.println(x instanceof y);//能不能编译通过
        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
        System.out.println("=======================================");
        Person person = new Student();
        System.out.println(person instanceof Student);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof Object);//true
        System.out.println(person instanceof Teacher);//false
        //System.out.println(person instanceof String);//编辑报错
        System.out.println("=======================================");
        Student student = new Student();
        System.out.println(student instanceof Student);//true
        System.out.println(student instanceof Person);//true
        System.out.println(student instanceof Object);//true
        //System.out.println(student instanceof Teacher);//编译报错
        //System.out.println(student instanceof String);//编辑报错
        System.out.println("=======================================");*/

面向对象13:static关键字详解?

package com.company.static_详解;

public class Student {
    //static详解
    private static int age;//静态的变量
    private double score;//非静态的变量

    //非静态方法
    public  void run(){
        go();//非静态方法可以调用静态方法里的东西
    }
    //静态方法
    public  static  void go(){
        //run();//编译报错,静态方法不可以调用非静态方法里的东西
    }


    public static void main(String[] args) {

        new Student().run();//非静态方法需要先new在通过.的方式来调用
        Student.go();//静态方法可以通过类名.的方法来调用
        go();//静态方法也可以在类中直接调用
        //run();编译报错,普通方法不可以直接调用



        /*Student student = new Student();
        System.out.println(student.score);//静态和非静态字段可以用对象.方式来调用
        System.out.println(student.age);//静态和非静态字段可以用对象.方式来调用

        System.out.println(Student.age);//对于静态的字段,可以通过类名.的方式调用
        //System.out.println(Student.score);//编译时会报错,对于非静态的字段,不能通过类名.的方式调用*/

    }
}

package com.company.static_详解;

public class Person {
/*    {
        //代码块(匿名代码块)
    }
    static {
        //静态代码块
    }*/
    //总结1:输出顺序: 静态代码块->匿名代码块-> 构造方法
    //   2:静态代码块只执行输出一次,可以用来赋值初始值

   //输出顺序2
    {
        System.out.println("匿名代码块");
    }
    //输出顺序1
    static {
        System.out.println("静态代码块");
    }
    //输出顺序3
    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person = new Person();   //静态代码块  匿名代码块  构造方法
        System.out.println("=====================");
        Person person1 = new Person();  //匿名代码块  构造方法
    }
}


package com.company.static_详解;
//静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;

public class Test {
    public static void main(String[] args) {
        System.out.println(Math.random());//输出一个随机数
        System.out.println(random());//避免每次用都要写,可以采取静态导入包的方式:静态导入包 import static java.lang.Math.random;
        System.out.println(PI);
    }

}


面向对象14:抽象类?

  • abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
  • 抽象类不能使用new 关键字创建对象,它是用来让子类继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
  • 子类继承抽象类,那么就必须要是是实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
package com.company.abstract_抽象类详解;
//abstract 修饰的类为抽象类:   类 extends:单继承  (接口可以多继承)
public abstract  class Action {

    //约束~~抽象类里的方法自己不需实现有人帮我们实现~~
    //abstract,抽象方法,只有方法名字,没有方法的实现
    public abstract void doSomething();

    //1.抽象类不能new ,只能靠子类去是实现它:约束!
    //2.抽象类中可以有普通方法~~
    //3.抽象方法必须在抽象类中,
    //抽象的抽象:约束~~

    //抽象类:将公有的东西提取出来供子类继承和实现,提高开发效率,提升程序扩展性
}


package com.company.abstract_抽象类详解;
//抽象类的所有方法,继承抽象类的子类就必须要是是实现抽象类没有实现的抽象方法
public class A extends Action {
    @Override
    public void doSomething() {

    }
}


package com.company.abstract_抽象类详解;

public class Application {
    public static void main(String[] args) {
        //Action action = new Action();//编译会报错'Action' is abstract; cannot be instantiated!!!抽象类不能new
    }
}


面向对象15:接口的定义与实现?

  • 接口

  • 普通类:只有具体实现

  • 抽象类:具体实现和规范(抽象方法)都有!

  • 接口:只有规范!自己无法写方法专业的约束!约束和是实现分离:面向接口编程~

  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…"的思想。如果你是天使,则必须能飞;如果你是美女,则必须爱我;如果你是汽车,则必须能跑;如果你是好人,则必须干掉坏人;如果你是坏人人,则必须欺负坏人。

  • 接口的本质是契约,就像我们人间的法律一样。制定好后大家来遵守。

  • oo的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),因为设计模式所研究的,实际上就是如何合理的去抽象。

  • 声明类的关键字是class,声明接口的关键字是interface

package com.company.interface_接口;
//interface 定义的关键字
public interface UserService {
    //接口里所有的定义都是抽象的 public abstract
     void add(String name);
     void delete(String name);
     void update(String name);
     void query(String name);
}

package com.company.interface_接口;

public interface TimerService {
    void timer();
}

package com.company.interface_接口;

//抽象类:extends
//类 可以实现接口 implement 接口
//实现了接口的类,就必须要重写接口里的抽象方法

//多继承~~Java中类只能单继承,但是可以通过接口实现多继承
public class UserServiceImpl implements UserService,TimerService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}

接口作用:
1.接口是一种约束,规范
2.接口里定义了一些方法,让不同的人来实现
3.抽象方法的定义:public abstract
4.接口中常量的定义:public static final
5.接口不能被实例化~,接口中没有构造方法
6.接口中使用implements关键字可以实现多个接口,逗号隔开
7.实现类实现接口必须要重写接口里的抽象方法

面向对象16:N种内部类?

  • 内部类
    • 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就成为内部类,而A类相对B类来说就是外部类了。
    • 1.成员内部类
    • 2.静态内部类
    • 3.局部内部类
    • 4.匿名内部类
package com.company.moreinner_N种内部类;

public class Outer {
    private int id=100;
    private void out(){
        //局部内部类 此类出现在类的方法中
        class inner1{
            public void in1(){

            }
        }



        System.out.println("这是外部类方法");
    }
/*    //静态内部类
       public  static  class  Inner{
        public void in(){
            System.out.println("这是静态内部类方法");
        }

        //通过内部类方法可以获取外部类的私有属性
        public void getId(){
            System.out.println(id);
        }
    }*/
    class Inner{
        public void in(){
            System.out.println("这是内部类方法");
        }

        //通过内部类方法可以获取外部类的私有属性
        public void getId(){
            System.out.println(id);
        }
    }
}

//一个java类中可以有多个class类,但是只能有一个public class
//匿名内部类 出现在一个java文件中class同级位置
class A{
    public static void main(String[] args) {

    }
}



package com.company.moreinner_N种内部类;

public class Test {
    public static void main(String[] args) {
        new Apple().eat();//匿名内部类的调用,不需要将对象进行实例化保存到变量中就可以调方法

        UserService userService= new UserService(){
            @Override
            public void go() {

            }
        };
    }
}


//匿名内部类
class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface  UserService{
    void go();
}



package com.company.moreinner_N种内部类;

public class Application {
    public static void main(String[] args) {
        //new 外部类
        Outer outer = new Outer();
        //通过外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getId();
    }
}


面向对象17:Error和Exception

  • 什么是异常

    • 实际工作中,遇到的情况不可能是非常完美的。比如,你写的某个模块,用户输入不一定符合你的要求,你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们程序在跑着,内村或硬盘已经满了。等等
    • 软件程序在运行中,非常可能遇到上述这些问题,我们叫异常,Exception。这些例外情况叫做异常,怎么让我们的程序做出合理的处理,而不至于程序崩溃。
    • 异常指程序运行中出现的不期而至的各种情况,eg:文件找不到,网络连接失败,非法参数等。
    • 异常发生在程序运行期间,影响了程序正常的执行流程。
  • 简单分类

    • 要理解java异常处理是如何工作的,需要掌握以下三种类型的异常:
    • 检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。
    • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
    • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
  • 异常体系结构

    • java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

    • 在Java API 中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。

    • Throwable

      • Error

        • VirtullMachineError
          • StackOverFlowError
          • OutOfMemoryError
        • AWTError
      • Exception

        • IOException

          • EOFException
          • FileNotFoundException
        • RuntimeException

          • ArrithmeticException

          • MissingResourceException

          • ClassNotFoundException

          • NullPointerException

          • IllegalArguementException

          • ArrayIndexOutOfBoundsException

          • UnknowTypeException

  • Error

    • Error类对象由Java虚拟机生成并抛出,大多数错误与代码与代码编写者所执行的操作无关。
    • java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一定会选择线程终止;
    • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError),连接错误,(LinkageError)。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不可出现的状况。
  • Exception

    • 在Exception分支中有一个重要的子类RuntimeException(运行时异常)
      • ArrayIndexOutOfBoundsException(数组下标越界)
      • NullPointerException(空指针异常)
      • AirithmeticException(算术运算异常)
      • MissingResourceException(资源丢失异常)
      • ClassNotFoundException(找不到类异常),这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
    • 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
    • Error和Exception区别:Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且程序中应该尽可能的去处理这些异常。

面向对象18:捕获和抛出异常

  • 异常处理机制
    • 抛出异常
    • 捕获异常
  • 异常处理五个关键字
    • try、catch、finally、throw、throws
package com.company.error_exception;

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

        //假设要捕获多个异常,范围要从小到大
       try {//try 监控区域
           System.out.println(a/b);
       }catch (Error error){//catch(想要捕获的异常类型!) 捕获异常
           System.out.println("error");
       }catch (Exception exception){
           System.out.println("exception");
       }catch (Throwable throwable){
           System.out.println("throwable");
       }finally {//处理善后工作
           System.out.println("finally");
       }

       //finally 可以不要finally,假设IO,资源,关闭!
    }


}

package com.company.error_exception;

public class A {
    public static void main(String[] args) {
        new A().a();//内存溢出  error
        System.out.println(10/0); //java.lang.ArithmeticException: / by zero

    }


    public void a(){
        b();
    }
    public void b(){
        a();
    }
}

package com.company.error_exception;
//自动生成需要捕获异常的代码选中后 快捷键:ctrl+alt+t
public class Test2 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            System.exit(1);
            e.printStackTrace();//打印错误的栈信息
        } finally {
        }
    }
}

package com.company.error_exception;

public class Test3 {
    public static void main(String[] args) {
        try {
            new Test3().sum(1,0);
        } catch (ArithmeticException exception) {
            exception.printStackTrace();
        } finally {
        }
    }

    //假设这方法中,处理不了这个异常,可以在方法上抛出异常
    public void sum(int a,int b) throws ArithmeticException{
        if (b==0){//throw  throws
            throw new ArithmeticException();//主动的抛出异常,一般在方法中使用
        }
    }
}


面向对象19:自定义异常及经验小结

  • 自定义异常
    • 使用java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常,只需继承Exception类即可。
    • 在java中使用自定义异常类,大体可分为以下几个步骤:
      • 1.创建自定义异常类。
      • 2.在方法中通过throw关键字抛出异常对象
      • 3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
      • 在出现异常方法的调用者中捕获并处理异常。
package com.company.exception_自定义异常;
//自定义异常类
public class MyException extends Exception{
    //传递数字>10
    private int detail;

    public MyException( int a) {
        this.detail = a;
    }
    //toString:异常的打印信息

    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}

package com.company.exception_自定义异常;

public class Test {
    static void test(int a) throws MyException {
        System.out.println("传递的参数为:"+a);
        if (a > 10) {
            throw new MyException(a);//抛出
        }
        System.out.println("ok");
    }


    public static void main(String[] args) {
        try {
            test(20);
        } catch (MyException e) {
            System.out.println("MyException="+e);
        } finally {
        }
    }
}

实际应用中的经验总结
1.处理运行异常时,采用逻辑去合理规避同时辅助try-catch处理
2.在多重catch块后面,可以加一个catchException)来处理可能被遗漏的异常
3.对于不确定的代码,也可以加try-catch,处理潜在的异常
4.尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
5.具体如何处理异常,要根据不同的业务需求和异常类型来决定
6.尽量添加finally语句块去释放暂用的资源


or和Exception区别:Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且程序中应该尽可能的去处理这些异常。

面向对象18:捕获和抛出异常

  • 异常处理机制
    • 抛出异常
    • 捕获异常
  • 异常处理五个关键字
    • try、catch、finally、throw、throws
package com.company.error_exception;

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

        //假设要捕获多个异常,范围要从小到大
       try {//try 监控区域
           System.out.println(a/b);
       }catch (Error error){//catch(想要捕获的异常类型!) 捕获异常
           System.out.println("error");
       }catch (Exception exception){
           System.out.println("exception");
       }catch (Throwable throwable){
           System.out.println("throwable");
       }finally {//处理善后工作
           System.out.println("finally");
       }

       //finally 可以不要finally,假设IO,资源,关闭!
    }


}

package com.company.error_exception;

public class A {
    public static void main(String[] args) {
        new A().a();//内存溢出  error
        System.out.println(10/0); //java.lang.ArithmeticException: / by zero

    }


    public void a(){
        b();
    }
    public void b(){
        a();
    }
}

package com.company.error_exception;
//自动生成需要捕获异常的代码选中后 快捷键:ctrl+alt+t
public class Test2 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            System.exit(1);
            e.printStackTrace();//打印错误的栈信息
        } finally {
        }
    }
}

package com.company.error_exception;

public class Test3 {
    public static void main(String[] args) {
        try {
            new Test3().sum(1,0);
        } catch (ArithmeticException exception) {
            exception.printStackTrace();
        } finally {
        }
    }

    //假设这方法中,处理不了这个异常,可以在方法上抛出异常
    public void sum(int a,int b) throws ArithmeticException{
        if (b==0){//throw  throws
            throw new ArithmeticException();//主动的抛出异常,一般在方法中使用
        }
    }
}


面向对象19:自定义异常及经验小结

  • 自定义异常
    • 使用java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常,只需继承Exception类即可。
    • 在java中使用自定义异常类,大体可分为以下几个步骤:
      • 1.创建自定义异常类。
      • 2.在方法中通过throw关键字抛出异常对象
      • 3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
      • 在出现异常方法的调用者中捕获并处理异常。
package com.company.exception_自定义异常;
//自定义异常类
public class MyException extends Exception{
    //传递数字>10
    private int detail;

    public MyException( int a) {
        this.detail = a;
    }
    //toString:异常的打印信息

    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}

package com.company.exception_自定义异常;

public class Test {
    static void test(int a) throws MyException {
        System.out.println("传递的参数为:"+a);
        if (a > 10) {
            throw new MyException(a);//抛出
        }
        System.out.println("ok");
    }


    public static void main(String[] args) {
        try {
            test(20);
        } catch (MyException e) {
            System.out.println("MyException="+e);
        } finally {
        }
    }
}

实际应用中的经验总结
1.处理运行异常时,采用逻辑去合理规避同时辅助try-catch处理
2.在多重catch块后面,可以加一个catchException)来处理可能被遗漏的异常
3.对于不确定的代码,也可以加try-catch,处理潜在的异常
4.尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
5.具体如何处理异常,要根据不同的业务需求和异常类型来决定
6.尽量添加finally语句块去释放暂用的资源


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值