尚矽谷_Java零基礎教程(物件導向上)--學習筆記(十一)

呆萌的小透明發表於2020-11-18
package com.itguigu.java;
/*
 * 物件導向的特徵一:封裝與隱藏
 * 一、問題的引入:
 * 	當我們建立一個類的物件以及,我們可以通過"物件.屬性"的方式,對物件的屬性進行賦值。這裡,賦值操作要受到
 * 	屬性的資料型別和儲存範圍的制約,除此之外,沒有其他制約條件。但是,在實際問題中,我們往往需要給屬性賦值
 * 	加入額外的制約條件。這個條件就不能在屬性宣告時體現,我們只能通過方法進行限制條件的新增。同時,我們需要
 * 	避免使用者再使用"物件.屬性"的方式對屬性進行賦值,則需要將屬性宣告為私有的(private)。
 * -->此時,針對於屬性就體現了封裝性。
 * 
 * 二、封裝性的體現
 * 	我們將類的屬性私有化(private),同時,提供公共(public)的方法來獲取(getXxx)和設定(setXxx)此屬性的值。
 *
 *	擴充:封裝性的體現:1、如上。2、不對外暴露的私有方法。3、單例模式。等等
 *
 *三、封裝性的體現,需要許可權修飾符來配合。
 *	1.Java規定的4種許可權(從小到大):private,預設,protected,public
 *	2.4種許可權可以用來修飾類及類的內部結構:屬性、方法、構造器、內部類。
 *	3.具體的:4種許可權都可以用來修飾類的內部結構:屬性、方法、構造器、內部類。
 *			修飾類的話,只能使用:預設、public。
 *
 *總結封裝性:Java提供了4種許可權修飾符來修飾類及類的內部結構,體現類及內部結構在被呼叫的時候的可見性的大小。
 */
public class AnimalTest {
	public static void main(String[] args) {
		Animal a = new Animal();
		a.name = "大黃";
		//a.age = 1;
		//a.legs = 4;
		
		a.show();
		
		//a.legs = -4;
		a.setLegs(10);
		a.show();
		
		System.out.println(a.getLegs());
	}
}

class Animal{
	String name;
	private int age;
	private int legs; //腿的個數
	
	public void setLegs(int l) {
		if(l>=0 && l%2==0) {
			legs = l;
		}else {
			legs = 0;
		}
	}
	
	public int getLegs() {
		return legs;
	}
	
	public void eat() {
		System.out.println("動物進食");
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int a) {
		age = a;
	}
	
	public void show() {
		System.out.println(name + "," + age + "," + legs);
	}
}
package com.itguigu.exer;

public class Person {
	private int age;
	
	public void setAge(int a) {
		if(a<0 || a>130) {
			System.out.println("傳入的資料非法");
		}else {
			age = a;
		}
	}
	
	public int getAge() {
		return age;
	}
}
package com.itguigu.exer;

public class PersonTest {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setAge(12);
		System.out.println(p1.getAge());
	}
}
package com.itguigu.java;
/*
 * 類的結構之三:構造器(或構造方法,constructor)的使用
 * constructor:
 * 
 * 一、構造器的作用
 * 1、建立物件
 * 2、初始化物件的資訊
 * 
 * 二、說明
 * 1、如果沒有顯式的定義構造器的話,則系統預設提供一個空參的構造器。
 * 2、定義構造器的格式:許可權修飾符 類名(形參列表){}。
 * 3、一個類中定義的多個構造器,彼此構成過載。
 * 4、一旦我們顯式的定義了類的構造器之後,系統就不在提供預設的空參構造器。
 * 5、一個類中,至少會有一個構造器。
 */
public class PersonTest {
	public static void main(String[] args) {
		//建立類的物件:new + 構造器
		Person p = new Person();
		
		p.eat();
		
		Person p1 = new Person("Tom");
		System.out.println(p1.name);
	}
}

class Person{
	//屬性
	String name;
	int age;
	//構造器
	public Person() {
		System.out.println("Person()...");
	}
	
	public Person(String n) {
		name = n;
	}
	
	public Person(String n, int a) {
		name = n;
		age = a;
	}
	
	//方法
	public void eat() {
		System.out.println("人吃飯");
	}
	
	public void study() {
		System.out.println("人可以學習");
	}
}
package com.itguigu.exer;

