1. 程式人生 > 實用技巧 >Java-7 面向物件(上)

Java-7 面向物件(上)

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();
	}
}