面向对象编程

Hello,World!

  1. 随便新建一个文件夹,存放代码

  2. 新建一个Java文件

    • 文件后缀名为.java
    • Hello.java
  3. 编写代码

    public class Hello{
        public static void main(String[] args){
            System.out.print("Hello,World");
        }
    }
    
  4. 编译javac java文件,会生成一个class文件

  5. 运行class文件,Java class文件

image-20250219142041679

可能遇到的问题

  1. 每个单词的大小不能出现问题,Java的大小写是敏感的
  2. 尽量使用英文
  3. 文件名和类名必须保证一致,并且首字母大写
  4. 符号使用中文

Java基础语法

注释

// 单行注释

/**/多行注释

标识符

关键字

起名不可与关键字重复

  • 所有的标识符都应该以字母(A-Z或者a-z),美元$,或者下划线(_)开始

  • 首字母之后可以说是任意字符组合

  • 不能使用关键字作为变量名或方法名

  • 标识符是大小写敏感的

    public class HelloWorld {
        public static void main(String[] args) {
    
            System.out.println("Hello,World!");
            String student ="tyz";
            String 认真学习的人 ="tyz";
            System.out.println(认真学习的人);
        }
        //单行注释,输出一个HelloWorld!
        //多行注释   /*   注释   */
            /*
            多
            行
            注
            释
            */
        //JavaDoc:文档注释   /**   */
        /**
         * @Description HelloWorld
         * @Author tyz
         */
    }
    
    

数据类型

  • 强类型语言

    要求变量的使用严格符合规定,所有的变量都必须先定义后才能使用。

  • 弱类型语言

    Java的数据类型分为两大类

    基本类型

    • 数值类型

      • 整数类型:byte,short,int,long
      • 浮点类型:float,double
      • 字符类型:char
    • boolean类型:只要true和false两个

       //八大基本数据类型
      
              //整数
              int num1=10;  //最常用
              byte num2=20;
              short num3=30;
              long num4=40L;   //long类型要在数字后面加个L用于区分
      
              //小数:浮点型
              float num5=50.1F;//float类型要在数字后面加个F用于区分
              double num6=3.1415926;
      
              //字符
              char name ='田';
              //字符串,String不是关键字,是类
              //String namea="田耀宗";
      
              //布尔值:是非
              boolean flag=true;
              //boolean flag=false;
      

    引用类型(除基本类型以外)

  • 接口

  • 数组

数据类型扩展

 //整数拓展 进制, 二进制  十进制 八进制0 十六进制0x(0~9 A~F)

        //----------------------------------------
        //浮点数拓展? 银行业务怎么展示?钱
        //BigDecimal 数学工具类

        //-------------------------------------------
        //float  有限 离散 舍入误差 大约 接近但不等于
        //double
        //最好完全使用浮点数进行比较
        //最好完全使用浮点数进行比较
        //最好完全使用浮点数进行比较
        //最好完全使用浮点数进行比较

        float f=0.1f;//0.1
        double d=1.0/10;//0.1
        System.out.println(f==d);//输出为false
        System.out.println(f);
        System.out.println(d);
        float d1=23333333333333333F;
        float d2=d1+1;
        System.out.println(d1==d2);//输出为true
//----------------------------------------------
        //字符拓展
        char c1='a';
        char c2='田';
        System.out.println( c1);
        System.out.println((int)c1);//强制换行
        System.out.println(c2);
        System.out.println((int)c2);//强制换行
