這輩子沒辦法做太多事情伯病,所以每一件都要做到精彩絕倫凉逛。 --------史蒂夫.喬布斯
代碼塊
(1)用{}括起來的代碼税灌。
(2)分類:
A:局部代碼塊
用于限定變量的生命周期,及早釋放陵且,提高內存利用率货葬。
B:構造代碼塊
把多個構造方法中相同的代碼可以放到這里,每個構造方法執(zhí)行前贴届,首先執(zhí)行構造代碼塊靠粪。
C:靜態(tài)代碼塊
對類的數(shù)據(jù)進行初始化,僅僅只執(zhí)行一次毫蚓。
(3)靜態(tài)代碼塊,構造代碼塊,構造方法的順序問題?
靜態(tài)代碼塊 > 構造代碼塊 > 構造方法
/*
代碼塊:在Java中占键,使用{}括起來的代碼被稱為代碼塊。
根據(jù)其位置和聲明的不同元潘,可以分為
局部代碼塊:局部位置,用于限定變量的生命周期畔乙。
構造代碼塊:在類中的成員位置,用{}括起來的代碼牲距。每次調用構造方法執(zhí)行前牍鞠,都會先執(zhí)行構造代碼塊皮服。
作用:可以把多個構造方法中的共同代碼放到一起,對對象進行初始化硫眯。
靜態(tài)代碼塊:在類中的成員位置,用{}括起來的代碼,只不過它用static修飾了两入。
作用:一般是對類進行初始化裹纳。
面試題?
靜態(tài)代碼塊,構造代碼塊,構造方法的執(zhí)行順序?
靜態(tài)代碼塊 -- 構造代碼塊 -- 構造方法
靜態(tài)代碼塊:只執(zhí)行一次
構造代碼塊:每次調用構造方法都執(zhí)行
*/
class Student {
static {
System.out.println("Student 靜態(tài)代碼塊");
}
{
System.out.println("Student 構造代碼塊");
}
public Student() {
System.out.println("Student 構造方法");
}
}
class StudentDemo {
static {
System.out.println("小源同學都21了,我很傷心");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
/*
寫程序的執(zhí)行結果朋鞍。
小源同學都21了妥箕,我很傷心
我是main方法
Student 靜態(tài)代碼塊
Student 構造代碼塊
Student 構造方法
Student 構造代碼塊
Student 構造方法
*/
繼承
(1)把多個類中相同的成員給提取出來定義到一個獨立的類中。然后讓這多個類和該獨立的類產生一個關系坎吻,
這多個類就具備了這些內容宇葱。這個關系叫繼承贝搁。
(2)Java中如何表示繼承呢?格式是什么呢?
A:用關鍵字extends表示
B:格式:
class 子類名 extends 父類名 {}
(3)繼承的好處:
A:提高了代碼的復用性
B:提高了代碼的維護性
C:讓類與類產生了一個關系,是多態(tài)的前提
(4)繼承的弊端:
A:讓類的耦合性增強弦讽。這樣某個類的改變往产,就會影響其他和該類相關的類仿村。
原則:低耦合蔼囊,高內聚畏鼓。
耦合:類與類的關系
內聚:自己完成某件事情的能力
B:打破了封裝性
(5)Java中繼承的特點
A:Java中類只支持單繼承
B:Java中可以多層(重)繼承(繼承體系)
(6)繼承的注意事項:
A:子類不能繼承父類的私有成員
B:子類不能繼承父類的構造方法膳沽,但是可以通過super去訪問
C:不要為了部分功能而去繼承
(7)什么時候使用繼承呢?
A:繼承體現(xiàn)的是:is a的關系让禀。
B:采用假設法
(8)Java繼承中的成員關系
A:成員變量
a:子類的成員變量名稱和父類中的成員變量名稱不一樣巡揍,這個太簡單
b:子類的成員變量名稱和父類中的成員變量名稱一樣痛阻,這個怎么訪問呢?
子類的方法訪問變量的查找順序:
在子類方法的局部范圍找腮敌,有就使用录平。
在子類的成員范圍找缀皱,有就使用动猬。
在父類的成員范圍找啤斗,有就使用。
找不到赁咙,就報錯钮莲。
B:構造方法
a:子類的構造方法默認會去訪問父類的無參構造方法
是為了子類訪問父類數(shù)據(jù)的初始化
b:父類中如果沒有無參構造方法彼水,怎么辦?
子類通過super去明確調用帶參構造
子類通過this調用本身的其他構造凤覆,但是一定會有一個去訪問了父類的構造
讓父類提供無參構造
C:成員方法
a:子類的成員方法和父類中的成員方法名稱不一樣盯桦,這個太簡單
b:子類的成員方法和父類中的成員方法名稱一樣,這個怎么訪問呢?
通過子類對象訪問一個方法的查找順序:
在子類中找拥峦,有就使用
在父類中找刑峡,有就使用
找不到洋闽,就報錯
(9)兩個面試題:
A:Override和Overload的區(qū)別?Overload是否可以改變返回值類型?
Override:方法重寫
Overload:方法重載
方法重寫:在子類中,出現(xiàn)和父類中一模一樣的方法聲明的現(xiàn)象突梦。
方法重載:同一個類中诫舅,出現(xiàn)的方法名相同,參數(shù)列表不同的現(xiàn)象阳似。
方法重載能改變返回值類型骚勘,因為它和返回值類型無關。
B:this和super的區(qū)別和各自的作用?
this:代表當前類的對象引用
super:代表父類存儲空間的標識撮奏。(可以理解為父類的引用俏讹,通過這個東西可以訪問父類的成員)
場景:
成員變量:
this.成員變量
super.成員變量
構造方法:
this(...)
super(...)
成員方法:
this.成員方法
super.成員方法
(10)數(shù)據(jù)初始化的面試題
A:一個類的初始化過程
B:子父類的構造執(zhí)行過程
C:分層初始化
/*
繼承概述:
把多個類中相同的內容給提取出來定義到一個類中。
如何實現(xiàn)繼承呢?
Java提供了關鍵字:extends
格式:
class 子類名 extends 父類名 {}
好處:
A:提高了代碼的復用性
B:提高了代碼的維護性
C:讓類與類之間產生了關系畜吊,是多態(tài)的前提
類與類產生了關系泽疆,其實也是繼承的一個弊端:
類的耦合性增強了。
開發(fā)的原則:低耦合玲献,高內聚殉疼。
耦合:類與類的關系
內聚:就是自己完成某件事情的能力
*/
//使用繼承前
/*
class Student {
public void eat() {
System.out.println("吃飯");
}
public void sleep() {
System.out.println("睡覺");
}
}
class Teacher {
public void eat() {
System.out.println("吃飯");
}
public void sleep() {
System.out.println("睡覺");
}
}
*/
//使用繼承后
class Person {
public void eat() {
System.out.println("吃飯");
}
public void sleep() {
System.out.println("睡覺");
}
}
class Student extends Person {}
class Teacher extends Person {}
class ExtendsDemo {
public static void main(String[] args) {
Student s = new Student();
s.eat();
s.sleep();
System.out.println("-------------");
Teacher t = new Teacher();
t.eat();
t.sleep();
}
}
/*
看程序寫結果:
A:成員變量 就近原則
B:this和super的問題
this訪問本類的成員
super訪問父類的成員
C:子類構造方法執(zhí)行前默認先執(zhí)行父類的無參構造方法
D:一個類的初始化過程
成員變量進行初始化
默認初始化
顯示初始化
構造方法初始化
結果:
fu
zi
30
20
10
*/
class Fu{
public int num = 10;
public Fu(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num = 20;
public Zi(){
System.out.println("zi");
}
public void show(){
int num = 30;
System.out.println(num); //30
System.out.println(this.num); //20
System.out.println(super.num); //10
}
}
class ExtendsTest {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
?
/*
看程序寫結果:
A:一個類的靜態(tài)代碼塊,構造代碼塊,構造方法的執(zhí)行流程
靜態(tài)代碼塊 > 構造代碼塊 > 構造方法
B:靜態(tài)的內容是隨著類的加載而加載
靜態(tài)代碼塊的內容會優(yōu)先執(zhí)行
C:子類初始化之前先會進行父類的初始化
結果是:
靜態(tài)代碼塊Fu
靜態(tài)代碼塊Zi
構造代碼塊Fu
構造方法Fu
構造代碼塊Zi
構造方法Zi
*/
class Fu {
static {
System.out.println("靜態(tài)代碼塊Fu");
}
{
System.out.println("構造代碼塊Fu");
}
public Fu() {
System.out.println("構造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("靜態(tài)代碼塊Zi");
}
{
System.out.println("構造代碼塊Zi");
}
public Zi() {
System.out.println("構造方法Zi");
}
}
class ExtendsTest2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}
思考
1:代碼塊是什么?代碼塊的分類和各自特點?
2:靜態(tài)代碼塊,構造代碼塊,構造方法的執(zhí)行流程?
3:繼承概述
4:繼承的好處
5:Java中繼承的特點
6:Java中繼承的注意事項?以及我們什么時候使用繼承?
7:繼承中的成員訪問特點
A:成員變量
在子類方法中訪問一個變量
B:成員方法
在測試類中通過子類對象去訪問一個方法
8:繼承中構造方法的執(zhí)行流程?假如父類沒有無參構造方法,子類應該怎么辦?
9:面試題:
方法重寫和方法重載的區(qū)別?方法重載能改變返回值類型嗎?
Overload
Override
this關鍵字和super關鍵字分別代表什么?以及他們各自的使用場景和作用捌年。
10:繼承案例練習
11:猜數(shù)字小游戲練習瓢娜。
通過API學習并使用Math類的random()方法。