(超詳細)Java的面向對象編程—類、對象、包、參數、構造器、重載

一、類和對象

1、對象

  • 特徵 — 即屬性 每個對象的每個屬性都擁有特定值
  • 行爲 — 即方法

2、類 — Type類型 class-類
從對象抽象出“類”,類是由若干個對象抽象形成。是對象的模型,是抽象的概念,而對象是具體的實體。類是模子,確定對象將會擁有的特徵(屬性)和行爲(方法)。

3、類和對象關係

  • 類是對象的類型
  • 對象是類的具體存在.

4、封裝 Encapsulation
對象同時擁有屬性和方法兩方面的信息,這一特性稱爲封裝
對象的屬性和方法通常被封裝在一起,共同體現事物的特性,二者相輔相承,不能分割。
類與對象的關係:
類是對某一類事物的描述,是抽象的、概念上的定義;
而對象是實際存在該類事物的每個個體,因而也稱實例( instance ) .
產生對象的過程,又稱爲實例化(instantiate)對象

二、創建類和使用對象

面向對象編程OOP(object Oriented Programming)
1.創建類
使用關鍵字class來定義|聲明類.—>建模

  • 所有Java程序都以類class爲組織單元
/**
*人 類
*/
public class Person {
	String name; //姓名.
	int age;
	//年齡
	char sex;
	//性別
	//方法的定義,聲明
	public void eat() {
		System. out. println (name+"正在吃...");
	}
}

向對象的編程:
將現實世界中的對象→(從具體到抽象) →在Java程序世界中建模(創建類) →在程序世界中使用類
創建對象→ (從抽象到具體)針對於該對象進行相關的編程操作.
創建類的命名規範:
1、不能使用Java關鍵字
2、首字母可以爲字母,也可以是_$(不建議)
3、不能包含空格或.
➢類名首字母必須大寫,其後單詞首字母大寫 MyClass 屬性: myName ,myScore
➢類名通常採用名詞(見名知義)

public class Test {
	public static void main(String[] args) {
		int num; 1/分配了4字節
		num = 100;
		person p; //1.聲明對象 - 分配了4字節
		p = new person(); //2.爲p對象的屬性分配空間
		//3.爲對象的屬性賦值
		p.name=張三";
		p.age=20;
		p.sex='男';
		//4.訪問對象的屬性或對象的方法使用圓點運算符p.屬性或p.方法();
		p.eat(); //ca11調用方法
		Person p2 = new Person() ;
		p2.name="李四";
		p2.eat() ;
	}
}

三、特殊的toString()方法

在類裏面定義方法後,可以將對象以字符串的形式來表達.
此方法定義在類中後,可以被隱含的調用.

//person類
public class Person {
	String name; //姓名.
	int age;
	//年齡
	char sex;
	//性別
	//方法的定義,聲明
	public void eat() {
		System. out. println (name+"正在吃... ");
	}
	//tostring()用於將對象以字符串的形式來表達
	public String toString() {
		return "大家好,我叫"+name+",今年"+age+"歲,性別是"+sex;
	}
}
//測試類
public class Test {
	public static void main(String[] args) {
	Person P; //1.聲明對象 .--分配了 4字節
	P = new Person(); //2.爲加對象的屬性分配空間
	//3.爲對象的屬性賦值
	p.name="張三";
	p.age=20;
	p.sex='男' ;
	//4.訪問對象的屬性或對象的方法使用圓點運算符p.屬性或p.方法();
	System.out.println(p. toString()) ;
	//輸出p對象時,則表示將p對象以字符串的形式來表達,此時會隱式調用Person類中的toString()方法
	System. out.println(p) ;
	}
}

四、Java數據類型小結

詳細請看我寫的這篇文章:Java變量、標識符、數據類型及其轉換
可分爲兩種數據類型
1.簡單的值類型 8個- byte, short, int , long , float, double, char, boolean .
2.引用類型- String, int [ ] 等數組類型,使用class關鍵字聲明的類

兩種類型的區別
1)值類型的變量沒有屬性和方法,可以直接賦值
而引用類型的對象擁有屬性和方法,不能直接賦屬性的值
2)引用類型需要先通過new來分配內存(初始化)然後再爲屬性賦值
3)值類型變量空間分配在棧空間中,而引用類型的對象屬性分配在堆空間中.棧裏面的對象持有堆空間中的引用.

五、包 package

知道了對象和類,現在要了解一下Java中特有的“package”。
1.什麼是包
程序中的包package —等價於操作系統中的目錄(文件夾folder)
2.爲什麼要使用包
使用包有三點好處:
1)可以避免同名類名字衝突.
2)允許將類組織成較小的單元,易於查找 import java.util. Scanner ,Arrays
3)使用包可以保護類中的屬性和方法
在企業項目開發中,規範決定,所有的類必須指定包名,沒有包名的類是不存在的
3.如何使用包
1)定義包:
—直接創建包
—創建類的同時創建包
2)包的命名規範
— 包名小寫.
— 採用域名倒置的方式來命名—> cam. whos. javaoqp1. project1.group1. xxx
— 自定義包名不要使用java.開頭 java.util. *
3)使用其他包中的類必須要導入import
—沒有包名的類default package 不能被導入.
—java. lang. *系統自動導入的. (利用Java編程語言進行程序設計的基礎類)
—如果需要使用某個子包中的類,必須單獨導入import
4) package —> import —> class 順序