//所有的字符本质还是数字
        //编码 Unicode 表:97=a 3000=田   占2字节
        //U000 UFFF
        char c3='\u0061';
        System.out.println(c3);//a
        //------------------------
        //转义字符
        //\t   制表符
        //\n   换行
        //---------------
        //对象 从内存分析
        //----------------------------------
        //布尔值扩展
        boolean flag=true;
        if (flag==true){//新手
            //if(flag){}老手,两者意思相同

类型转换

int i = 128;
        byte b=(byte) i;//内存溢出
        //强制转换   (类名)变量名  高到低
        //自动转换    低到高
        double d=i;
        System.out.println(i);
        System.out.println(b);
        System.out.println(d);
        /*
        注意点
        1.不能对布尔值进行转换
        2.不能把对象类型转换为不相干的类型
        3.在把高容量转换为低容量的时候,强制转换
        4,在转换的时候可能存在内存溢出或者精度问题
         */
        System.out.println((int)23.7);//输出为23
        //===================================
        char c='a';
        int f=c+1;
        System.out.println(f);//输出为98(a=97)
        System.out.println((char) f);//输出为b

类型转换的常见问题

public static void main(String[] args) {
    //操作比较大的数的时候,注意溢出问题
    //JDK7新特性,数字之间可以用下划线分割
    int money=10_0000_0000;
    int years=20;
    int total=money*years;//输出为-1474836480,计算的时候溢出了
    long total2=money*years;//输出还是为-14..,默认是int,转换之前已经存在问题

    long total3=money*((long)years);//先把一个数转换为long类型
    System.out.println(total);
    System.out.println(total2);
    System.out.println(total3);//输出为20亿
}

变量

数据类型 变量名 = 值;

  • 每个变量都必须声明其类型
  • 要素包括变量名,变量类型和作用域

注意

  • 每个变量都有类型,类型可以是基本类型,可以是引用类型。

  • 变量名必须是合法的标识符。

  • 变量声明必须是一条完整的语句,因此每一个声明都必须以分号结束。

变量的作用域

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

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


  //属性:变量

  //实例变量:从属于对象(这个类);如果不自行初始化,会变成这个类型的默认值
  //布尔值:默认是false
  //除了基本变量类型,其余的默认值都是null。
  String name;
  int age;

  //main方法
  public static void main(String[] args) {
      //局部变量;必须声明和初始化值,只在这一种方法中有效
      int i=10;
      System.out.println(i);

      //变量类型  变量名字=new Demo08();
      Demo08变量作用域 demo08变量作用域=new Demo08变量作用域();
      System.out.println(demo08变量作用域.age);
      System.out.println(demo08变量作用域.name);

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

  //其他方法
  public void add(){

  }
}

变量的命名规范

  • 所有变量,方法,类名:见名知意
  • 类成员变量:首字母小写和驼峰原则:monthSalary除了第一个单词意外,后面的单词首字母大写(lastName)
  • 局部变量:首字母小写和驼峰原则
  • 常量:大写字母和下划线MAX_VALUE
  • 类名:首字母大写和驼峰原则:Man,GoodMan
  • 方法名:首字母小写和驼峰原则:run(),runRun()

常量

常量:初始化后不能在改变的值!不会变动的值。

final 常量名=值;

常量名一般使用大写字符

public class Demo09常量 {
    //修饰符,不存在先后顺序
    static final double PI=3.14;

    public static void main(String[] args) {

    }
}

运算符

算术运算符:+-*%(余),++,--

package operator;

public class Demo01算数运算符 {
    public static void main(String[] args) {
        //二元运算符
        //ctrl+D复制当前行到下一行
        int a=10;
        int b=20;
        int c=30;
        int d=40;
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println(a/(double)b);
         long e=123123123123L;
         int f=123;
         short g=10;
         byte h=8;
         double i=3;
        System.out.println("===============================");
        System.out.println(e+f+g+h);//输出为Long
        System.out.println(f+g+h);//输出为int
        System.out.println(g+h);//输出为int
        System.out.println(i+g);
    }
}

赋值:=

关系:>,<,<=,>=,==(等于),!=(不等于),instanceof

package operator;

public class Deom02关系运算符 {
    public static void main(String[] args) {
        //关系运算符返回结果
        int a=10;
        int b=20;
        int c=21;

        System.out.println(c%a);

        System.out.println(a>b);
        System.out.println(a<b);
        System.out.println(a==b);
        System.out.println(a!=b);
    }
}

逻辑:&&与 ||或, !非

package operator;

public class Demo04逻辑运算符 {
    public static void main(String[] args) {
        boolean a=true;
        boolean b=false;
        System.out.println("a&&b:"+(a&&b));//false
        System.out.println("a||b:"+(a||b));//true
        System.out.println("!(a&&b):"+!(a&&b));//true

        //短路运算
        System.out.println("a&&b:"+(b&&a));//a不进行运算
        int c=5;
        boolean d=(c<4)&&(c++<4);//由于c<4是false,c++不进行运算
        System.out.println(d);//输出为false
        System.out.println(c);//输出为5,没有自增

    }
}

位运算符

package operator;

public class Demo05位运算 {
    public static void main(String[] args) {
        /*
        A  =0011 1100
        B  =0000 1101
------------------------------------------------
        A&B=0000 1100 两者相同输出1,不同0
        A/B=0011 1101 两者有1则输出1
        A^B=0011 0001 亦或:相同取0,不同取1
        ~B =1111 0010 取反:与原来相反

        2*8=16   2*2*2*2
        效率极高!!!
        <<左移 相当于*2
        >>右移 相当于/2
         */
        System.out.println(2<<3);
    }
}

条件

package operator;

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

        int score=80;
        String type=score<60?"不及格":"及格";
        System.out.println(type);//及格
    }
}

