Java基础学习笔记(狂神说Java)

Java基础

注释

单行//,多行/* 注释 /
文档注释
/
*

*@Description

*@Author
*/

标识符

数据类型

long num = 30L;

float num = 10.1F;

最好完全避免用浮点数进行比较 (用Bigdecimal)

强制类型转换(不能对boolean转换):(类型)变量名

数字可以用下划线区分,且不会被输出。

变量

类变量(static),实例变量,局部变量(方法内)

常量(final,不存在先后顺序)

驼峰原则(monthSalary)

类名首字母大写

包机制

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

JavaDoc生成文档

package com.A1oe;

/**
 * @author A1oe
 * @version 1.0
 */

public class Hello {

    /**
     * @param args
     */
    public static void main(String[] args){
        System.out.println("com.A1oe.Hello World");
    }
}

cmd: javadoc -encoding UTF-8 -charset UTF-8 Hello.java

IDEA: Tools - Generate JavaDoc

交互Scanner对象

package com.A1oe;

import java.util.Scanner;

public class Hello {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){  //hasNextLine(), hasNextInt(),hasNextFloat()等
            String str = scanner.next();
            System.out.println(str);
        }
        // 凡是IO流都要关掉
        scanner.close();
    }
}

增强for循环

package com.A1oe;

public class Hello {
    public static void main(String[] args){
        int[] nums = {1,2,3,4,5};
        for (int x: nums){
            System.out.println(x);
        }
    }
}

方法

修饰符 返回值类型 方法名(参数类型 参数名){
    方法体
    return x;
}

方法重载:方法名字相同,参数类型/个数/顺序不同

命令行传参

package com.A1oe;

public class Hello {
    public static void main(String args[]){
        for (int i=0; i<args.length; i++){
            System.out.println(args[i]);
        }
    }
}

cmd: java com.A1oe.Hello hello world

可变参数

一个方法中只能指定一个可变参数,必须是方法的最后一个参数

package com.A1oe;

public class Hello {
    public static void main(String[] args){
        System.out.println("Hello World");
    }
    public static void PrintMax(double... nums){
        if (nums.length == 0){
            return;
        }
        double result = nums[0];
    }
}

数组

//声明
dataType[] arrRefVar;
//new操作符创建数组
dataType[] arrayRefVar = new dataType[arraySize];
//数组长度
array.length

初始化

//静态
int[] a = {1,2,3};
//动态
int[] a = new int[2];
a[0]=1;
a[1]=2;
//默认初始化
  • 数组长度是确定的,大小不可以改变

  • 元素类型相同

多维数组

int a[][] = new int[2][5];

Arrays类

package com.A1oe;

import java.util.Arrays;

public class Hello {
    public static void main(String[] args){
        int[] a = {1,2,3};
        Arrays.sort(a); //fill, equals, binarySearch
        System.out.println(Arrays.toString(a));
    }

}

稀疏数组

构造器

  • 必须和类名相同

  • 必须没有返回值,也不能是void

package com.A1oe;

public class Hello {
    String name;
    public Hello() {
        this.name = "a";
    }
}

IDEA: alt+insert 生成构造器

封装

  • 高内聚,低耦合;内部数据操作细节自己完成,尽量暴露更少的 方法

  • 属性私有,get/set(public)

  • 提高安全性,保护数据

  • 隐藏实现细节

  • 统一接口

  • 增加系统可维护性

继承

  • extends,子类是父类的扩展

  • public全部继承,private无法继承;public>protected>default>private

  • 所有类默认直接/继承继承Object类

  • 只能单继承

IDEA:Ctrl+H打开继承树

  • super访问父类(private无法被继承)

重写

  • 方法的重写,非private

  • 需要有继承关系

  • 方法名相同,参数列表相同,修饰符范围可以扩大(private->public)

  • 抛出异常可以缩小,不能扩大(ClassNotFoundException->Exception)

  • IDEA:alt+insert

//A
package com.A1oe;

public class A extends B{
    public static void test(){
        System.out.println("A");
    }
}
//B
package com.A1oe;

public class B{
    public static void test(){
        System.out.println("B");
    }
}
//Hello
package com.A1oe;

public class Hello{
    public static void main(String[] args) {
        A a = new A();
        a.test();  //A
        B b = new A();
        b.test();  //B
    }
}
//A
package com.A1oe;

public class A extends B{
    public void test(){
        @Override
        System.out.println("A");
    }
}
//B
package com.A1oe;

public class B{
    public void test(){
        System.out.println("B");
    }
}
//Hello
package com.A1oe;

public class Hello{
    public static void main(String[] args) {
        A a = new A();
        a.test();  //A
        B b = new A();    //子类重写父类方法,非静态
        b.test();  //A
    }
}

多态

//A
package com.A1oe;

public class A extends B{
    @Override
    public void test(){
        System.out.println("A");
    }
    public void test1(){
        System.out.println("A");
    }
}
//B
package com.A1oe;

public class B{
    public void test(){
        System.out.println("B");
    }
}
//Hello
package com.A1oe;

public class Hello{
    public static void main(String[] args) {
        A a = new A();
        // B父类,可以指向子类,但是不能调用子类独有的方法
        B b = new A();
        //((A) b).test1();  //强制转换才能调用
        Object c = new A();
    }
}
  • 多态:同一方法可以根据发送对象的不同而采用多种不同的行为方式

  • 对象能执行哪些方法,主要看对象左边的类型

  • 属性没有多态

  • static、final、private无法使用

instanceof

  • 判断一个对象时什么类型

  • Object->B->C,在这条线上用instanceof都是true,因为有父子关系

static

package com.A1oe;

public class Hello{
   static {  // 只执行一次
       // 1静态代码块
   }
    {    //赋初始值
        //2匿名代码块
    }
    //3构造方法
}

静态导入包

package com.A1oe;

import static java.lang.Math.random

public class Hello{
    public static void main(String[] args) {
        System.out.println(random());
    }
}

抽象类

  • abstract 抽象,public abstract class A{}

  • 抽象方法,只有名字没有实现,public void action() {},继承的子类必须实现。如果有抽象方法,必须时抽象类

  • 不能new抽象类,只能靠子类实现

  • 抽象类存在构造器,提高开发效率

接口

  • interface,只有规范,无法写方法,专业的约束,约束和实现分离

  • 接口方法默认是public abstract,可以不写

  • 接口定义变量public static final

  • 可以实现多个接口

package com.A1oe;

public interface Hello{
    void add(String name);
    void delete(String name);
}
//实现
public class UserServiceImpl implements Hello{

}

内部类

  • 类中还有类,通过外部类实例化内部类

  • 成员内部类能操作外部类私有属性、方法;静态内部类不能(除非也是static,初始化顺序相关概念理解下就行);

  • 一个java文件中可以有多个class,但是只能有一个public

  • 局部内部类:方法中的类。匿名内部类:new了,但是没有名字

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner() ;

异常

  • try,catch,finally,throw,throws

  • IDEA:ctrl+alt+t,自动生成ifelse,trycatch等

  • throw主动抛出异常,一般在方法中使用

  • 方法上使用throws

package com.A1oe;

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

        }catch (Exception e){  //从小到大
            e.printStackTrace();
        }catch (Throwable t){

        }
        finally {

        }
    }
}

link: https://www.bilibili.com/video/BV12J41137hu/

posted @ 2023-05-03 14:44  A1oe  阅读(21)  评论(0编辑  收藏  举报