JavaSE基础

JavaSE 基础


注释

  1. 在代码量较多时,注释能让我们更好的理解程序
  2. 注释不会被执行。
  3. 书写注释是每个程序员必须练成的一种好习惯。
  • Java中的注释有三种
    • 单行注释
    • 多行注释
    • 文档注释(JavaDoc)

用法如下:

public class HelloWorld {
    public static void main(String[] args) {
        //单行注释语法://注释内容
        
        /*
        多行注释语法:外部的语法包裹注释内容
         */
        
        //JavaDoc:文档注释 语法:/**注释内容*/ (常用与变量解释)
        /**
         * @Author 王玉星
         */
    }
}

关键字与标识符

关键字

Java中常用的关键字如下图所示:

标识符

用于区分Java中数据,如同(人的名字,计算机编号等)

  • 所有的标识符都是字母(A-Z、a-z),美元符($),或者下划线(_)开头(首字母)。
  • 首字母之后可以是任意字符组合。(除特殊符号如 @,#,%等)。
  • 标识符是大小写敏感的。
  • 可以使用中文或拼音来命名标识符,但是不建议使用

数据类型

  • 强类型语言

    要求变量的使用要严格符合规定,所有变量都必须先定义后使用。(安全性高、速度慢。)

  • 弱类型语言

    要求变量的使用要符合规定。(安全性低、速度快。)

Java数据类型的分类

  • 基本类型

  • 引用类型


数据类型扩展及其面试题讲解

  • 数据类型扩充

    • 整数拓展

      二进制(0b开头)、八进制(0开头)、十六进制(0x开头)。

      如下:

      010 = 8 (八进制)

      0x10 = 16 (十六进制)

    • 浮点数拓展

      import javax.xml.bind.SchemaOutputResolver;
      
      public class Demo01 {
          public static void main(String[] args) {
              /*
              --------------------------------------------
              浮点数拓展
              float 有限 离散 舍入误差 大约 接近但不等于
              double
      
              特别提醒:最好完全避免使用浮点数进行比较。(比较结果容易出错)
              可以使用BigDecimal 数学工具类。之后会说。
               */
              float f = 0.1f;
              double d = 1.0/10;
              //比较结果
              System.out.println(f == d);   //false
      
              float f1 = 446746156441441f;
              float f2 = f1 + 1;
              System.out.println(f1 == f2);  //true
              /*
              字符拓展
              所有的字符本质还是数字。
              利用编码表进行互相转换:Unicode表 ,2字节,范围(0~65536)
      
              转义字符 \t 制表符 \n 换行符等。
               */
              //内存机制:
              String sa = new String("a");
              String sb = new String("a");
              System.out.println(sa == sb);  //false(不同的对象)
              String sc = "a";
              String sd = "a";
              System.out.println(sc == sd);  //true(同样的内容只能有一份)
              //布尔值拓展
              boolean flag =true;
              if (flag == true){}     //新手
              if(flag){}      //老手
              //两个表示内容相同
          }
      }
      
      

类型转换

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

运算时,不同类型转换为同意类型才进行运算。

  • 自动类型转换:根据下图的顺序,由左到右,会自动转换。(低——高 )自动转换

  • 强制类型转换:由高到低,需要强制转换。格式为: (转换类型)转换变量

注意点!!!

  1. 不能对布尔值进行转换。
  2. 不能把对象类型转换为不相干类型(中国转换为int型)。
  3. 高容量转低容量的时候,需要强制转换。
  4. 转换时可能出现内存溢出,或者精度丢失的问题。

变量

变量:就是可以改变的量。

Java是强类型语言,每个变量都必须声明其类型。

Java变量是程序中最基本的存储单元,其中包括变量名,变量类型,变量的作用域。

  1. 变量名:满足标识符即可。
  2. 变量类型:即为Java的数据类型,可以是基本类型,也可以是引用类型。
  3. 变量的作用域:变量可作用的范围。

变量的声明:

// type  VarName [=value] [{,varName[=value]}];
// 类型   变量名 = 变量值; []代表可加,可不加,{}代表可以重复多次。
int a = 2;
String name = "张三";
String name1 = "张三", sex = "男", age = "20"; //不推荐使用

变量的作用域:

  • 类变量:用 static 修饰,作用域为整个类。
  • 实例变量:作用域为new 类名的大括号内。
  • 局部变量:作用域为所使用方法的括号内。
public class Variable {
    static int allClicks = 0; //类变量
    String str = "hello world"; //实例变量
    public void method(){
        int i = 0; //局部变量
    }
    public void setme(){
        Variable variable = new Variable();
        System.out.println(variable.str);
    }
}

常量:初始化后不可改变的值!

final 类型 常量名=值;
final double PI = 3.14

变量的命名规范:

  • 类成员名:首字母小写后每个单词首字母大写 lastName
  • 局部变量:首字母小写后每个单词首字母大写 fristNum
  • 方法名:首字母小写后每个单词首字母大写 setName
  • 常量: 大写字母和下划线 MAX_VALUE
  • 类名: 首字母大写后每个单词首字母大写 PeopleNum

运算符

Java支持的运算符:

  • 算术运算符:+,-,*,/,%(膜运算:取余),++,--
  • 赋值运算符:=
  • 关系运算符:> , < , >= , <= , ==(java里等于要用两个等于号) , != (不等于) instapceof
  • 逻辑运算符:&&(与),||(或),!(非)
  • 位运算符:&,|,^,~,>>,<<,>>>(了解)
  • 条件运算符?:
  • 扩展赋值运算符:+=,-=,*=,/=
public class Demo2 {
    public static void main(String[] args) {
        /*
        A=0011 1100
        B=0000 1101
        --------------------------------------------------------
        A&B = 0000 1100  如果A和B的数字对应位都为1则为1,如果不同则为0
        A|B = 0011 1101  如果A和B的数字对应位都为0则为0,如果不同则为1
        A^B = 0011 0001  如果A和B对应位相同则为0,如果不相同就是1
        ~B = 1111 0010   和原来的数字完全相反


        面试题!!!!如何提高2*8的计算速度,使用位运算符
        
        通过左移或右移 运算符,移动一位*2 或/2
        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);//16
            System.out.println(16>>3);//2
    }
}

包机制

为了更好的组织类,Java提供了包机制,用于区别类名的命名空间

  • 包命名的语法格式:

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

  • 一般利用公司域名倒置作为包名

  • 为了能使用某一个包的成员,我们需要在Java程序中明确导入该包,使用 import 语句可完成此功能。

import pkg1{[.pkg2]}.(类名|*);

Java Doc

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

javadoc -encoding UTF-8 -charset UTF-8 文件路径加名字(hello.java)

在写文档注释时,有以下参数:

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


Java流程控制

用户交互Scanner

Scanner对象:是Java5的新特新,我们可以0通过 Scanner 类来获取用户输入。

语法格式:

Scanner sc = new Scanner(System.in)

常用 Scanner 的方法:

next()与nextLine:获取用户输入的字符串。

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

next 与 nextLine()

​ next():不能得到带空格的 字符串。

​ nextLine():可以得到回车之前的使用字符串,可以是空白。

Sanner用完后记得关闭 close()。

还有一种用法,判断输入的数据类型是什么类型。

next类型()

hasnext类型()

eg:

​ nextInt()

​ nextDouble()

​ hasnextDouble()

顺序结构

Java 的基本结构就是顺序结构,按照顺序一步一步执行。

选择结构

  • if 单选择结构

    if (布尔表达式){
        执行语句;
    }
    
  • if 双选择结构

    if (布尔表达式){
        执行语句;
    }else{
        执行语句;
    }
    
  • if 多选择结构

    if (布尔表达式){
        执行语句;
    }else if(布尔表达式){
        执行语句;
    }else if(布尔表达式){
        执行语句;
    }else if(布尔表达式){
        执行语句;
    }else{
        执行语句;
    }
    
  • 嵌套 if 结构

    if (布尔表达式){
        if (布尔表达式){
       		 执行语句;
    	}else{
       		 执行语句;
    	}
    }else{
        if (布尔表达式){
        	执行语句;
    	}else{
      	  	执行语句;
    	}
    }
    
  • switch 结构

    /*
    	expression和value:支持的数据类型为:int char short byte
    	java 7 之后支持:String。
    */
    switch (expression){
        case value:
            执行语句;
            break;//可选
        case value:
            执行语句;
            break;//可选
        // case 可以无限多
        default: //可选,只能有一个
            执行语句;
    }
    

循环结构

  • while 循环

    /*
    	1.	只要布尔表达式为真,循环会一直进行。
    	2.	大多数情况需要循环停下来。
    */
    while (布尔表达式){
        循环体;
    }
    
  • do while 循环

    /*
    	1. while 与 do while 的区别,while先判断后执行,do while先执行后判断。
    	2.do while循环能保证循环至少执行一次。
    */
    do{
        循环体;
    }while(布尔表达式);
    
  • for 循环

    /*
    	1. for 循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构。
    	2. for 循环次数在执行前就会被确定。
    */
    for(初始化;布尔表达式;条件更新){
        循环体;
    }
    
  • 增强 for 循环

    /*
    	Java 5 引入,主要用于数组或集合,遍历时。
    */
    for(声明语句:表达式){
        
    }
    
  • break 与 continue

    break:在任何循环语句中,使用break 结束循环体

    continue:在一个循环中,遇见continue 结束循环体,进行下一次循环。

Java 的方法

什么是方法

Java方法:指语句的集合,它们组成成一个功能。

  • 方法是解决一类问题的步骤的有序组合。
  • 方法包含于类中或对象中。
  • 方法在程序中被创建,在其他地方被引用。

方法的定义

/*
	修饰符:修饰该方法的调用方法和访问权限。
	返回值类型:根据方法的要求,获取相对的返回值。
	方法名:方法的实际名字,方法在其他地方调用的依据。
	参数类型:参数相当于占位符,在其他方法调用时传如参数,完成方法的功能。
	方法体:解决一个功能所需要的代码块。
*/
修饰符 返回值类型 方法名([参数类型 参数名{, 参数类型 参数名}]){
    方法体;
    return 返回值; //可选
}

面试题:

Java都是值传递还是引用传递。

​ Java都是值传递。


方法的重载

定义:在一个类中,相同函数名,但形参不同的函数。

方法重载的规则

  • 方法名必须相同
  • 参数列表不同(个数不同,类型不同,参数顺序不同都可以)。
  • 方法的返回值可以相同,也可以不同。
  • 仅仅返回类型不同不足以成为方法的重载。

可变参数

/*
	在方法声明中,在指定参数类型后加一个(...)
	一个方法体中只能有一个可变参数,它必须是方法的最后一个参数。
*/
public static void test(int... i){
    for(int x:i){
        System.out.println(x);
    }
}

递归(面试高频点)

递归就是:自己调用自己,适用于调用层级小的,调用层级大容易照成栈溢出,不推荐。


数组

数组概述

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

数组声明与创建

dataType[] arrayRefVar;   // 首选方法
dataType arrayReVar;   //效果相同

// Java语言使用 new 操作符来创建数组,语法如下
dataType[] arrayRefVar = new dataType[arraySize];
int [] a = new int[5];

//数组元素通过下标访问,下标从 0 开始。
// 获取数组长度 数组名.length

数组的初始化

//	静态初始化
int[] a = {1,2,3};
//	动态初始化
int[] a = new int[2];
a[0]=1;
a[1]=2;

数组的特点

  1. 数组长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素类型必须相同,不允许出现混合类型。
  3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
  4. 数组变量的引用类型,数组也可以看成是对象,数组中的每个元素相当于对象的成员变量。数组本身就是对象,Java中对象是堆存储,因此数组无论保存什么类型,都是存储在堆中。
  5. 数组可以当作方法的参数。
  6. 数组也可以做返回值。
public class Demo2 {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5};
        Demo2 demo2 = new Demo2();

        demo2.printArray(a);
        demo2.reverse(a);
    }
    public void printArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+" ");
        }
    }
    //数组的反转
    public 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 [2][5]	//定义
    int[][] a= {{1,2},{3,4},{5,6}}
    