扩展赋值

package operator;

public class Demo06扩展赋值运算符 {
    public static void main(String[] args) {
        int a=10;
        int b=20;

        a+=b;//a=a+b
        a-=b;//a=a-b

        //字符串连接符 +  如果出现String出现,那么后面其他操作数都转化为string类型进行链接
        System.out.println(a+b);//30
        System.out.println(""+a+b);//1020
        System.out.println(a+b+"");//30


    }
}

++a先自增

a++后自增

package operator;

public class Deom03自增自减 {
    public static void main(String[] args) {
        //++自加   --自减  一元运算符
        int a=3;
        int b=a++;//执行这段代码后,先给b赋值,a再自增

        //a=a+1
        System.out.println(a);

        int c=++a;//执行这段代码前,先给a自增,再给c赋值

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        //幂运算
        double pow = Math.pow(2, 3);
        System.out.println(pow);
    }
}

包机制

本质就是一个文件加

把语句的语法格式:

package pkg1[.pkg2[.pkg3...]];

  • 一般利用公司域名倒置作为包名;
  • 为了能够使用某一个包的成员,我们需要导入该包,使用import语句

import package1.[.package2...].(classname|*);

狂神说包机制

import com.kuang.bacs.*;导入这个包下所有的类!

JavaDOC

javadoc命令是用来生成自己API文档的

参数信息

  • @author 作者名
  • @version版本号
  • @since 指明需要最早使用的jdk版本
  • @param 参数名
  • @return返回值情况
  • @throws异常抛出情况

Java流程控制

Scanner

scanner就是用户与电脑(程序)互动

我们可以通过Scanner类来获取用户的输入

基本语法

Scanner s=new Scanner(System.in);

变量类型 变量名=scanner.Next变量类型;

scanner.close();

凡是属于IO流(输入输出流)的类如果不关闭会一直占用资源,要养成好习惯用完就关掉

通过Scanner类的next()与nextLine()方法获取输入的字符串

使用hasNext()与hasNextLine()判断是否还有输入的数据

next()

  • 一定要读取到有效字符后才可以结束输出

  • 遇到空格后面的字符将去掉

  • package scanner;
    
    import java.util.Scanner;
    
    public class Demo01 {
        public static void main(String[] args) {
            //创建一个扫描器对象,用于接收键盘数据
            Scanner scanner = new Scanner(System.in);
            System.out.println("使用next方式接收:");
    
            //判断用户有没有输入字符串
            if (scanner.hasNext()==true){
    
                //使用next方式接收用户的输入
                String str=scanner.next();//程序会等待用户输入完毕
                System.out.println("输出的内容为:"+str);
            }
    
            //凡是属于IO流(输入输出流)的类如果不关闭会一直占用资源,要养成好习惯用完就关掉
            scanner.close();
        }
    }
    
    

nextLine()

  • 可以有空白

  • package scanner;
    
    import java.util.Scanner;
    
    public class Demo02 {
        public static void main(String[] args) {
    
            //从键盘接收数据
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("使用nextLine方式接收:");
    
    
            //判断是否还有输入
            if (scanner.hasNextLine()==true){
                String str = scanner.nextLine();//等待用户输入
                System.out.println("输出的内容为:"+str);
            }
            scanner.close();
        }
    }
    
    

    也可以不用if语句

    package scanner;
    
    import java.util.Scanner;
    
    public class Demo03 {
        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也可以有其他用法,可以用基本数据类型

package scanner;

import java.util.Scanner;

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

        //从键盘接收数据
        int i=0;
        float f=0.0f;

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

        //if语句
        if (scanner.hasNextInt()==true){
            i = scanner.nextInt();
            System.out.println("整数数据:"+i);
        }
        else{
            System.out.println("输入的不是整数数据!");
        }
//=============================================================

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

        //if语句
        if (scanner.hasNextFloat()==true){
            f = scanner.nextFloat();
            System.out.println("小数数据:"+f);
        }
        else{
            System.out.println("输入的不是小数数据!");
        }


        scanner.close();
    }
}

package scanner;

import java.util.Scanner;

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

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


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

        //通过循环判断是否还有输入,并且在里面对每一次进行求和和统计

        while (scanner.hasNextDouble()==true){
            double x = scanner.nextDouble();
            //m=m+1
            m=++m;
            sum=sum+x;
            System.out.println("当前输入了第"+m+"个数据,当前结果sum="+sum);

        }
        System.out.println(m+"个数和为:"+sum);
        System.out.println(m+"个数的平均值是::"+(sum/m));



        scanner.close();
    }
}

