封裝
- 該露的露,該藏的藏
- 我們程式設計要追求,“高內聚,低耦合”。高內聚就是類的內部資料操作細節自己完成。不允許外部干涉;低耦合:僅暴漏少量的方法給外部使用。
- 封裝(資料的隱藏)
- 通常,應禁止訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
- 記住這句話就夠了:屬性私有,get/set
package com.baidu.oop.demo04;
//類
public class Student {
//私有屬性
private String name; //名字
private int id;//學號
private char sex;//性別
private int age;
//提供一些方法操作和這個屬性的方法!
//提供一些public的get,set方法
//get 獲得這個資料
public String getName(){
return this.name;
}
//set 給這個資料設定值
public void setName(String name){
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age>120 || age<0) {//不合法
this.age = 3;
}else {
this.age = age;
}
}
}
//測試類
import com.baidu.oop.demo04.Student;
/*
1.提高程式的安全性,保護資料
2.隱藏程式碼的實現細節
3.統一介面
4.系統可維護增加了
*/
//一個專案應該只存在一個main方法
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("韓鎖");
//方法名,引數列表
System.out.println(s1.getName());
s1.setAge(-1);//不合法
System.out.println(s1.getAge());
}
//alt+insert
}
繼承
- 繼承的本質是對某一批類的抽象。從而實現對現實世界更好建模
- extents的意思是“擴充套件”。子類是弗雷的擴充套件。
- Java中類只有單繼承,沒有多繼承!(一個兒子只能有一個爸爸,但是一個爸爸可以有多個兒子)
- 繼承是類和類之間的一種關係。除此以外,類和類之間的關係還有依賴,組合,聚合等。
- 繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends類表示。
- 子類和父類之間,從意義上講應該具有“is a”的關係
- object類
- super
- 方法重寫
//person類
package com.baidu.oop.demo05;
//在Java中,所有的類,都預設直接或者間接繼承Object類
//Person 人 : 父類
public class Person /*extends Object*/{
public Person() {
System.out.println("Person無參執行了");
}
//public
//protected
//default
//private
protected String name = "輕狂書生";
public void print(){
System.out.println("Person");
}
}
//teacher類
package com.baidu.oop.demo05;
//Teacher is 人 :派生類或子類
public class Teacher extends Person{
}
//學生類
package com.baidu.oop.demo05;
//學生 is 人 : 派生類:子類
//子類繼承了父類,就會擁有父類的全部方法!
public class Student extends Person{
public Student(){
//隱藏程式碼:呼叫了父類的無參構造
super();//呼叫父類的構造器,必須要在子類的構造器的第一行
System.out.println("Student無參構造執行了");
}
private String name = "韓鎖";
public void print(){
System.out.println("Student");
}
public void test1(){
print();//Student
this.print();//Student
super.print();//Person
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
//測試類
package com.baidu.oop.demo05;
public class Application {
public static void main(String[] args) {
Student student = new Student();
//student.test("鎖子哥");
//student.test1();
}
}
/*
super注意點:
1.super呼叫父類的構造方法,必須在構造方法的第一行
2.super必須只能出現在子類的方法或者構造方法中!
3.super和this不能同事呼叫構造方法!
VS this:
1.代表的物件不同
this:本身呼叫的這個物件
super: 代表父類物件的應用
前提
this: 沒有繼承也可以使用
super:只能在繼承條件下才可以使用
構造方法
this();本類的構造
super();父類的構造
*/
//靜態方法和非靜態方法的區別很大
//靜態方法:方法的呼叫只能和左邊,定義的資料型別有關
//非靜態:重寫
public static void main(String[] args) {
A a = new A();
a.test();//A
//父類的引用指向子類
B b = new A();//子類重寫了父類的方法
b.test();//B
}
/*
重寫:需要有繼承關係,子類重寫父類的方法!
1.方法名必須相同
2引數列表必須相同
3.修飾符:範圍可以擴大但不能縮小: public>protected>default>private
4.丟擲異常:範圍,可以被縮小,但不能擴大: ClassNotFoundException--->Exception(大)
重寫,子類的方法和父類必須要一致,方法體不同!
為什麼需要重寫:
1.父類的功能,子類不一定需要,或者不一定滿足
Alt + Insert : override;
*/
多型
- 動態編譯:型別:可擴充套件性
- 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式
- 一個物件的實際型別是確定的,但可以只想物件的引用的型別有很多(父類,有關係的類)
- 多型存在的條件
- 有繼承關係
- 子類重寫父類方法
- 父類引用只想子類物件
- 注意:多型是方法的多型,屬性沒有多型性
- instanceof (型別轉換) ~ 引用型別,判斷一個物件是什麼型別~
package com.baidu.oop;
import com.baidu.oop.demo06.Person;
import com.baidu.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//一個物件的實際型別是確定的
//new Student();
//new Person();
//可以指向的引用型別就不確定了,父類的引用指向子類的型別
//Student能呼叫的方法都是自己的或者繼承父類的
Student s1 = new Student();
//Person 父型別,可以指向子類,但是不能呼叫子類獨有的方法
Person s2 = new Student();//父類的引用指向子類的型別
Object s3 = new Student();
//物件能執行那些方法,主要看物件左邊的型別,和右邊關係不大
((Student)s2).eat();//子類重寫了父類的方法,執行了子類的方法
//s1.eat();
}
}
package com.baidu.oop.demo06;
public class Student extends Person{
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
package com.baidu.oop.demo06;
public class Person {
public void run() {
System.out.println("run");
}
}
/*
多型注意事項:
1.多型是方法的多型,屬性沒有多型
2.父類和子類,有聯絡 型別轉換異常! ClassCastException!
3.存在條件:繼承關係,方法需要重寫,父類引用指向子類物件 father f1 = new Son();
1.static方法,屬於類他不屬於例項
2.final常量
3.privat方法
*/
//instanceof和型別轉換
package com.baidu.oop;
import com.baidu.oop.demo06.Person;
import com.baidu.oop.demo06.Student;
import com.baidu.oop.demo06.Teacher;
public class Application {
public static void main(String[] args) {
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Object object = new Student();
//System.out.println(X instanceof Y);//能不能編譯通過
System.out.println(object instanceof Student);//True
System.out.println(object instanceof Person);//T
System.out.println(object instanceof Object);//T
System.out.println(object instanceof Teacher);//False
System.out.println(object instanceof String);//F
System.out.println("--------------------------------------------");
Person person = new Student();
System.out.println(person instanceof Student);//True
System.out.println(person instanceof Person);//T
System.out.println(person instanceof Object);//T
System.out.println(person instanceof Teacher);//False
//System.out.println(person instanceof String);//編譯報錯
Student student = new Student();
System.out.println("--------------------------------------------");
System.out.println(student instanceof Student);//True
System.out.println(student instanceof Person);//T
System.out.println(student instanceof Object);//T
//System.out.println(student instanceof Teacher);//編譯出錯
//System.out.println(person instanceof String);//編譯報錯
}
}
import com.baidu.oop.demo06.Person;
import com.baidu.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//型別之間的轉化:父 子
//高 低
Person obj = new Student();
//Student將這個物件轉換為Student型別,我們就可以使用Student型別的方法了
Student student = (Student)obj;
student.go();
//((Student) obj).go();
}