Java-7 面向物件(上)
阿新 • • 發佈:2020-09-20
2.面向物件
-
面向物件(Object-Oriented)
- ooa:面向物件的分析
- ood:面向物件的設計
- oop:面向物件的程式設計
-
面向物件三大特性
- 封裝,繼承,多型
2.1類和物件關係
-
類:一種資料型別,引用資料型別,自定義的一種型別,用變量表示屬性,用方法表示行為
-
物件:具體存在的事務,符合類的定義特徵.
-
類的定義個數:
class 類名[]
-
如何建立物件
類名 物件名 = new 類名();
-
demo1:建立一個學生類定義姓名,性別,分數,定義一個方法study新增一個自我介紹的方法。
// StudentDemo package obj; public class Student { String name; int age; double score; // 定義方法 public void teach() { System.out.println("姓名:" + this.name); } } // TestDemo package obj; public class StudentDemo { public static void main(String[] args) { Student std = new Student(); std.name = "小明"; std.age = 12; std.score = 80; System.out.println(std);// obj.Student@4c203ea1 System.out.println(std.name);// 小明 std.teach();// 姓名:小明 } }
2.2元件介紹
- 成員變數,靜態變數,區域性變數,成員方法,靜態方法,構造方法
package obj; public class Student { // 成員變數 String name; int age; double score; // 靜態變數 static int a; // 成員方法 public void teach() { System.out.println("姓名:" + this.name); } // 靜態方法 public static void test(int x, int y) { int abc = 100;//區域性變數 } // 構造方法 public Student(String name , int age) { this.name = name; this.age = age; } }
2.3面向物件記憶體分配
// 解析
當我們建立一個類時候,首先會在堆空間方法去建立class區和static區。class區儲存定義的類,static儲存靜態方法。當我們對類進行初始化,class區將成員變數初始化並拷貝到堆記憶體地址中,初始化變數指向類方法內定義成員變數的地址。
2.4成員變數和區域性變數區別
- 成員變數:定義在類中方法外,沒有static修飾,儲存在堆記憶體中,有初始值,隨著物件的消失而消失。
- 區域性變數:定義在方法中或者方法的引數列表上,儲存在棧記憶體中,沒有初始值,隨著方法的呼叫而產生,隨著方法的結束而消失。
2.5 封裝
-
封裝前需要使用成員變數:private. 此為許可權修飾符,當然許可權修飾符還有:public,protected,default,private。
-
而private表示私有的,它可以修飾方法和變數,被private修飾符方法和變數,只能在本類種訪問:
-
提供一套訪問的修飾方法get和set方法。
-
demo
// Teacher類
package func;
public class Teacher {
private String name;
private int age;
private int gender;
private double salary;
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 getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void show() {
System.out.println("name:" + name + "age:"+ age+ "gender:" + gender + "salary:" + salary);
}
}
// 呼叫封裝Teacher類
package func;
public class TeacherDemo {
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("張三");
t.setAge(18);
t.setGender(1);
t.setSalary(1235.3);
t.show();
}
}
- 封裝練習
package func;
public class Mobile {
private String brand;
private String type;
private double price;
private String color;
public void setBrand(String brand) {
this.brand = brand;
}
public void setType(String type) {
this.type = type;
}
public void setPrice(double price) {
this.price = price;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public String getType() {
return type;
}
public double getPrice() {
return price;
}
public String getColor() {
return color;
}
public void show() {
System.out.println("brand:"+brand+"color:"+color+"type:"+type+"price:"+price);
}
}
package func;
public class MobileDemo {
public static void main(String[] args) {
Mobile m1 = new Mobile();
m1.setBrand("華為");
m1.setColor("紅色");
m1.setType("5G");
m1.setPrice(2399.5);
Mobile m2 = new Mobile();
m2.setBrand("蘋果");
m2.setColor("黃色");
m2.setType("X");
m2.setPrice(4399.5);
Mobile[] ms = new Mobile[] {m1, m2};
for (int i=0;i<ms.length;i++) {
ms[i].show();
}
}
}
- 練習求長方形周長和麵積
package func;
public class Rect {
private double length;
private double width;
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
public double periMeter() {
return 2*(this.length+this.width);
}
public double area() {
return this.length*this.width;
}
}
package func;
public class RectDemo {
public static void main(String[] args) {
Rect r = new Rect();
r.setLength(10);
r.setWidth(5);
double perimeter = r.periMeter();
double area = r.area();
System.out.println(perimeter);// 30.0
System.out.println(area);// 50.0
}
}
2.6構造方法
- 當new的時候,構造方法被呼叫,構造方法沒有返回值,構造方法名與類名相同,構造方法可以被過載(一個類中可以存在多個名字相同的方法,但是必須保證引數的個數或型別不同,與返回值無關)。
- 如果我們沒有在類種寫構造方法,系統會預設為我們生成一個無引數的構造方法,如果我們寫了構造方法,則系統不會為我們生成預設構造方法。
package gouzao;
public class Teacher {
private String name;
private int age;
private double salary;
public Teacher(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public void show() {
System.out.println("name:"+name+"age:"+age+"salary:"+salary);
}
}
package gouzao;
public class TeacherDemo {
public static void main(String[] args) {
Teacher t = new Teacher("Tom",20,25002.3);
t.show();
}
}