顺序结构

java的基本结构

选择结构

if单选择结构

package struct;

import java.util.Scanner;

public class Demo01if单选 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个内容:");
        String s = scanner.nextLine();

        //equals判断字符串是否相等
        if (s.equals("Hello")){
            System.out.println(s);
        }
        System.out.println("End");


        scanner.close();
    }
}

if双选择结构

package struct;

import java.util.Scanner;

public class Demo02if双选择 {
    public static void main(String[] args) {
        //考试分数大于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多选择结构

if(){

}else of(){

}else of(){

}else of(){

.....

}else

}

package struct;

import java.util.Scanner;

public class Demo03多选择结构 {
    public static void main(String[] args) {
        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<70&&score>=60) {
            System.out.println("D级");
        }else if (score<60&&score>=0) {
            System.out.println("不及格");
        }else {
            System.out.println("成绩不合法");
        }





        scanner.close();

    }
}

switch多选择结构

反编译,把class文件反编译为java文件

点击项目结构,打开项目编译输出的路径,找到class文件,复制到idea文件夹中,从idea中打开文件夹

package struct;

public class Demo02switch {
    public static void main(String[] args) {
        String name="田";
//字符的本质还是数字


//反编译 java编译---class(字节码文件)---反编译

        switch (name){
            case "tyz":
                System.out.println("tyz");
                break;
            case"田":
                System.out.println("田");
                break;
            default:
                System.out.println("弄啥嘞?");
        }


    }
}

循环结构

while循环

避免死循环

计算1加到100

package struct;

public class Demo02while循环 {
    public static void main(String[] args) {
        //计算1+2+3.。。。+100=?
        int i=0;
        int sum=0;

        while (i<=100){
            sum=sum+i;
            i++;
        }

        System.out.println(sum);
    }
}

do...while循环

至少会执行一次

package struct;

public class Demo02dowhile循环 {
    public static void main(String[] args) {
        int a=0;
        while (a<0){
            System.out.println(a);//不输出
            a++;
        }

        System.out.println("==================================");

        do {
            System.out.println(a);//输出0
            a++;
        }while (a<0);
    }
}

for循环(最有效最灵活)

for(初始化值;布尔值;更新值){

//代码

}

快捷键:条件判断.for

计算0~100之间奇数和偶数的和

package struct;

public class for循环Demo02 {
    public static void main(String[] args) {
        //0~100之间奇数和偶数和
        int oddSum=0;//奇数和
        int evenSum=0;//偶数和

        for (int i = 0; i <=100; i++) {
            if (i%2!=0){
                oddSum+=i;
            }else {
                evenSum+=i;
            }
        }

        System.out.println("奇数的和:"+oddSum);
        System.out.println("偶数的和:"+evenSum);

    }
}

for循环1~1000之间能被5整除的数,并且每行输出3个

package struct;

public class for循环Demo03 {
    public static void main(String[] args) {
      //1~1000能被5整除的数  ,并且每行输出三个

        for (int i = 0; i <= 1000; i++) {
            if (i%5==0){
                System.out.print(i+"\t");//转义字符
            }
            if(i%(5*3)==0){//换行
                System.out.println();
                //System.out.println("\n");
                }
        }

        //println输出完换行
        //print输出完不换行
    }
}

for循环的九九乘法表

package struct;

public class for循环打印99乘法表Demo04 {
    public static void main(String[] args) {

        //去掉重复项,用i<=j判断语句
        for (int j= 1; j <= 9; j++) {
            for (int i = 1; i <=j; i++) {
                System.out.print(i+"*"+j+"="+(i*j)+"\t");

            }
            System.out.println();
            
        }
    }
}

增强for循环

package struct;

public class for循环增强for循环Demo05 {
    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);
        }
    }
}

break,continue

break在任何循环语句的主体部分,都可以用break控制循环结束

break用于强行退出循环,不执行循环中剩余的语句(break语句也在switch语句中使用)

continue语句用与循环语句中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定

break

package struct;

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

continue

package struct;

public class continueDemo01 {
    public static void main(String[] args) {
        int i=0;
        while (i<100){
            i++;
            if (i%10==0){
                System.out.println();
                continue;
            }
            System.out.println(i);//到10的倍数输出空格
        }
    }
}

练习打印三角形

package struct;

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

        }

    }
}

Java的方法

保持原子性:一个方法只完成一个功能,有利于后期的扩展

  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或者对象中
  • 方法在程序中被创建,在其他地方被引用