public class Triangle {
	private double base;
	private double height;
	
	public Triangle() {
		
	}
	
	public Triangle(double b, double h) {
		base = b;
		height = h;
	}
	
	public void setBase(double b) {
		base = b;
	}
	
	public double getBase() {
		return base;
	}
	
	public void setHeight(double h) {
		height = h;
	}
	
	public double getHeight() {
		return height;
	}
}
package com.itguigu.exer;

public class TriangleTest {
	public static void main(String[] args) {
		Triangle t1 = new Triangle();
		t1.setBase(2.0);
		t1.setHeight(2.4);
		System.out.println(t1.getBase() + "," + t1.getHeight());
		
		Triangle t2 = new Triangle(5.1, 5.2);
		System.out.println(t1.getBase() + "," + t1.getHeight());
	}
}
package com.itguigu.java;
/*
 * 總結屬性賦值的先後順序
 * 1、預設初始化值
 * 2、顯式初始化
 * 3、構造器中初始化
 * 
 * 4、通過“物件.方法”或"物件.屬性"的方式賦值
 * 
 * 以上操作的先後順序:1->2->3->4
 */
public class UserTest {
	public static void main(String[] args) {
		User u = new User();
		
		System.out.println(u.age);
		
		User u1 = new User(2);
		
		u1.setAge(3);
		
		System.out.println(u1.age);	
	}
}

class User{
	String name;
	int age=1;
	
	public User() {
		
	}
	
	public User(int a) {
		age = a;
	}
	
	public void setAge(int a) {
		age = a;
	}
}
package com.itguigu.java;
/*
 * JavaBean是一種Java語言寫成的可重用元件。
 * 所謂javaBean,是指符合如下標準的Java類:
 * 1、類是公共的。
 * 2、有一個無參的公共構造器。
 * 3、有屬性,且有對應的get、set方法。
 * 
 * 預設構造器的許可權修飾符和類的許可權一樣
 */
public class Customer {
	private int id;
	private String name;
	
	public Customer() {
		
	}
	
	public void setId(int i) {
		id  = i;
	}
	
	public int getId() {
		return id;
	}
	
	public void setName(String n) {
		name = n;
	}
	
	public String getName() {
		return name;
	}
}
package com.itguigu.java1;
/*
 * this關鍵字的使用
 * 1、this可以用來修飾、呼叫:屬性、方法、構造器。
 * 
 * 2、this修飾屬性和方法。
 * 	this理解為當前物件,或當前正在建立的物件
 * 	在類的方法中,我們可以使用“this.屬性”,"this.方法"的方式,呼叫當前物件的屬性和方法。但是,通常情況下,我們都選擇省略"this."
 * 	特殊情況下,如果方法的形參和類的屬性同名時,我們必須顯式的使用"this.變數"的方式,表明此變數是屬性,而非形參。
 *
 *3、this呼叫構造器
 * (1)我們在類的構造器中,可以顯式的使用"this(形參列表)"方法,呼叫本類中指定的其他構造器。
 * (2)構造器中不能通過"this(形參列表)"方式呼叫自己。
 * (3)如果一個類中有n個構造器,最多有n-1個構造器使用"this(形參列表)。
 * (4)規定:"this(形參列表)"必須宣告在當前構造器的首行。
 * (5)構造器內部:最多隻能宣告一個"this(形參列表)"用來呼叫其他構造器。
 */
public class PersonTest {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setAge(1);
		System.out.println(p1.getAge());
	}
}

class Person{
	private String name;
	private int age;
	
	public Person() {
		
	}
	
	public Person(String name) {
		this();
		this.name = name;
	}
	
	public Person(int age) {
		this();
		this.age = age;
	}
	
	public Person(String name, int age) {
		this(age);
		this.name = name;
		//this.age = age;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
}
package com.itguigu.exer;

public class boy {
	private String name;
	private int age;
	
	public boy() {
		
	}
	
	public boy(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	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 void marry(girl girl) {
		System.out.println(girl.getName());
	}
	
	public void shout() {
		if(this.age>=22) {
			System.out.println("你可以去合法等級結婚類!");
		}else {
			System.out.println("先多談談戀愛");
		}
	}
}
package com.itguigu.exer;

public class girl {
	private String name;
	private int age;
	
	public girl() {
		
	}
	