Arrays类

import java.util.Arrays;


/*
* 数组的工具类 java.util.Arrays
* API文档提供了一个工具类,供我们使用。
* 详情查看API文档,
* Arrays类中的方法都是static修饰,调用时,可以不用new对象。
* 常用的功能:
* 1. 给数组赋值,即填充数组。fill方法
* 2. 对数组进行排序,升序。sort方法
* 3. 对两个数组的值进行比较,看数组是否相同。equals方法
* 4. 查找数组元素,binarySearch方法,利用已经排序好的数组进行二分法查找元素。
* */
public class Demo2 {
    public static void main(String[] args) {
        int[] a = {23,41,5,3,746,998};

        //打印数组元素
        System.out.println(Arrays.toString(a));
        //排序数组
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
        //数组填充
        Arrays.fill(a,0);
        System.out.println(Arrays.toString(a));
        
        //其余方法及其填充的其他用法查看jdk 开发文档。
    }
}

排序算法

  • 冒泡排序(最出名的排序算法之一)总共八大排序算法。

    import java.util.Arrays;
    public class Demo03 {
        /*
         * 冒泡排序:
         *    比较数组中前一个数组中前一个数组与后一个数的大小,在更具我们需要升序还是降序,进行值的互换。
         *    每次比较会产生最大,或最小的数。
         *    下一轮排序可以减少一次排序
         *    以此循环,直到结果出来。
         *    时间复杂度O(n^2)
         * */
        public static void main(String[] args) {
            int[] a = {12, 32, 443, 6, 4, 46, 3413, 232};
            int[] bubbleSort = bubbleSort(a);
            System.out.println(Arrays.toString(bubbleSort));
        }
        //冒泡排序
        public static int[] bubbleSort(int[] array) {
            int temp = 0;
            for (int i = 0; i < array.length - 1; i++) {
                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;
                    }
                }
            }
            return array;
        }
    }
    