package 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;
    }

    //调用for循环
    public static void test(){
//1~1000能被5整除的数  ,并且每行输出三个

        for (int i = 0; i <= 1000; i++) {
            if (i%5==0){
                System.out.print(i+"\t");//转义字符
            }
            if(i%(5*3)==0){//换行
                System.out.println();
                //System.out.println("\n");
            }
        }
    }


}

方法的定义

一段用来完成特定功能的代码片段

修饰符 返回值类型 方法名(参数类型 参数名){

。。。

方法体

。。。

return 返回值;

}

  • 修饰符:是可选的

  • 返回值类型:方法可能返回值,输出一句话返回值为void(为空)

  • 方法名:方法的实际名字(首字母小写,驼峰)

  • 参数类型:像是一个占位符,可选,也可以不包含任何参数

    • 形式参数:在方法被调用时用于接收外界输入的数据
    • 实参:调用方法实际传给方法的数据
  • 方法体:方法里的具体语句,定义该方法的功能

package method;

public class Demo02 {
    public static void main(String[] args) {
        //int max = max(10, 20);

        System.out.println(max(10,20));
    }

    //比大小的方法
    public static int max(int i,int j){
        int result=0;
        if (i>j){
            result=i;
        }else if (i==j){
            System.out.println("一样大");
            return 0;//return有终止方法的意思
        }else {
            result=j;
        }
        return result;
    }
}

方法的调用

如果返回值是void,那么返回值一定是一条语句

当方法返回一个值的时候,方法调用通常被当作一个值

方法的重载

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

规则:

  • 方法名称必须相同
  • 参数列表必须不同(个数,类型,参数排列顺序)

命令行传参

运行程序的时候再传给程序数据,需要靠传递命令行参数给main()函数实现。

可变参数

  • 在方法声明中,在指定参数类型后加一个”...“
  • 一个方法只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数必须在他之前声明

递归

边界条件

前阶段

返回阶段

package method;

public class Demo03 {
    //阶乘
    public static void main(String[] args) {
        System.out.println(f(5));
    }

    public static int f(int n){
        if (n==1){
            return 1;//边界条件
        }else {//前阶段
            return n*f(n-1);//返回阶段
        }
    }
}

自己调用自己

递归结构包括两个部分

  • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环
  • 递归体:什么时候需要调用自身方法

计算器的编程(scanner,switch)

package method;

import java.util.Scanner;

public class 计算器Demo4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数字");
        double num1 = scanner.nextInt();

        System.out.println("请输入运算符");
        String operator1 = scanner.next();

        System.out.println("请输入第二个数字");
        double num2 = scanner.nextInt();

        System.out.println("请输入运算符");
        String operator2 = scanner.next();

        System.out.println("请输入第三个数字");
        double num3 = scanner.nextInt();

        double result1=0;
        double result2=0;


        switch (operator1){
            case "+":
                result1=num1+num2;
                break;
            case "-":
                result1=num1-num2;
                break;
            case "*":
                result1=num1*num2;
                break;
            case "/":
                result1=num1/num2;
                break;
            default:

                System.out.println("您的输入不合法!");
                return ;
        }
        //==============================================
        switch (operator2){
            case "+":
                result2=result1+num3;
                break;
            case "-":
                result2=result1-num3;
                break;
            case "*":
                result2=result1*num3;
                break;
            case "/":
                result2=result1/num3;
                break;
            default:

                System.out.println("您的输入不合法!");
                return ;
        }
        System.out.println("结果是:"+num1+operator1+num2+operator2+num3+"="+result2);
scanner.close();
    }
}

Java数组

定义

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

声明创建

数据类型[] 变量名=new 数据类型[数组大小];

数组长度:arrays.length

package struct;

public class for循环增强for循环Demo05 {
    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);
        }
    }
}

三种初始化

  • 静态初始化

  • 动态初始化

  • 数组的默认初始化

    数组是引用类型,它的元素相当于类的实例变量。因此数组一经分配空间(int[] a=new int[10];),其中每个元素也被按照实例变量被隐式初始化

package array;

public class arrayDemo02 {
    public static void main(String[] args) {
        //静态初始化:创建加赋值
        int[] a={1,2,3,4,5,6,7,8};

        System.out.println(a[0]);//输出1

        //动态初始化:包含默认初始化
        int[] b=new int[10];
        b[0]=10;
        System.out.println(b[0]);
  
 

数组的四个特点

  • 其长度是确定的,数组一旦被创建,它的大小就是不可改变的
  • 必须是相同类型
  • 可以是任意数据类型,包括基本类型和引用类型
  • 属于引用类型,数组可以看成是对象,数组中的每个元素都相当于该对象的成员变量。数组本身就是对象,Java中的对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组边界:合法区间[0,length-1]

越界:ArrayIndexOutOfBoundsException:数组下标越界

数组的使用

  • 普通的for循环
package array;

public class arrayDemo03for循环 {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        //打印全部的数组元素

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

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

        //找最大数
        int max=array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] >=max){
                max=array[i];
            }
        }
        System.out.println("最大值为:"+max);
    }
}
  • for-Each循环

  • 数组作方法入参

  • 数组作为返回值

