前言
 这篇博客用于Java基础学习,每次更新笔记时需记录当前更新时间..
笔记区
数据类型拓展
- 整数拓展
 
   		//整数拓展(进制)
           int i= 10;//10进制
           int i2 = 010;//8进制
           int i3 = 0x10;//16进制
           int i4 = 0b10;//2进制
           System.out.println(i+" "+i2+" "+i3+" "+i4);//10 8 16 2
- 
    
浮点数拓展
- 
        
float特点:有限 离散 舍入误差 大约 接近但不等于*
 - 
        
最好完全避免使用浮点数进行比较,见以下案例
 
 - 
        
 
   		float d1 = 138912478f;
   		float d2 = d1 + 1;
   		System.out.println(d1==d2);//打印结果为true,是不是很惊讶
*银行表示钱用什么?BigDemical数学工具类* **
- 
    
字符拓展
- 
        
所有的字符本质还是数字
编码:
Unicode|65=A,97=a|2字节|0-65536(216)
//字符拓展 char c1= '\u0061';//注意char类型要用' System.out.println(c1);//a 
 - 
        
 - 
    
Less is more 大道至简
 
//布尔拓展
boolean bool=true;
if(bool=true){};
if (bool){};//精简
类型转换
- 强制类型转换 高->低
 - 自动类型转换 低->高
 
注意:
- 不能对布尔值进行转换
 - 不能把对象类型转化为不相干的类型
 - 高容量转换成低容量类型时,强转
 - 强转时注意数据类型范围,超出低容量范围时会发生溢出,如下
 
int a = 128;
byte b = (byte)i;
System.out.println(b);//-128,因为发生了内存溢出
溢出问题
- 
    
操作比较大的数时注意溢出问题
 - 
    
JDK7特性,数字之间可用下划线分割
//溢出问题 int money = 10_0000_0000; int years = 20; int total1 = money * years;//-1474836480,溢出 long total2 = (long)money * years;//不溢出 System.out.println(total1); 
Javadoc
Javadoc 用来生成自己api文档
- 命令行生成
 
javadoc -encoding UTF-8 -charset UTF-8 Java文件名.java
在方法上使用文档注释标注参数信息
参数信息:
- @author 作者名
 - @version 版本名
 - @since 指明最早需要使用的jdk版本
 - @param 参数名
 - @return 返回值情况
 - @throws 异常抛出情况
 
- Idea生成
 
 打开菜单->tools->generate Javadoc
2023-7-20 编辑所有内容至此
命令行传递参数
package com.monki.javabase;
public class CommandArg {
    public static void main(String[] args) {
        for (String arg:args){
            System.out.println(arg);
        }
    }
}
若当前Java文件有包名,直接在Java文件所在路径下用命令行执行会报错

正确执行方法:进入到src目录,在类名前加上包名,如图
可变参数
- jdk1.5开始,JAVA支持传递同类型的可变参数给一个方法
 - 在方法声明中,在指定参数类型后加…
 - 一个方法只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数需在其前面声明
 - 可变参数的本质是数组
 
package com.monki.javabase;
public class VariableArg {
    public static void main(String[] args) {
        new VariableArg().printMyArg("下面是我的可变长参数",4536251,1433223);
    }
    public void printMyArg(String s,int... i){
        System.out.println(s);
        for (int x:i){
            System.out.println(x);
        }
    }
}
数组内存分析
graph LR;
	Java内存-->堆;
		堆-->存放new出来的对象和数组;
		堆-->可以被所有的线程共享,不会存放别的对象引用
	Java内存-->栈;
		栈-->存放基本变量类型,会包含这个基本类型的具体数值
		栈-->引用对象的变量,会存放这个引用在堆里面的具体地址
	Java内存-->方法区;
		方法区-->可以被所有的线程共享
		方法区--> 包含了所有类和static变量

接口
只有规范!无法写自己的方法~专业的约束! 约束和实现分离:面向接口编程~
接口的本质是契约
作用:
- 约束
 - 定义一些方法,让不同的人实现
 - 方法 public abstract
 - 变量 public static final
 - 接口不能被实例化,因为接口中没有构造方法
 - implement可以实现接口
 - 必须要重写接口中的方法
 
package com.monki.javabase;
//锻炼抽象的思维,能通过接口定义一个系统时,你的架构能力就很强了
//interface定义的关键字,接口都需要有实现类
public interface InterfaceStudy {
    //常量 public static final
    int AGE=99;
    //接口中所有定义的方法都是抽象的(默认:public abstract)
   void run(String name);
   void delete(String name);
   void update(String name);
   void query(String name);
}
package com.monki.javabase;
public interface TimeService {
    void timer(); 
}
package com.monki.javabase;
//类 可以通过implements实现接口
//实现了接口的类,必须重写接口中的方法
//利用接口实现多继承
public class InterfaceStudyImpl implements InterfaceStudy,TimeService{
    @Override
    public void run(String name) {
    }
    @Override
    public void delete(String name) {
    }
    @Override
    public void update(String name) {
    }
    @Override
    public void query(String name) {
    }
    @Override
    public void timer() {
    }
}
2023-7-25 编辑所有内容至此
抽象类
- 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类
 - 抽象类不能用new关键字来创建对象,它是用来让子类实现的
 - 抽象方法只有方法的声明,没有方法的实现,它是用来让子类实现的
 - 子类继承抽象类,那么就必须实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
 
