目的
今天的學(xué)習(xí)是關(guān)于繼承關(guān)系慕淡、代碼塊和內(nèi)部類的學(xué)習(xí)背伴。具體的是完成了一個Person父類,借父類編碼了一個Salary組,話不多說傻寂,開始今天的學(xué)習(xí)息尺。
繼承關(guān)系
在Java中,我們創(chuàng)建的一個類疾掰,再進行創(chuàng)建類時需要用到上個類的屬性以及變量搂誉,可以使用繼承來獲得上個類的內(nèi)容。繼承的關(guān)鍵字是extants 静檬,具體的使用方式為A extants B炭懊,A獲得B的屬性和變量/A繼承B(A為子類,B為父類)拂檩。我們在使用是要注意侮腹,Java 中只存在單繼承關(guān)系,要實現(xiàn)多繼承只能變相完成稻励,即A想繼承B父阻、C屬性變量只能通過A繼承B,而B繼承C的方式完成望抽。下面創(chuàng)建一個Person類為父類加矛,用Students類為子類完成實踐。
class Person{
String name;
int age;
public void walk() {
}
public void eat() {
}
}
class Students extends Person1{
private int salary;
@Override
public String toString() {
return "Salary{" +
"hobby='" + name + '\'' +
", age=" + age +
'}';
}
}
代碼塊
- 代碼塊是什么糠聪?
代碼塊是一種常見的代碼形式荒椭。他用大括號“{}”將多行代碼封裝在一起,形成一個獨立的代碼區(qū)舰蟆,這就構(gòu)成了代碼塊趣惠。
普通代碼塊:是最常見的代碼塊,在方法里用一對“{}”括起來的數(shù)據(jù)身害,就是普通的代碼塊
構(gòu)造代碼塊:是在類中直接定義的味悄,用“{}”括起來的代碼。每次調(diào)用構(gòu)造方法前執(zhí)行塌鸯,都會先執(zhí)行構(gòu)造代碼塊侍瑟。
靜態(tài)代碼塊:他在類中的成員位置,用“{}”括起來的代碼丙猬。只不過他用了static修飾了涨颜,,且執(zhí)行一次 - 代碼塊有什么用茧球?
簡單的說庭瑰,封裝。把需要多次使用的屬性和方法封裝起來抢埋,使用時直接調(diào)用弹灭,或者設(shè)置在某些環(huán)境下的特殊功能
內(nèi)部類學(xué)習(xí)
我們創(chuàng)建一個類之后督暂,在類的內(nèi)部在定義一個新的類。這個類就是內(nèi)部類穷吮,這個類含有內(nèi)部類的類稱為外部類逻翁。內(nèi)部類可以調(diào)用外部類的屬性和變量,外部類不能直接使用內(nèi)部類的東西捡鱼。需要使用時要通過創(chuàng)建一個新的對象來間接使用八回。簡單的說內(nèi)部類就是 一個類定義在另一個類的內(nèi)部
我們使用內(nèi)部類的原因是:
- 一個內(nèi)部類的對象能夠訪問創(chuàng)建它的對象的實現(xiàn),包括私有數(shù)據(jù)堰汉。
- 對于同一個包中的其他類來說辽社,內(nèi)部類能夠隱藏起來。
- 匿名內(nèi)部類可以很方便的定義回調(diào)翘鸭。
-
使用內(nèi)部類可以非常方便的編寫事件驅(qū)動程序
image.png
設(shè)計一個簡單的繼承關(guān)系
要求:image.png
具體代碼為:
public class Person2 {
protected String name;
protected int age;
public Person2(String name, int age){
this.name = name;
this.age = age;
}
public void walk(){
}
public void eat(){
}
}
class CivilServant extends Person2{
private int salary;
private int count;
public CivilServant(String name, int age,
int salary, int count){
super(name, age);
this.salary = salary;
this.count = count;
}
@Override
public void walk() {
System.out.println("慢慢地走");
}
@Override
public void eat() {
System.out.println("大吃大喝");
}
public void cShow() {
System.out.println("CivilServant{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", count=" + count +
'}');
}
}
class Worker extends Person2{
private int salary;
private String tec;
public Worker(String name, int age, int salary,
String tec){
super(name, age);
this.salary = salary;
this.tec = tec;
}
@Override
public void walk() {
System.out.println("快跑呢");
}
@Override
public void eat() {
System.out.println("急匆匆吃");
}
public void wShow() {
System.out.println( "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", tec='" + tec + '\'' +
'}');
}
}
class Test3{
public static void main(String[] args){
// Person[] peoples = new Person[6];
ArrayList<Person2> peoples = new ArrayList<>();
Person2 c1 = new CivilServant("小王", 30, 5000, 30);
Person2 c2 = new CivilServant("小李", 32, 7000, 34);
Person2 c3 = new CivilServant("張三", 33, 2000, 32);
//peoples.add((Person2)c1);
peoples.add(c1);
peoples.add(c2);
peoples.add(c3);
Person2 w1 = new Worker("Jack",23,8922, "Android開發(fā)");
Person2 w2 = new Worker("Rose",22,10323, "iOS開發(fā)");
Person2 w3 = new Worker("Merry",20,8123, "web開發(fā)");
peoples.add(w1);
peoples.add(w2);
peoples.add(w3);
for (Person2 p: peoples){
//找到p到底是哪個類型的對象
if(p instanceof CivilServant){
//公務(wù)員
CivilServant c = (CivilServant)p;
c.cShow();
c.walk();
c.eat();
}else{
//員工
Worker w = (Worker)p;
w.wShow();
w.walk();
w.eat();
}
}
}
}