package array;

public class arrayDemo04forEach循环 {
    public static void main(String[] args) {
        int[] arrays = {1, 2, 3, 4, 5};

        //没有下标 array为array[]数组中的元素
        for (int array : arrays) {
            System.out.println(array);

        }
        System.out.print("数组元素为:");
            printArray(arrays);//打印数组元素
        System.out.println('\n');

        System.out.print("数组元素反转为:");
        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<result.length; i++,j--) {
            //result[]=arrays[i];
            result[j]=arrays[i];

        }


        return result;

    }
}

多维数组

package array;

public class arrayDemo05多维数组 {
    public static void main(String[] args) {
        //定义了一个四行两列的数组
        /*
        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}};

        printArray(array[0]);
        System.out.println('\n');
        System.out.println(array[0][0]);
        System.out.println(array[0][1]);

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.println(array[i][j]);//输出数组的元素
            }
        }
    }


//创建一个方法,输出数组元素
    public static void printArray(int[] arrays) {
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+"");
        }
    }
}

Arrays类

给数组赋值:通过fill方法

给数组排序:通过sort,按升序

比较数组:equals比较数组中元素值是否相等

查找数组元素:通过binarySearch能对排序号的数组进行二分查找法操作

package array;

import java.util.Arrays;

public class arrayDemo06类的使用 {
    public static void main(String[] args) {
        int[]a={1,2,3,4,1231,434,5433,64363};
        //System.out.println(a);输出为[I@1b6d3586

        //打印数组元素Arrays.toString
        System.out.println(Arrays.toString(a));

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

        Arrays.fill(a,2,4,0);//数组填充,2~4填充为0
        System.out.println(Arrays.#ing(a));

    }
}

面向对象编程

方法

break和return的区别

break:跳出switch,结束循环

return:结束方法,返回一个值

package com.oop;

import java.io.IOException;

//Demo01就是一个类
public class Demo01 {

    //main方法
    public static void main(String[] args) {

    }
/*
修饰符 返回值类型 方法名(。。。){
       方法体
       return 返回值;
       }
 */
    //return结束方法,返回一个结果!
    public String sayHello(){
        return "Hello,world";
    }

    public void hello(){
        return;
    }

    public int max(int a,int b){
        return a>b?a:b;//三元运算符
    }

    public void readFile(String file)throws IOException{//抛出异常

    }
}

调用

package com.oop;

public class Demo02 {
    public static void main(String[] args) {
        //实例化这个类 new
        //对象类型  对象名=对象值
        Student student = new Student();

        student.say();
    }

    //static和类一起加载的
    public static void a(){

    }

    //类实例化之后才存在
    public void b(){}
}

实参形参

package com.oop;

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

值传递

package com.oop;

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

        charge(a);
        System.out.println(a);//1
    }

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

引用传递

package com.oop;

//引用传递:传递一个对象,本质还是值传递
public class Demo05 {
    public static void main(String[] args) {
        Perosn perosn = new Perosn();
        System.out.println(perosn.name);//输出为null

        Demo05.charge(perosn);
        System.out.println(perosn.name);

    }
    public static void charge(Perosn perosn ){
        //perosn是一个对象,指向的是————>Perosn perosn = new Perosn();这是一个具体的人,可以改变属性
        perosn.name="田耀宗";
    }

}
//定义了一个Perosn类,有一个属性:name
class Perosn{
    String name;//null
}

创建和初始化对象

使用new关键字

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

package com.oop.Demo02;

//学生类
public class Student {
    //属性:字段
    String name;//null
    int age;//0


    //方法
    public void study(){
        System.out.println(this.name+"学生在学习");
    }
}
package com.oop.Demo02;

//一个项目一应该只存在一个main方法
public class Application应用 {
    public static void main(String[] args) {

        //类是抽象的,需要实例化
        //类实例化后会返回一个自己的对象
        //student对象就是一个Student类的具体实例
        Student xiaoming = new Student();
        Student xiaohong = new Student();

        System.out.println(xiaoming.name);

        xiaoming.name="小明";
        xiaoming.age=3;

        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);
    }
}

构造器

alt+insert

package com.oop.Demo02;

//java->class
public class Person {