	public girl(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public void marry(boy boy) {
		System.out.println(boy.getName());
		boy.marry(this);
	}
	
	public int compare(girl girl) {
		if(this.age > girl.age) {
			return 1;
		}else if(this.age < girl.age) {
			return -1;
		}else {
			return 0;
		}
	}
}
package com.itguigu.exer;

public class Account {
	private int id;
	private double balance;
	private double annualInterestRate;
	
	public Account(int id, double balance, double annualInterestRate) {
		this.id = id;
		this.balance = balance;
		this.annualInterestRate = annualInterestRate;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}

	public double getAnnualInterestRate() {
		return annualInterestRate;
	}

	public void setAnnualInterestRate(double annualInterestRate) {
		this.annualInterestRate = annualInterestRate;
	}
	
	public void withdraw(double amount) {
		if(balance < amount) {
			System.out.println("餘額不足");
			return;
		}
		
		balance -= amount;
		System.out.println("成功取出" + amount);
	}
	
	public void deposit(double amount) {
		if(amount > 0) {
			balance += amount;
			System.out.println("成功存:" + amount);
		}
	}
	
}
package com.itguigu.exer;

public class Customer {
	private String firstName;
	private String lastName;
	private Account account;
	
	public Customer(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}

	public String getFirstName() {
		return firstName;
	}

	public String getLastName() {
		return lastName;
	}
}
package com.itguigu.exer1;

public class Account {
	private double balance;
	
	public Account(double init_balance) {
		this.balance = init_balance;
	}
	
	public double getBalance() {
		return this.balance;
	}
	
	public void deposit(double amt) {
		if(amt > 0) {
			balance += amt;
			System.out.println("存錢成功");
		}
	}
	
	public void withdraw(double amt) {
		if(balance >= amt) {
			balance -= amt;
			System.out.println("取錢成功");
		}else {
			System.out.println("餘額不足");
		}
	}
}
package com.itguigu.exer1;

public class Customer {
	private String firstName;
	private String lastName;
	private Account account;
	
	public Customer(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}

	public String getFirstName() {
		return firstName;
	}

	public String getLastName() {
		return lastName;
	}
	
	
}
package com.itguigu.exer1;

public class Bank {
	 private Customer[] customers;
	 private int numberOfCustomers;
	 
	 public Bank() {
		 customers = new Customer[10];
	 }
	 
	 public void addCustomer(String f, String l) {
		 Customer cust = new Customer(f, l);
		 customers[numberOfCustomers++] = cust;
	 }
	 
	 public int getNumberOfCustomers() {
		 return this.numberOfCustomers;
	 }
	 
	 public Customer getCustomer(int index) {
		 if(index >=0 && index < numberOfCustomers) {
			 return customers[index];
		 }else {
			 return null;
		 }
	 }
}
package com.itguigu.java1;

import java.util.Arrays;

/*
 * 一、Package關鍵字的使用
 * 1、為了更好的實現專案中類的管理,提供類包的概念。
 * 2、使用package宣告類或介面所屬的包,宣告在原始檔的首行。
 * 3、包,屬於識別符號,遵循識別符號的命名規則和規範。
 * 4、每"."一次,就代表一層檔案目錄。
 * 
 * 補充:同一個包下,不能命名同名的介面、類。
 * 		不同的包下,可以命名同名的介面、類。
 * 
 * 二、import關鍵字的使用
 * 1、import:匯入,在原始檔中顯式的使用import結構匯入指定包下的類、介面
 * 2、宣告在包的宣告和類的宣告之間。
 * 3、如果要匯入多個結構,並列寫即可。
 * 4、可以使用"xxx.*"的方式表示可以匯入xxx包下的所有結構。
 * 5、如果使用的類或介面是java.lang包下定義的,可以省略import結構。
 * 6、如果使用的類或介面是本包下定義的,則也可以省略。
 * 7、如果在原始檔中,使用類不同包下的同名的類,則必須至少有一個類需要以全類名的方式顯示。
 * 8、如果使用"xxx.*"方式表明可以呼叫xxx包下的所有結構,但是如果使用的是xxx子包下的結構
 * 則仍需要匯入。
 * 9、import static: 匯入指定類或介面中的靜態結構:屬性或方法。
 */
public class PackageImportTest {
	public static void main(String[] args) {
		System.out.println(Arrays.toString(new int[] {1,2,3}));
	}
}

相關文章