数组进阶:稀疏数组

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

        //创建一个二维数组 11*11
        //0表示没有棋子,1表示黑棋,2表示蓝棋
        int[][] chessArr = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        //输出原始的二维数组
        System.out.println("原始的二维数组:");
        for (int[] value : chessArr) {
            for (int j = 0; j < value.length; j++) {
                System.out.print(value[j] + "\t");
            }
            System.out.println();
        }

        //将二维数组转换为稀疏数组
        //1.先遍历二维数组得到非零数据的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr[i][j] != 0){
                    sum++;
                }
            }
        }

        //2.创建对应的系数数组
        int[][] sparseArr = new int[sum+1][3];
        //给系数数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        //遍历二维数组将非零的值存放到稀疏数组
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
        //输出稀疏数组
        System.out.println();
        System.out.println("稀疏数组:");
        for (int[] ints : sparseArr) {
            System.out.println(ints[0] + "\t" + ints[1] + "\t" + ints[2]);
        }


        //将稀疏数组恢复成二维数组
        //1.先读取稀疏数组的第一行,根据第一行创建二维数组
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.读取稀疏数组后几行赋值给二维数组
        //注意这里是从第二行开始
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println();
        System.out.println("恢复后的二维数组:");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.print(data+"\t");
            }
            System.out.println();
        }
    }
}