    //一个类即使什么都不写,它也会存在一个方法
    //显示的定义构造器

    String name;
    int age;
    //实例化初始值
    //1.使用new关键字,本质还是调用构造器
    //2.构造器用来初始化值
    public Person() {
        this.name = "田耀宗";
    }

    //重载
    //有参构造:一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name) {
        this.name = name;//this.name指的是这个类的name,后面的形参传递下来的name
    }

//快捷键alt+insert
/*
    public Person() {
    }

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

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

/*
public static void main(String[] args) {

       //new 实例化了一个对象
        Person person = new Person();
        System.out.println(person.name);//null



        Person person = new Person("田耀宗");
        System.out.println(person.name);//田耀宗
                }
 */

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

类和对象

1.类是一个模板:抽象,对象是一个具体的实例:

2.方法:定义,调用

3.对象的引用:

引用类型:基本类型

对象是通过引用来操作的:栈-->堆

4.属性:字段(Field 成员变量)

默认初始化

修饰符 属性类型 属性名=属性值;

5.对象的创建和使用

必须使用new关键字创造对象,创造器Preson tyz= new Preson();

对象的属性 tyz.name

对象的方法tyz.sleep()

6类:

静态的属性 属性

动态的行为 方法

封装

属性私有,get/set

ALT+insert

package com.oop.Demo04;
//类  private:私有
public class Student {

    //属性私有
    private String name;//名字

    private int id;//学号

    private char sex;//性别

    private int age;

    //提供一些可以操作这个属性的方法
    //提供一些public的get/set方法

    //get获得这个数据
    public String getName(){
        return this.name;
    }
    //set给这个数据设置值
    public void setName(String name){
        this.name=name;
    }

    //alt+insert

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>120||age<0){//不合法
            this.age=3;
        }else {
            this.age = age;
        }
    }
  /*  public static void main(String[] args) {
        Student s1 = new Student();

        s1.setName("田耀宗");
//
        System.out.println(s1.getName());

        s1.setAge(999);//不合法
        System.out.println(s1.getAge());
    }

   */

}

/*
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.提高了系统的可维护性
 */
}

继承

类和类的一种关系

子类(派生类) 父类(基类)

package com.oop.Demo05;

//在Java中,所有的类,都默认直接或者间接继承object类
//Person 人 父类
public class Person {

    //public
    //protected
    //default
    //private
    private int money=10_0000_0000;
    public void say(){
        System.out.println("说了一句话");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
package com.oop.Demo05;
//学生  is 人 :派生类 ;子类
public class Student extends Person {


        //ctrl + h

}

super

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

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

package com.oop.Demo05;

import javax.swing.plaf.synth.SynthOptionPaneUI;

//在Java中,所有的类,都默认直接或者间接继承object类
//Person 人 父类
public class Person {

    public Person(){
        System.out.println("Person无参执行了");
    }

    protected String name="tyz";


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

}

package com.oop.Demo05;
//学生  is 人 :派生类 ;子类
public class Student extends Person {

    private String name="田耀宗";


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


    public void print() {
        System.out.println("Student");
    }
    public void test1(){
        print();
        this.print();
        super.print();
    }




    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }




}
package com.oop;

import com.oop.Demo03.Pet;
import com.oop.Demo05.Student;

//一个项目一应该只存在一个main方法
public class Application应用 {
    public static void main(String[] args) {
        Student student = new Student();
        //student.test("耀宗");
        //student.test1();
    }
    }

重写

alt+insert:override

不能被重写
1.static 方法,静态方法属于类,不属于实例
2.final 常量,无法改变
3.private 方法

重写:需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大: public>Protected>Default>private
4.抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException(小)-->Exception(大)

重写:子类的方法和父类必须要一致,方法体不同!

为什么需要重写
父类的功能子类不一定需要或者比一定满足
package com.oop.Demo05;

public class A extends B{

    //@Override 重写
    @Override//注释,有功能的注释
    public void test(){
        System.out.println("A=>test()");
    }
}
package com.oop.Demo05;
//重写都是方法的重写,和属性无关
public class B {
    public  void test(){
        System.out.println("B=>test()");
    }

}
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.父类和子类,有联系,不然会有类型转换异常!ClassCastException!
3.存在条件:继承关系,方法需要重写,父类的引用指向子类对象! father f1=new Son()

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

不能被重写
1.static 方法,静态方法属于类,不属于实例
2.final 常量,无法改变
3.private 方法

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

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

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

