一、類和對象
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() ;
}
}