目錄
- 封裝
-
- 封裝的作用
- 封裝的步驟
- 繼承
-
- 繼承的作用
- 繼承的格式:
- 繼承細節:
-
- 注意點1:預設通路修飾符的特殊性
- 注意點2:
- 注意點3:
- 注意點4:
- 注意點5:
- 注意點6:
- 注意點7:
- 繼承的本質分析(重要)
-
- 繼承的記憶體布局
- 屬性通路(就近原則)
- 繼承例子
封裝
封裝的作用
封裝操作和我們利用遙控器調節音量控制電視機很類似
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwIzXlpXazxCcXJXNPJDc1cWeiVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1IDM0YjZ5E2MwczY1ATY4YjY0QTYykjM1kDN0QWNmBzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
封裝的步驟
person.salary=2000;//報錯了因為salary是private的是以隻能在本類使用
這裡就展現出來封裝的重要性,對于私有屬性的資料不能随意更改和通路
package Java_base_study;
public class Encap_example {
public static void main(String[] args) {
Person person = new Person();
//嘗試去對于person 對象賦初值
//使用傳統方法
person.name="zlh";
//person.salary=2000;//報錯了因為salary是private的是以隻能在本類使用
//這裡就展現出來封裝的重要性,對于私有屬性的資料不能随意更改和通路
//既然如此我們該怎麼辦呢?
//這裡我們就要借助Person類的set()和get()方法,它們是可以通路private屬性的資料的呀
person.setSalary(2000);//成功!!!
}
}
class Person {
//定義一個Person 類要求除了人名其他都對外保密
public String name;
private int age;
private int salary;
private String job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
繼承
繼承的作用
繼承的格式:
繼承細節:
這裡需要注意非私有屬性和方法可以在子類直接通路(為什麼預設屬性的資料也可以直接通路呢?)
注意點1:預設通路修飾符的特殊性
在同一個包下預設通路修飾符可以通路父類
但是假如跨包了就不能通路
打個比方:
Package1:
Class Student (屬性有預設的int age,私有的private int score)
Class grduate(extends Student)------>這時候由于他倆在一個包下是以子類可以通路父類的預設屬性資訊int age
Package2:
Class pupil(繼承可以跨包嗎?不管能不能反正現在pupil子類一定沒辦法通路到父類的預設屬性資訊int age)
注意點2:
子類構造器在調用時必須先去調用父類的構造器
順序:
父類構造器被調用()
子類構造器被調用()
注意點3:
假如父類沒有提供無參構造器,必須在子類構造器中用super關鍵字指定調用父類的哪個構造器
比如:父類隻有一個有參構造器 public Student (String name,int age){
this.name=name; this.age=age;
}
此時由于父類沒有提供無參構造器,我們需要在子類構造器中加入super(“小張”,100);
表明我們調用的是public Student (String name,int age)這個構造器
注意點4:
super()隻能在構造器中使用,且必須放在第一行
注意點5:
在構造器中可以使用this()調用另一個構造器但是必須放在第一行,是以this()和super()語句不能共存
注意點6:
java所有類都是Object類的子類, Object是所有類的基類.
注意點7:
子類最多隻能直接繼承一個父類(單繼承機制)
繼承的本質分析(重要)
繼承的記憶體布局
屬性通路(就近原則)
在就近原則查找屬性是假如因為一個資料是私有的而無法通路會直接報錯,不會再到父類查找資料
比如:
son類的age我們定義為private那麼通路son.age時,會直接報錯,不會去找father.age然會傳回father類的年齡!!!
繼承例子
=Computer類=
package ExtendsExercise;
public class Computer {
// 編寫Computer類,包含CPU、記憶體、硬碟等屬性,getDetails方法用于傳回Computer的詳細資訊
// 編寫PC子類,繼承Computer類,添加特有屬性【品牌brand】
private String cpu;
private int neicun;
private int disk;
//構造器
public Computer(String cpu, int neicun, int disk) {
this.cpu = cpu;
this.neicun = neicun;
this.disk = disk;
}
//輸出computer的詳細資訊(這裡試過了預設和public都可以不影響)
public String getDetails(){
return("cpu"+cpu+"neicun"+neicun+"disk"+disk);
}
//get 和 set 函數
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public int getNeicun() {
return neicun;
}
public void setNeicun(int neicun) {
this.neicun = neicun;
}
public int getDisk() {
return disk;
}
public void setDisk(int disk) {
this.disk = disk;
}
}
=ipad類=
package ExtendsExercise;
public class ipad extends Computer{
//編寫NotePad子類,繼承Computer類,添加特有屬性【color】
private String color;
//==很有意思的是假如這裡我們不編寫ipad(...)構造器,會報錯Computer類沒有預設構造器這是為啥?==
//==我們知道ipad類中預設有ipad()構造器裡面預設有super()調用Computer的無參構造器==
//假如這裡我們不寫有參構造器,他就去調用Computer的無參構造器,但Computer類裡沒無參構造器啊,當然會報錯.
public ipad(String cpu, int neicun, int disk, String color) {
super(cpu, neicun, disk);
this.color = color;
}
public String getInfo(){
//注意getDetails()雖然是Computer類中方法但是是public的,是以ipad也能調用。
return getDetails()+"color"+color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}