package com.monki.javabase;
//abstract 抽象类: 类 extends:单继承~ 接口用来多继承
public abstract class ActionAbstract {
    //存在默认构造方法,供子类构造器执行父类构造
    public ActionAbstract(){
        
    }
    //约束~有人帮我们实现
    //abstract方法:只有方法的名字,没有方法的实现
    public abstract void doSomething();
    //1.不能new抽象类的实例,只能靠子类来实现它约束~
    //2.抽象类中可以写普通的方法
    //3.抽象方法必须在抽象类中
    //抽象的抽象:约束~
    
    
}
package com.monki.javabase;
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非继承它的类也声明为抽象类,抛给继承他的类的子类来实现
public class A extends ActionAbstract{
    @Override
    public void doSomething() {
    }
}
内部类
- 成员内部类
 - 静态内部类
 - 局部内部类
 - 匿名内部类
 
package com.monki.javabase;
public class OuterClass {
    private int id=10;
    private static int sid =6;
    public void out(){
        System.out.println("这是外部类的方法");
    }
    //成员内部类
    public class InnerMemberClass{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        //获得外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
        public void getSid(){
            System.out.println(sid);
        }
    }
    //静态内部类
    public static class InnerStaticClass{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        //无法访问外部类的非静态私有属性id
        public void getSid(){
            System.out.println(sid);
        }
    }
    //局部内部类,写在方法里
    public void method(){
        class InnerAreaClass{
            public void in(){
            }
        }
    }
    public static void main(String[] args) {
        //匿名内部类,是UserService这个接口的实现类,需要重写接口里的方法
        //可以返回一个对象,但是这个类没有名字
        UserService userService = new UserService() {
            @Override
            public void hello() {
                System.out.println("通过匿名内部类的对象调用此方法");
            }
        };
        userService.hello();
    }
}
interface UserService{
     void hello();
}
package com.monki.javabase;
public class InnerClassTest {
    public static void main(String[] args) {
        //创建外部类
        OuterClass outer = new OuterClass();
        //通过外部类实例化成员内部类
        OuterClass.InnerMemberClass innerMem = outer.new InnerMemberClass();
        //通过外部类.静态内部类实例化静态内部类
        OuterClass.InnerStaticClass innerStatic = new OuterClass.InnerStaticClass();
        //成员内部类获取外部类私有属性
        innerMem.getID();
        innerMem.getSid();
        //静态内部类获取外部类私有静态属性
        innerStatic.getSid();
    }
}
Error和Exception
简单分类:
- 检查性异常:可能由用户引起,程序员无法预见,在编译时不能简单被忽略
 - 运行时异常:可能被程序员避免的异常,可以在编译时被忽略
 - 错误ERROR:与JVM相关
 
Error:
- Error对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
 
Exception:
- 一般由程序逻辑错误引起,程序员应该从逻辑角度尽可能避免这些异常
 
捕获和抛出异常
- 异常处理五个关键字
    
- try,catch,finally,throw,throws
 
 
package com.monki.javaException;
public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        new Test().test(a,b);
       /* //假设要捕获多个异常:要从小到大
        try{//try监控区域
            if(b==0){//主动抛出异常 throw
                throw new ArithmeticException();
            }
            //System.out.println(a/b);
            //new Test().a();
        }catch(Error e){//catch(想要捕获的异常类型)
            //catch 捕获异常
            System.out.println("Error");
        }catch (Exception e){
            System.out.println("Exception");
        }catch (Throwable t){
            System.out.println("Throwable");
        }finally {//处理善后工作
            System.out.println("finally");
        }*/
        //finally可以不要,一般用于IO等资源关闭
    }
    //假设这个方法中,处理不了这个异常。方法上抛出异常
    public void test(int a,int b) throws ArithmeticException{
        if (b==0) {
            throw new ArithmeticException();//主动抛出异常,一般在方法中使用
        }
        System.out.println(a/b);
    }
    public void a(){b();}
    public void b(){a();}
}
自定义异常
- 用户自定义异常类,只需继承Exception类即可
 
package com.monki.javaException;
//自定义异常类
public class MonkiException extends Exception{
    //传递数字>10
    private int detail;
    public MonkiException(int a) {
        super("123");//没有toString方法才会执行
        this.detail = a;
    }
    @Override
    public String toString() {
        return "MonkiException{" +
                "detail=" + detail +
                '}';
    }
}