        //Student 能调用的方法都是自己的或者继承父类的
        Student s1 = new Student();
        //Person 父类型,可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();
        Object s3 = new Student();

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

instanceof和类型转换

1.父类的引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型:强制转换
4.方便方法的调用,减少重复的代码!简洁

package com.oop.Demo06;

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



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

//System.out.println(X instanceof Y);//能不能编译通过,取决于XY有没有父子关系,X指向的类型与Y有父子关系就是true

        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(person instanceof String);//编译就报错

 */
package com.oop.Demo06;

public class Person {
    public void run(){
        System.out.println("run");
    }
}
package com.oop.Demo06;

public class Teacher extends Person{
}
public class Application应用 {
    public static void main(String[] args) {
        //类型之间的转化:父 子
        //高                  低
        Person obj = new Student();//低-->高

        //obj将这个对象转换为Student类型,我们就可以使用Student类型的方法了
        //Student student = (Student) obj;//高obj-->转换为Student类(低)
        ((Student) obj).go();

        //子类转换为父类,可能丢失自己本来的一些方法
        Student student = new Student();
        student.go();
        Person person=student;
    }
}

/*
1.父类的引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型:强制转换
4.方便方法的调用,减少重复的代码!简洁
 */

static关键字详解

package com.oop.Demo07;

//Static:
public class Student {

    private static int age;//静态变量
    private double score;//非静态变量

    public void run(){

    }

    public static void go(){

    }

    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(Student.age);//类变量
//不可直接调用类变量Student.score
        System.out.println(s1.age);
        System.out.println(s1.score);

        new Student().run();
        go();

    }
}

代码块

package com.oop.Demo07;

public class Person {
    //第2,可以赋初始值
    {
        System.out.println("匿名代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    //第1个输出,只执行一次
    public Person(){
        System.out.println("构造方法");
    }

    //第3
    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("=================");
        Person person2 = new Person();
    }
}
package com.oop.Demo07;

//静态导入包
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());
        System.out.println(PI);
    }
}

抽象类

package com.oop.Demo08;

//abstract抽象类 类:extends :单继承(接口可以多继承)
public abstract class Action {

    //约束,有人帮我们实现
    //abstract,抽象方法,只有方法的名字,没有方法的实现
    public abstract void doSomething();
}

/*
1.不能new这个抽象类,只能靠子类去实现它:约束!
2.抽象类中可以写普通的方法
3.抽象方法必须在抽象类中
抽象的抽象:约束
 */
package com.oop.Demo08;

//抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非子类也是abstract
public class A extends Action{
    @Override
    public void doSomething(){

    }
}

接口

只有规范,自己无法写方法,约束和实现分离:面向接口编程

作用:
1.约束
2.定义一些方法,让不同的人实现
3.方法都是抽象的public abstract
4.常量都是public static final静态常量
5.接口不能被实例化,接口中没有构造方法
6.可以实现多个接口
7.必须要重写接口中的方法

package com.oop.Demo09;

//interface定义的关键字,接口都需要有实现类
public interface UserService {

    //属性  public static final静态常量
     int age=99;

    //接口中的所有定义的方法其实都是抽象的 public abstract
     void add(String name);
     void delete(String name);
     void update(String name);
     void query(String name);

}
package com.oop.Demo09;

//抽象类:extends
//类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中的方法

//多继承,利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
    @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(){

    }
}
package com.oop.Demo09;

public interface TimeService {
    void timer();
}

接口

定义interface

变量只能包含公开静态常量

无构造方法

通过implements关键字

可以有多个接口

抽象类

定义abstract

变量可以是任意修饰符的变量

可以包含构造方法

一个类只能继承一个抽象类

内部类

package com.oop.Demo10;

public class Outer {

    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }

    public static class Inner {
        private final Outer outer;

        public Inner(Outer outer) {
            this.outer = outer;
        }

        public void in() {
            System.out.println("这是内部类的方法");
        }

        //内部类访问外部类的私有变量,方法
        public void getID() {
            System.out.println(outer.id);
        }
    }

    //局部内部类
    public void method(){
        class Inner{
            public void in(){

            }

        }
    }


}
//一个java类中可以有多个class类,但是只能有一个public class
class A{

}
package com.oop.Demo10;

public class Test {
    public static void main(String[] args) {
        //没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();

        new UserService(){
@Override
            public void hello(){

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

interface UserService{
    void hello();
}
package com.oop;

import com.oop.Demo10.Outer;

//一个项目一应该只存在一个main方法
public class Application应用 {
    public static void main(String[] args) {
        //new
        Outer outer = new Outer();
        //通过外部类来实例化内部类
        Outer.Inner inner = new Outer.Inner(outer);
        inner.in();
        inner.getID();
    }
}

异常

posted @   乾道南楼  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示