去年公司由於不斷發展,內部自研系統越來越多,所以後來搭建了一個日誌收集平臺,並將日誌收集功能以二方包形式引入各個自研系統,避免每個自研系統都要建立一套自己的日誌模塊,節約了開發時間,管理起來也更加容易。 這篇文章主要介紹如何編寫二方包,並整合到各個系統中。 先介紹整個ELK日誌平臺的架構。其中xia ...
final 關鍵字
最終修飾符 可以修飾 類 方法 變數
被final修飾後不能被繼承 重寫 二次賦值
修飾類時 該類不可以被繼承
修飾方法時 該方法不能被重寫
修飾變數時, 該變數只能賦值一次, 不可以二次賦值 是常量
修飾引用變數時, 地址值不能改變 但對象中的屬性值可以改變
修飾成員變數時, 必須在類中顯性賦值 或 在所有構造方法中對其賦值
介面
介面是功能的集合 描述的是功能 介面中都是抽象方法(JDK1.8之前)
定義格式
public interface 介面名{
抽象方法;
}
介面的使用
1.介面不能創建對象
2.使用類實現介面
3.重寫抽象方法
4.創建實現類對象 調用方法
實現的動作類似繼承 就是關鍵字不同
public class 類 implements 介面{
重寫方法
}
介面的成員特點
介面沒有構造方法
介面中的成員變數 被public static final修飾 是常量
介面中的成員方法 被public abstract修飾
介面的特點
類與類 單繼承
類與介面 多實現
介面與介面 多繼承
類可以在繼承一個類的同時 實現多個介面
介面與抽象類的區別
成員區別
構造方法
介面沒有構造方法
抽象類有構造方法 給子類使用
成員變數
介面沒有變數 只有常量
抽象類既可以有變數 也可以有常量
成員方法
介面中的方法都是抽象的
抽象類中 既可以有抽象方法 也可以有具體的方法
思想的區別
抽象類描述的是一類事物的共性內容
介面描述的是功能
多態
多態的前提
1.繼承或者是實現關係
2.需要有方法重寫
多態的格式
父類引用指向子類對象
具體類 變數 = new 子類對象();
抽象類 變數 = new 子類對象();
介面 變數 = new 實現類對象();
多態後訪問的成員特點
成員變數
編譯時 到父類中找 如果有編譯通過 沒有報錯
運行時 列印的父類成員變數的值
編譯時 看左邊
運行時 看左邊
成員方法
編譯時 到父類中找 如果有編譯通過 沒有報錯
運行時 子類重寫後的方法
編譯時 看左邊
運行時 看右邊
多態後 一切都是父類的表現形式 只有方法運行的子類重寫後的方法.
向上轉型和向下轉型
// 向上轉型
// 多態本身就是向上轉型
Fu fz = new Zi();
// 向下轉型
// 向上轉型後 不能訪問子類特有功能
// 要想訪問 需要向下轉型
Zi zf = (Zi)fz;
// 需要註意
Fu fu = new fu();
Zi zi = (Zi)fu; //拋運行時異常 ClassCastException 類型轉換異常
instanceof關鍵字
判斷某個對象是否屬於某種類型 是返回true, 否返回false
boolean b = 對象 instanceof 類型;
if(對象 instanceof 類型){}
練習
員工類
屬性
id
name
基本工資
行為
計算工資 抽象
經理類
屬性
id
name
基本工資
管理工資
行為
計算工資 基本工資+管理工資
程式員
屬性
id
name
基本工資
項目獎金
行為
計算工資 基本工資+項目獎金
公司類
行為
查看員工工資(員工){
員工的工號:38250
員工的姓名:柳岩
員工的職位:經理
員工的工資:11111.00
}
練習
// Employee.java
public abstract class Employee {
String id;
String name;
private double salary;
public Employee() {
}
public Employee(String id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public abstract double calculateSalary();
public String getName() {
return name;
}
public double getSalary(){
return salary;
}
}
// Manager.java
public class Manager extends Employee{
private double additionalSalary;
public Manager() {
}
public Manager(String id, String name, double salary, double additionalSalary) {
super(id, name, salary);
this.additionalSalary = additionalSalary;
}
public double getAdditionalSalary() {
return additionalSalary;
}
public void setAdditionalSalary(double additionalSalary) {
this.additionalSalary = additionalSalary;
}
@Override
public double calculateSalary() {
return super.getSalary() + getAdditionalSalary();
}
}
// Programmer.java
public class Programmer extends Employee{
private double projectSalary;
public double getProjectSalary() {
return projectSalary;
}
public Programmer() {
}
public Programmer(String id, String name, double salary, double projectSalary) {
super(id, name, salary);
this.projectSalary = projectSalary;
}
public void setProjectSalary(double projectSalary) {
this.projectSalary = projectSalary;
}
@Override
public double calculateSalary() {
return super.getSalary() + getProjectSalary();
}
}
// Company.java
public class Company {
public void lookEmployeeSalary(Employee employee) {
String position = "員工";
if (employee instanceof Manager) {
position = "經理";
} else if (employee instanceof Programmer){
position = "程式員";
}
System.out.println("員工的工號: " + employee.id);
System.out.println("員工的姓名: " + employee.name);
System.out.println("員工的職位: " + position);
System.out.println("員工的工資: " + employee.calculateSalary());
}
}
public class Demo {
public static void main(String[] args) {
Company company = new Company();
company.lookEmployeeSalary(new Manager("001", "經理一號",20000, 3000));
System.out.println("============================");
company.lookEmployeeSalary(new Programmer("002", "程式員一號",20000, 3000));
}
}