面向对象编程


什么是面向对象

Java核心思想就是面向对象编程(OOP)

面向过程思想

  • 步骤清晰简单。
  • 面向过程适合处理一些简单的问题

面向对象思想

  • 物理类聚,分类的思维模式。将问题分类,在进行问题处理。
  • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。

什么是面向对象

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

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

抽象:将有相同特性的一部分属性包装起来。

三大特性:

  • 封装性:将一系列的属性和方法封装在类中。
  • 继承性:将一个类的方法原原本本的给另一个类。
  • 多态性:同一个事物,执行相同操作,所得到不同结果。

类与对象的关系

类:是对某一具体事务的抽象。将事务抽象成为一定的数据类型。对某一事物的描述,单不能代表具体的事物。

​ 如:人类,动物类,等。

对象:是对类的具体实例

​ 如:小明(人类实例化出来的)。

创建与初始化对象

使用 new 关键字来创建对象。

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

类中的 构造器也称构造方法 是在进行创建对象的时候必须要调用的。

public class Student {
 String name;
 int age;

 public void show(){
     System.out.println(this.name+"今年"+age+"岁");
 }
}
public class Demo05 {
 public static void main(String[] args) {
     Student student = new Student();
     student.show();

     Student student2 = new Student();
     student2.name = "小明";
     student2.age = 2;
     student2.show();
 }
}

构造方法

构造方法的特点:

  • 必须和类名相同。
  • 必须没有返回值类型。
posted @ 2021-02-01 23:51  橘子有点甜  阅读(99)  评论(0编辑  收藏  举报