package com.test;
import com. entity. *;
import com. entity. oop1. Person;
import com. entity. oop1.A;
public class Test{
	public static void main (String[] args) {
		Teacher t = new Teacher() ;
		System. out.println(t) ;
		Person p = new Person() ;
		System.out.println(p) ;
		A a= new A(); //A cannot be resolved to a type A類不能被解析
		System. out.print1n(a) ;
	}
}

六、變量的作用域

作用域 scope — 起作用的範圍
根據變量的作用域將變量分爲以下兩種:
1.局部變量Local variable
— 方法內部定義變量
— 區域塊內定義的變量
— 方法的形參與實參都屬於各個方法的局部變量
2.全局變量Global Variable
— 類的屬性,成員變量

七、帶參數方法調用

帶參數的方法能增強方法的靈活性。

方法定義部份參數→形式參數
方法調用部份參數→實際參數

形參和實參都是各方法中的局部變量。
帶參方法傳參方式:
(1)傳值調用 call by value
— 值類型變量,被調子方法中對於形參值的修改,不會影響實參的值
(2)引用調用call by reference
— 引用類型的對象
被調用的子方法中形參持有的主調用方實參對象的引用,在形參對象中修改對象的屬性,實質上就是在修改實參對象的屬性值。
特別的,數組作爲方法參數
數組是引用類型,所有作爲參數是屬於”引用調用”。

package com.whos.demo04; .
class NumberTest{
	/**
	*查找最大值
	* @param arr
	*@return
	*/
	public int find_ large (int[] arr) { //形參
		int max = arr[0] ;
		for(int i=1 ; i<arr.length ; i++) {
			if (max < arr[i]) {
			max = arr[i] ;
			}
		}
		arr[0]=100;
		return max;
	}
}
pub1ic class Test {
	public static void main (String[] args) {
		NumberTest nt = new NumberTest() ;
		int[] nums = new int[]{32,45, 76,33, 11, 99,24};
		System.out.println ("調用前:"+nums[0]);
		int m = nt.find_ large (nums); //將數組名作爲方法的實參
		System.out.println("最大值爲: "+m);
		system.out.println ("調用後:"+nums[0]); // 值改變爲100
	}
}

八、構造器

英文名: constructor
又稱爲構造方法,構造函數,是一種特殊的方法.

與普通方法在定義的形式上有兩點區別:
1>構造方法不寫返回值類型
2>構造方法的名稱與類同名 [包括大小寫]

與普通方法在調用上的區別: .
1)普通方法通過對象使用圓點運算符調用對象名.方法名()
2)構造方法是在創建對象時調用的方法,使用new運算符來調用的

構造器有兩種類型
1>默認的無參構造器 [沒有參數] -可以不寫在類中,也可以直接調用
2>帶參數的構造器
示例:

package com. whos. demo05;
class Person{
	String name; .
	int age;
	//Constructor
	//默認的無參構造器
	public Person() { .
		System. out. println("Person()默認構造器執行了... ");
	}
	public Person (String n,int a) {
		name = n;
		age = a;
		System. out. println ("Person (String, int)帶參數構造器執行了...");
	}
	pub1ic void eat() {
		System. out. println (name+"正在eat() ...");
	}
}

pub1ic class Test {
	public static void main (String[] args) {
		Person p = new Person("小明",20) ;
		System. out. println (p .name+"\t"+p.age) ;
		p.eat() ;
	}
}

注意:
如果在一個 類中定義了帶參數構造器時,此時還想使用默認的無參數構造器時,則必須將無參數構造器也定義在該類中。

九、方法的重載

Overload — 指的是在一個類中出現同名的方法,但是參數不同:
1>參數的個數
2>參數的類型
滿足任一個都是可實現重載.
!!!重載與方法返回值類型無關
優點:可 以避免繁瑣的方法命名.

package com. whos. demo05;
class Person {
	String name;
	int age;
	/ /Constructor
	//默認的無參構造器
	pub1ic Person() {
		System. out. println ("Person ()默認構造器執行了... ");
	}
	public Person (String n,int a) {
		name = n;
		age = a;
		System. out. println ("Person (String, int)帶參數構造器執行了...");
	}
	public void eat() {
	System. out. println (name+"正在eat() ...");
	}
	public String eat (int money) {
		return "";
	}
}

pub1ic class Test {
	public static void main (String[] args) {
		Person p = new Person() ;
		System. out. println (P .name+"\t"tp.age) ;
		p.eat() ;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章