Java知识点

常见的转义字符包括:

" 表示字符"
' 表示字符'
\ 表示字符
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u#### 表示一个Unicode编码的字符

多行字符串("""...""":Java 13的预览特性)
@SuppressWarnings("preview")
        String d = """
                SELECT * FROM
                  users
                WHERE id > 100
                ORDER BY name DESC
                """;
不可变特性:变的不是字符串,而是变量s的“指向”。
image.png
格式化输出
System.out.printf("%.2f\n", d); // 显示两位小数3.14
System.out.printf("%.4f\n", d); // 显示4位小数3.1416
System.out.printf("您的成绩提升了  %.2f %%", 100*percent);//显示您的成绩提升了  xx.x%

https://www.liaoxuefeng.com/wiki/1252599548343744/1255887264020640#0

多态:多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。

/**
观察totalTax()方法:利用多态,totalTax()方法只需要和Income打交道,它完全不
需要知道Salary和StateCouncilSpecialAllowance的存在,就可以正确计算出总的
税。如果我们要新增一种稿费收入,只需要从Income派生,然后正确覆写getTax()
方法就可以。把新的类型传入totalTax(),不需要修改任何代码。

可见,多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
*/
public class Main {
    public static void main(String[] args) {
        // 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
        Income[] incomes = new Income[] {
            new Income(3000),
            new Salary(7500),
            new StateCouncilSpecialAllowance(15000)
        };
        System.out.println(totalTax(incomes));
    }
    //写一个报税的财务软件,对于一个人的所有收入进行报税,可以这么写:
    public static double totalTax(Income... incomes) {
        double total = 0;
        for (Income income: incomes) {
            total = total + income.getTax();
        }
        return total;
    }
}
//定义一种收入,需要给它报税,那么先定义一个Income类
class Income {
    protected double income;

    public Income(double income) {
        this.income = income;
    }

    public double getTax() {
        return income * 0.1; // 税率10%
    }
}
//对于工资收入,可以减去一个基数,那么我们可以从Income派生出SalaryIncome,并覆写getTax():
class Salary extends Income {
    public Salary(double income) {
        super(income);
    }

    @Override
    public double getTax() {
        if (income <= 5000) {
            return 0;
        }
        return (income - 5000) * 0.2;
    }
}
//如果你享受国务院特殊津贴,那么按照规定,可以全部免税:
class StateCouncilSpecialAllowance extends Income {
    public StateCouncilSpecialAllowance(double income) {
        super(income);
    }

    @Override
    public double getTax() {
        return 0;
    }
}
抽象类与继承

合理设计interface和abstract class的继承关系,可以充分复用代码。一般来说,公共逻辑适合放在abstract class中,具体逻辑放到各个子类,而接口层次代表抽象程度。可以参考Java的集合类定义的一组接口、抽象类以及具体子类的继承关系

接口和抽象类的区别

1、接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
2、接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
3、接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
4、从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

接口

public class Main {

    public static void main(String[] args) {
        // TODO: 用接口给一个有工资收入和稿费收入的小伙伴算税:
        Income[] incomes = new Income[] {new SalaryIncome(7500), new RoyaltyIncome(12000) };
        double total = tax(incomes);
        // TODO:
        System.out.println(total);
    }
    public static double tax(Income...incomes) {
        double tax = 0;
        //for(数组类型 数组元素 : 数组名)
        for (Income income: incomes) {
            tax += income.result();
        }
        return tax;
    }

}
public interface Income {
    double gettax();
    default double result() {
        return gettax();
    }
}
public class RoyaltyIncome implements Income{

    protected double income;
    public RoyaltyIncome(double income) {
        this.income = income;
    }
    public double gettax() {
        return income * 0.2;
    }

}
public class SalaryIncome extends RoyaltyIncome{
    
    public SalaryIncome(double income) {
        super(income);
    }
    @Override
    public double gettax() {
        if (this.income <= 5000) {
            return 0;
        }
        return (this.income - 5000) * 0.2;
    }
    // TODO

}

面向抽象编程的本质就是:

上层代码只定义规范(例如:abstract class Person);
不需要子类就可以实现业务逻辑(正常编译);
具体的业务逻辑由不同的子类实现,调用者并不关心。

模块Module(JDK9引入)

https://www.liaoxuefeng.com/wiki/1252599548343744/1281795926523938

classpath和jar

1.JVM通过环境变量classpath决定搜索class的路径和顺序;
2.不推荐设置系统环境变量classpath,始终建议通过-cp命令传入;
3.jar包相当于目录,可以包含很多.class文件,方便下载和使用;
4.MANIFEST.MF文件可以提供jar包的信息,如Main-Class,这样可以直接运行jar包。
https://www.liaoxuefeng.com/wiki/1252599548343744/1260466914339296

你可能感兴趣的:(Java知识点)