封裝、繼承、多型
繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
extands關鍵字擴充套件
封裝
/* 封裝-隱藏內部資訊,透過介面訪問
1、“高內聚,低耦合”-該露的露,該藏得藏 屬性私有,get/set
2、提高程式的安全性,保護資料
3、隱藏程式碼的實現細節
4、統一介面
5、提高系統的可維護性
*/
package oop;
//類 private:私有
public class B1 {
//對於學生有 名字,學號,性別,學習方法(),睡覺方法()
//屬性私有
private String name;
private int id;
private char sex;
private int age;
//提供一些可以操作這個屬性得方法-提供一些public的get、set方法
//get-獲得這個資料,set-給這個資料設定值
//Alt+insert也可以自動生成get和set
public String getName(){ //getName和setName自動生成-遵守駝峰規則
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<120 && age>0){
this.age = age;
}else{
this.age = 3;
}
}
}
/*
//封裝的輔助程式
//println按住加countrol 方法過載-主要看方法名和引數列表是否對應
package oop;
public class BI1 {
public static void main(String[] args) {
B1 b1 = new B1();
// bi.name = "";使用得private會報紅,換成public就不會
b1.setName("小白");
System.out.println(b1.getName());
b1.setAge(999); //不合法的,可以在語法中輔助判斷
System.out.println(b1.getAge());
}
}
*/
繼承-extend
繼承和object類
/* 繼承-類跟類之間的關係(父子) 除此之外還有其他關係 object類
Control+H-開啟了一個繼承樹
java中只有單繼承,沒有多繼承,但可以有多個繼承者
私有的東西無法被繼承
在java中,所有的類都預設直接或間接繼承object類
*/
package oop;
//C1 人 父類
public class C1 {
//public-公共的,protected-受保護的,default-預設的,private-私有的 一般繼承都是public,屬性裡才用private
private int age = 99;
public int money = 10_0000_0000;
public void say(){
System.out.println("說了一句話");
}
}
/*
/* 輔助理解繼承
1、子類繼承了父類,就會擁有了父類的全部方法
*/
/* //extends
package oop;
//Student is 人 子類
public class Student extends C1 {
}
*/
package oop;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say(); //子類繼承了父類,就會擁有了父類的全部方法
System.out.println(student.money);
// System.out.println(student.age); //父類private,會報錯
}
}
*/
Super的定義和使用
/* super
1、super呼叫父類的構造方法,必須在構造方法的第一個
2、super必須只能出現在子類的方法或者構造方法中
3、super和this不能同時呼叫構造方法
Vs this
代表的物件不同
this:本身呼叫者這個物件
super:代表父類物件的引用
前提
this:沒有繼承也可以使用
super:只能在繼承條件下才可以使用
構造方法
this:呼叫本類的構造
super:呼叫父類的構造
*/
/*
package oop;
//C1 人 父類
public class C1 {
//public-公共的,protected-受保護的,default-預設的,private-私有的 一般繼承都是public,屬性裡才用private
protected String name = "大黑" ;
public C1(){
System.out.println("父類C1的無參構造器");
}
}
*/
package oop;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("二黃");
}
}
/*
//super
//Control+H-開啟了一個繼承樹
package oop;
//Student is 人 子類
public class Student extends C1 {
public Student(){
super();//呼叫父類的構造器,必須在子類構造器的第一行; 也可以不寫,它自己預設呼叫
System.out.println("Student的無參執行了");
}
private String name = "小白";
public void test(String name){
System.out.println(name);//二黃
System.out.println(this.name);//小白
System.out.println(super.name); //大黑-子類呼叫父類屬性
}
}
*/
Override重寫的定義和使用
/* 方法重寫
1、重寫都是方法的重寫,和屬性無關
2、重寫的修飾符只能說public,不能是private
重寫原因
1、父類的功能子類不一定需要或不一定滿足
2、Alt+Insert-override;
重寫總結:
重寫子類和父類的方法必須要一致,方法體不同
1、需要有繼承關係,子類重寫父類的 方法
2、方法名必須相同、引數列表必須相同、修飾符:範圍可以擴大,但不能縮小 public》Protected》Dewault》private
3、丟擲的異常範圍可以被縮小,但不能擴大:Exception(大)-->ClassNotFoundException(小)
*/
package oop;
public class Application {
//靜態方法和非靜態方法輸出區別很大 D2會成D1
//靜態方法:方法的呼叫只和左邊,定義的類有關
//非靜態方法:子類重寫了父類的方法
public static void main(String[] args) {
D1 d1 = new D1();
d1.test();
// 父類的引用指向了子類
D2 d2 = new D1();
d2.test();
}
}
/*
package oop;
public class D1 extends D2 {
//Overrried-重寫
@Override //註解-有功能的註釋!
public void test() {
System.out.println("D1==>test");
}
}
/*
public void test() {
System.out.println("D1==>test");
}
*/
*/
/*
package oop;
public class D2 {
public void test(){
System.out.println("D2==>test");
}
}
*/
多型
/* 多型-多種方法發生方式
1、多型是方法的多型,屬性沒有多型
2、父類和子類的型別應該相同 ClassCastException!-型別異常報錯
3、存在的條件
繼承關係
方法需要重寫,父類引用指向子類物件
不能重寫的方法 1、static 方法 屬於類,不屬於實列
2、final 常量
3、private 方法
*/
package oop;
public class Application {
public static void main(String[] args) {
//一個物件的實際型別是確定的 如:new E2();new E1();
//但可以指向的引用型別就不確定了
//子類能呼叫的方法都是自己的或繼承父類
E2 s1 = new E2();
E2 s2 = new E2();
//透過父類的引用指向子類
//父類雖然可以指向子類,但不能呼叫子類的方法
E1 s3 = new E2();
//Object 預設擁有
Object s4 = new E2();
//子類繼承了父類的全部方法,如果子類重寫了父類的方法就是走子類的程式
s3.run();
s1.run();
//物件能執行那些型別,主要看左邊和右邊關係不大
// s3.eat();//此行會報錯,E1裡沒有eat; 只用透過((E2)s3).eat;進行強制轉換
s1.eat();
}
}
/*
package oop;
public class E1 {
public void run(){
System.out.println("run");
}
}
*/
/*
package oop;
public class E2 extends E1{
public void run(){
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
*/