全文純手打,不喜勿噴~ OOP封裝 //封裝一個類:用來管理普通人的特性和行為 //1、類的概念:人類在認識客觀世界時,發現某些事物具有共同特性,共同結構,共同行為。 // 為了方便,我們就將它們集合起來,並抽象出一個概念類管理它們,這個概念就是類。 //2、類的組成:標準類由:實例變數、構造器、設 ...
全文純手打,碼字不易,且碼且珍惜~
--------------------------------------------OOP封裝--------------------------------------------
//封裝一個類:用來管理普通人的特性和行為
//1、類的概念:人類在認識客觀世界時,發現某些事物具有共同特性,共同結構,共同行為。
// 為了方便,我們就將它們集合起來,並抽象出一個概念類管理它們,這個概念就是類。
//2、類的組成:標準類由:實例變數、構造器、設定器、訪問器和功能方法五個部分組成
//3、類的使用:先構造對象(new+構造器),再通過對象的方法來完成業務(對象名。方法名)
class Person{
//人的屬性(域、欄位、實例變數、成員變數)
private String name;//姓名
private boolean sex;//ture為男,false為女
private Date birthday;//生日
//構造器(1、方法名和類名相同 2、沒有返回值)
public Person(){
}
public Person(String name,boolean sex,Date birthday){
this.name=name;
this.sex=sex;
this.birthday=birthday;
}
//設定器:用來為對象設置或改變屬性的值
public void setName(String name){
this.name=name;
}
public void setSex(boolean sex){
this.sex=sex;
}
public void setBirthday(Date birthday){
this.birthday=birthday;
}
//訪問器:用來獲取對象的屬性值
public String getName(){
return name;
}
public boolean getSex(){
return sex;
}
public Date getBirthday(){
return birthday;
}
//功能方法:為了完成業務而設計的方法
//返回運算結果,實現簡單的加法運算
public int add(int x,int y){
return x+y;
}
//返回輸出信息,重寫了父類的方法,這個方法是預設且自動調用的
public String toString(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String str=sdf.format(birthday);
return "姓名:"+name+"\t性別"+(sex?"男":"女")+"\t生日"+str;
}
}
//變數的概念:電腦記憶體中的一個存儲單元,它的值可以隨著程式的運行發生改變
//數據類型:基本類型(存儲數據本身)、引用類型(存儲指向對象的地址)
//Java Application 用來完成業務的類
public class PersonTest{
public static void main(String[] args){
//局部變數:方法或語句塊中定義的變數
String name="劉德華";
boolean sex=true;
int age=20;
//對象變數p1 p2
Person p1=null;
p1=new Person();
person p2=new Person();
//實現業務:加法運算
int a=100;
int b=200;
int re=p1.add(a,b);
System.out.println(a+"+"+b+"="+re);
//實現業務:修改屬性
p1.setName(name);
p1.setSex(sex);
p1.setBirthday(new Date());
System.out.println(p1);
//以下現實對繼承類Student的代碼的測試
Student stu=new Student();
re=stu.add(50,100);
System.out.println(re);
}
}
--------------------------------------------OOP繼承--------------------------------------------
//學生是一種普通人,學生有普通人派生而來,成為一種特殊的普通人
//從學生身上可以看到普通人的所有特性,也可以看到只屬於學生不屬於普通人的特性
//使用繼承,讓子類在編寫時的效率更高了,因為子類與父類分共性不用寫了
//使用繼承,讓父類分代碼極大地提高了重用性
public class Student extends Person{
//子類的個性
private String school;
private int score;
//子類的構造器
public Student(){
}
public Student(String name,boolean sex,Date birthday,String school,int score){
super(name,sex,birthday);//藉助父類的構造器
this.school=school;
this.score=score;
}
//設定器、訪問器代碼略過
//功能方法:
//重寫(覆蓋)父類的方法add(),大部分情況下方法頭不變
//為什麼要重寫?因為現有的業務父類完成的不夠好,達不到我們的業務要求。
public int add(int x,int y){//此行是方法頭
//業務要求輸出:下麵這行信息,父類的add方法不行,所以調用子類來運算和輸出
System.out.println("程式調用了Student類(子類)去完成加法運算");
return x+y;
}
}
--------------------------------------------OOP多態--------------------------------------------
//經典題型:不同圖形計算面積
//什麼是多態:同一類的對象 接受相同的信息 做出不同的反應
//抽象的平面圖形類,裡面含有抽象方法area();抽象類不能被實例化,但它的子類可以。
abstract class Shape{
private String type;
//構造器
public Shape(){}
public Shape(String type){
this.type=type;
}
//設定器、訪問器代碼略過
//功能方法:
//求平面圖形的面積:由於不知道求什麼圖形,從而面積無法具體實現;所以使用抽象方法
public abstract double area();
//重寫父類toString()方法,來滿足現在的業務需求
@Override
public String toString(){
return "圖形是:"+type;
}
}//shape類結束
//子類-圓,圓是平面圖形之一
class Circle extends Shape{
//子類的個性
private double r;
//圓的構造器
public Circle(String type,double r){
super(type);
this.r=r;
}
//設定器、訪問器代碼略過
//功能方法:
//可以通過重寫父類代碼,來滿足新的業務需求
@Override
public double area(){
return Math.PI*Math.pow(r,2);
}
@Override
public String toString(){
return super.toString+"\t 它的半徑是:"+r+" 它的面積是"+this.area();
}
}//Circle類結束
//子類-矩形
class Rectangle extends Shape{
//個性
private int length;
private int wide;
//構造器
public Rectangle(String type,int length,int wide){
super(type);
this.length=length;
this.wide=wide;
}
//設定器、訪問器代碼略過
//功能方法:
public double area(){
return length*wide;
}
public String toString(){
return super.toString+",長度為:"+length+",寬度為:"+wide+",面積為"+this.area();
}
}//Rectangle類結束
//Java Application 業務測試類、業務實現類、體現多態的類;
public class ShapeTest{
public static void main(String[] args){
//第一種方式:簡單的多態
Shape s1=new Circle("圓",5.5);
Shape s2=new Rectangle("矩形",12,30);
s1.area();//簡單多態
s2.area();//簡單多態
//第二種方式:多個圖形,指定大小
Circle c1=new Circle("圓",4.5);
Circle c1=new Circle("圓",5.5);
Rectangle r1=new Rectangle("矩形",12,30);
Rectangle r1=new Rectangle("矩形",22,35);
Shape[] s={c1,c2,r1,r2};
for(Shape sp:s){
System.out.println(sp);//多態
}
//擴展,動態綁定
//動態綁定的前提:
//1、多個子類來源於同一個父類
//2、子類重寫了父類的方法
//3、父類的對象變數指向了不同的子類對象
//4、父類的對象變數調用了子類重寫後的方法
int i=(int)(s.length*Math.random());
for(Shape sp:s){
System.out.println(s[i].toString);//動態取得圖形
}
//第三種方式:隨機產生隨機個隨機圖形,顯示出來,並計算它們的總面積
int n=(int)(10*Math.random())+1;//隨機個數
s=new Shape[n];//存放n個圖形的數組
for(int i=0;i<s.length;i++){
s[i]=randShape();//隨機產出圖形,並放進數組裡
}
double areas=totalAreas(s);//求總面積
System.out.println("以上所有圖形的總面積是:"+areas);
}
public static Shape randShape(){
int n=(int)(2*Math.random());//隨機取值0或1
Shape sp=null;
swith(n){
case 0:
sp=new("圓",Math.round(100*Math.random()+1)/10.0;//隨機半徑,保留隨機數一位小數
break;
case 1:
sp=new("矩形",Math.random()*20+1,Math.random()*50+1);//隨機長和寬
break;
default:
sp=null;
}
return sp;
}
public static double totalAreas(Shape[] s){//計算總面積
double sum=0;
for(Shape sp:s){
System.out.println(sp);
sum+=sp.area();
}
return sum;
}
}//ShapeTest類結束
//要習慣將程式(功能、代碼)模塊化
//OOP四大特性:封裝、繼承、多態、抽象
//OOP的核心:封裝一個類,把數據抽象出來,再把方法抽象出來,構成一個整體
//封裝:為了提高安全性、重用性
//繼承:為了提高重用性、子類生成的效率
//多態:為了實現統一管理(統一性)、高效性
//抽象:為了提高效率、簡化業務邏輯