1、面向?qū)ο?/h4>
面向?qū)ο?/div>
OOP
面向?qū)ο蟮膬?yōu)點(diǎn):
(1)便于程序模擬現(xiàn)實(shí)世界中的實(shí)體
用“類”表示實(shí)體的特征和行為
(2)隱藏細(xì)節(jié)
對象的行為和屬性被封裝在類中,外界通過調(diào)用類的方法來獲得,不需關(guān)注內(nèi)部細(xì)節(jié)如何實(shí)現(xiàn)
(3)可重用
可以通過類的模板,創(chuàng)建多個(gè)類的對象
2、對象
(1)特征:
屬性:attribute / field / property
屬性是對象具有的各種特征。
每個(gè)對象的每個(gè)屬性都擁有特定值。
方法 / 行為:method
方法是對象執(zhí)行的操作。
(2)使用對象的步驟:
使用new創(chuàng)建一個(gè)對象:
School center = new School();
使用對象:
center.schoolName = “qinghua"; 對象名.屬性
center. toInter (); 對象名.方法名()
(3)對象在內(nèi)存中的存放形式
對象在內(nèi)存中的存放形式
3、類
類是具有相同屬性和方法的對象的集合。
所有Java程序都以類class為組織單元。
定義一個(gè)類的步驟:
- 定義類名
- 編寫類的屬性
- 編寫類的方法
4、類和對象的區(qū)別
類是抽象的概念,僅僅是模板,比如說:“人”。
對象是一個(gè)你能夠看得到、摸得著的具體實(shí)體,比如:“張三”。
5、抽象
把相同的或相似的對象歸為一類的這個(gè)過程就是抽象,所以,抽象就是分析問題的方法。
抽象的過程其實(shí)就是面向?qū)ο缶幊痰暮诵乃枷胫弧?/p>
6、成員運(yùn)算符:.
在Java中,只有先實(shí)例化類的對象,才可以訪問到類中的成員(屬性和方法)。
使用成員運(yùn)算符(.)來訪問成員屬性或成員方法;
一般語法是:
對象名.成員名
std.age = 18; //為成員屬性賦值
std.dining(); //調(diào)用成員方法
7、構(gòu)造器 / 構(gòu)造方法:constructor
在上例中,只能逐個(gè)地為數(shù)據(jù)成員賦值,如果想在對象實(shí)例化的同時(shí)就初始化成員屬性,就使用到了構(gòu)造方法。正是由于在實(shí)例化對象的同時(shí)會自動調(diào)用構(gòu)造方法,所以構(gòu)造方法一般用來給數(shù)據(jù)成員分配資源或初始化數(shù)據(jù)成員。
作用:對象實(shí)例化。
構(gòu)造方法是特殊的成員方法,它與類同名,在對象實(shí)例化時(shí)由虛擬機(jī)自動調(diào)用。因?yàn)槭怯商摂M機(jī)來調(diào)用構(gòu)造方法,所以構(gòu)造方法一般應(yīng)定義成public。
只有調(diào)用構(gòu)造方法,才能在內(nèi)存中開辟空間,才允許存放類中屬性和方法的數(shù)據(jù)。
構(gòu)造方法的一般形式:
訪問權(quán)限 類名(形參列表) {
方法體
}
請注意:
- 構(gòu)造方法沒有返回值類型,也不能有返回值。
- 構(gòu)造方法一般定義成public
- 每個(gè)對象在生成時(shí)都必須執(zhí)行構(gòu)造方法,而且只能執(zhí)行一次。
- 如果構(gòu)造方法調(diào)用失敗,那么對象也無法創(chuàng)建。
- 不可以顯式地直接調(diào)用構(gòu)造方法。
- 在沒有定義構(gòu)造方法的情況下,類會自動產(chǎn)生一個(gè)無參數(shù)的默認(rèn)構(gòu)造方法,這個(gè)默認(rèn)的構(gòu)造方法什么都不做。
一旦顯式地定義了構(gòu)造方法,默認(rèn)構(gòu)造方法自動消失。
修改后的Student類
例:
Person.java:
public class Person {
String name;
// 無參構(gòu)造器
public Person() {
System.out.println("又一個(gè)人誕生了!");
}
// 含參構(gòu)造器
public Person(String name) {
this.name = name;
System.out.println
("一個(gè)人誕生了,他的名字是:"+this.name);
}
}
TestConstructor.java:
public class TestConstructor {
public static void main(String[] args) {
// 通過Person類的含參構(gòu)造器實(shí)例化一個(gè)對象person
Person person = new Person("張三");
person.name="李四";
System.out.println("名字:"+person.name);
// 通過Person類的無參構(gòu)造器實(shí)例化一個(gè)對象p1
Person p1 = new Person();
p1.name="王五";
System.out.println("人名字:"+p1.name);
}
}
8、this關(guān)鍵字
既然所有的對象都共用相同的成員方法,那么在不同的對象都調(diào)用同一方法時(shí),它是怎么確定要使用哪個(gè)對象的數(shù)據(jù)成員呢?
每個(gè)成員方法都有一個(gè)隱含的this引用,它總是指向調(diào)用它的對象;
關(guān)鍵字this給出用于調(diào)用成員方法的對象的地址;
每當(dāng)調(diào)用成員方法時(shí),編譯器會向this分配調(diào)用該方法的對象的地址;
可以像使用任何引用那樣使用this。
/*this示例,代碼片段*/
public class Student //定義學(xué)生類
{
private String mName; //姓名
private int mAge; //年齡
public Student(String name, int age)
{
//隱式調(diào)用,等同于this.mName = name;
mName = name;
//顯式調(diào)用,等同于mAge = age;
this.mAge = age;
}
……
}
注意:在static作用域內(nèi),絕對不可以使用this關(guān)鍵字!??!
(因?yàn)閠his是指向本類的一個(gè)實(shí)例,而static只有一個(gè)實(shí)例)
9、面向?qū)ο蟮?大基本特征:
(1)封裝
(2)繼承
(3)多態(tài)
3大基本特征
10、堆區(qū)、棧區(qū)、方法區(qū)
Java的內(nèi)存分為3個(gè)區(qū):堆(heap)、棧(stack)、方法區(qū)(method)。
堆區(qū):
存儲的全部是對象,每個(gè)對象都包含一個(gè)與之對應(yīng)的class的信息。(class的目的是得到操作指令)。
JVM只有一個(gè)堆區(qū)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。
棧區(qū):
每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基本數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中。
每個(gè)棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。
棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。
方法區(qū):
String say(String name){return "abc"}
// name、"abc"等都存放在方法區(qū)
11、靜態(tài)成員
(1)變量
Java中的變量可分為成員變量和局部變量。
兩種變量的作用域和加載時(shí)間均不一樣。
(2)靜態(tài)成員變量
在成員變量前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員變量;
如果類中成員變量被定義為靜態(tài),那么不論有多少個(gè)對象,靜態(tài)成員變量只有一份內(nèi)存拷貝,即所有對象共享該成員變量;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員變量;也可以通過對象訪問靜態(tài)成員變量,但不論使用的是哪個(gè)對象,訪問到的都是同一個(gè)變量。
靜態(tài)成員變量的作用域只在類內(nèi)部,但其生命周期卻貫穿整個(gè)程序。和程序同生命周期。
靜態(tài)成員變量在聲明時(shí)最好初始化,如果不進(jìn)行初始化,系統(tǒng)會默認(rèn)初始化為0。
package test;
class Dog{
public static int count = 0; //靜態(tài)成員變量
public Dog() { //構(gòu)造方法
count++;
}
}
public class Test{
public static void main(String[] args){
System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
Dog d1 = new Dog();
Dog d2 = new Dog();
System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
}
}
(3)靜態(tài)成員方法
在成員方法前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員方法;
靜態(tài)成員方法只能對類的靜態(tài)成員變量(靜態(tài)屬性和靜態(tài)方法)進(jìn)行操作,不能操作非靜態(tài)成員變量。(因?yàn)閟tatic屬性和方法是在編譯(javac)時(shí)開辟的內(nèi)存空間,而普通變量和方法是在運(yùn)行(java)時(shí)才產(chǎn)生)
靜態(tài)成員方法沒有this引用;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員方法。
靜態(tài)方法不能直接操作非靜態(tài)的屬性和方法
加上static后,就可以操作了
package test;
class Dog {
private static int count = 0; //靜態(tài)成員變量
public Dog() {
count++;
}
//顯示數(shù)量的方法,靜態(tài)成員方法
public static void displayCount() {
System.out.println("當(dāng)前狗的數(shù)量是:" + count);
}
}
public class Test {
public static void main(String[] args) {
//沒有實(shí)例化對象之前,直接通過類名調(diào)用靜態(tài)成員方法
Dog.displayCount();
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog.displayCount();
}
}
12、包
有時(shí)候,類和類的名稱可能發(fā)生沖突;Java提供了把類名空間劃分為更容易管理的塊的機(jī)制,這就是包;包允許將類組合成較小的單元,類似于文件夾。
- 有助于避免命名沖突,分屬不同包的類即便名稱相同也不會引起誤會。
- 能在包與包之間對于類的訪問權(quán)限提供更有力的約束。
(1)缺省包
如果省略了package語句,類將保存在一個(gè)缺省的沒有名稱的包中;
盡管缺省包很方便,但對于大型的程序,它是不恰當(dāng)?shù)模?br>
請盡量為自己編寫的類定義具體的包。
(2)使用package關(guān)鍵字打包
可以使用package關(guān)鍵字將源文件中的類打入某個(gè)包中,語法是:
package 包名;
該語句必須是整個(gè)源文件的第一條語句。
package mypkg; //將本源文件中的所有類打到mypkg包中
class Student { //定義學(xué)生類
……
}
(3)使用import關(guān)鍵字導(dǎo)入包
如要使用到某個(gè)包中的類,就需要使用import關(guān)鍵字將包或類顯式地包括到程序中。有如下兩種情況:
/*導(dǎo)入java包下的io子包中的所有類*/
import java.io.*;
/*導(dǎo)入mypkg包下的Student類,但并不導(dǎo)入該包中的其它類*/
import mypkg.Student;
……
一個(gè)程序中允許有多條import語句,導(dǎo)入多個(gè)包或多個(gè)類。
最后編輯于 :?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。相關(guān)閱讀更多精彩內(nèi)容
- 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...


面向?qū)ο蟮膬?yōu)點(diǎn):
(1)便于程序模擬現(xiàn)實(shí)世界中的實(shí)體
用“類”表示實(shí)體的特征和行為
(2)隱藏細(xì)節(jié)
對象的行為和屬性被封裝在類中,外界通過調(diào)用類的方法來獲得,不需關(guān)注內(nèi)部細(xì)節(jié)如何實(shí)現(xiàn)
(3)可重用
可以通過類的模板,創(chuàng)建多個(gè)類的對象
2、對象
(1)特征:
屬性:attribute / field / property
屬性是對象具有的各種特征。
每個(gè)對象的每個(gè)屬性都擁有特定值。
方法 / 行為:method
方法是對象執(zhí)行的操作。
(2)使用對象的步驟:
使用new創(chuàng)建一個(gè)對象:
School center = new School();
使用對象:
center.schoolName = “qinghua"; 對象名.屬性
center. toInter (); 對象名.方法名()
(3)對象在內(nèi)存中的存放形式

3、類
類是具有相同屬性和方法的對象的集合。
所有Java程序都以類class為組織單元。

定義一個(gè)類的步驟:
- 定義類名
- 編寫類的屬性
- 編寫類的方法
4、類和對象的區(qū)別
類是抽象的概念,僅僅是模板,比如說:“人”。
對象是一個(gè)你能夠看得到、摸得著的具體實(shí)體,比如:“張三”。
5、抽象
把相同的或相似的對象歸為一類的這個(gè)過程就是抽象,所以,抽象就是分析問題的方法。
抽象的過程其實(shí)就是面向?qū)ο缶幊痰暮诵乃枷胫弧?/p>
6、成員運(yùn)算符:.
在Java中,只有先實(shí)例化類的對象,才可以訪問到類中的成員(屬性和方法)。
使用成員運(yùn)算符(.)來訪問成員屬性或成員方法;
一般語法是:
對象名.成員名
std.age = 18; //為成員屬性賦值
std.dining(); //調(diào)用成員方法
7、構(gòu)造器 / 構(gòu)造方法:constructor
在上例中,只能逐個(gè)地為數(shù)據(jù)成員賦值,如果想在對象實(shí)例化的同時(shí)就初始化成員屬性,就使用到了構(gòu)造方法。正是由于在實(shí)例化對象的同時(shí)會自動調(diào)用構(gòu)造方法,所以構(gòu)造方法一般用來給數(shù)據(jù)成員分配資源或初始化數(shù)據(jù)成員。
作用:對象實(shí)例化。
構(gòu)造方法是特殊的成員方法,它與類同名,在對象實(shí)例化時(shí)由虛擬機(jī)自動調(diào)用。因?yàn)槭怯商摂M機(jī)來調(diào)用構(gòu)造方法,所以構(gòu)造方法一般應(yīng)定義成public。
只有調(diào)用構(gòu)造方法,才能在內(nèi)存中開辟空間,才允許存放類中屬性和方法的數(shù)據(jù)。
構(gòu)造方法的一般形式:
訪問權(quán)限 類名(形參列表) {
方法體
}
請注意:
- 構(gòu)造方法沒有返回值類型,也不能有返回值。
- 構(gòu)造方法一般定義成public
- 每個(gè)對象在生成時(shí)都必須執(zhí)行構(gòu)造方法,而且只能執(zhí)行一次。
- 如果構(gòu)造方法調(diào)用失敗,那么對象也無法創(chuàng)建。
- 不可以顯式地直接調(diào)用構(gòu)造方法。
- 在沒有定義構(gòu)造方法的情況下,類會自動產(chǎn)生一個(gè)無參數(shù)的默認(rèn)構(gòu)造方法,這個(gè)默認(rèn)的構(gòu)造方法什么都不做。
一旦顯式地定義了構(gòu)造方法,默認(rèn)構(gòu)造方法自動消失。

例:
Person.java:
public class Person {
String name;
// 無參構(gòu)造器
public Person() {
System.out.println("又一個(gè)人誕生了!");
}
// 含參構(gòu)造器
public Person(String name) {
this.name = name;
System.out.println
("一個(gè)人誕生了,他的名字是:"+this.name);
}
}
TestConstructor.java:
public class TestConstructor {
public static void main(String[] args) {
// 通過Person類的含參構(gòu)造器實(shí)例化一個(gè)對象person
Person person = new Person("張三");
person.name="李四";
System.out.println("名字:"+person.name);
// 通過Person類的無參構(gòu)造器實(shí)例化一個(gè)對象p1
Person p1 = new Person();
p1.name="王五";
System.out.println("人名字:"+p1.name);
}
}
8、this關(guān)鍵字
既然所有的對象都共用相同的成員方法,那么在不同的對象都調(diào)用同一方法時(shí),它是怎么確定要使用哪個(gè)對象的數(shù)據(jù)成員呢?
每個(gè)成員方法都有一個(gè)隱含的this引用,它總是指向調(diào)用它的對象;
關(guān)鍵字this給出用于調(diào)用成員方法的對象的地址;
每當(dāng)調(diào)用成員方法時(shí),編譯器會向this分配調(diào)用該方法的對象的地址;
可以像使用任何引用那樣使用this。
/*this示例,代碼片段*/
public class Student //定義學(xué)生類
{
private String mName; //姓名
private int mAge; //年齡
public Student(String name, int age)
{
//隱式調(diào)用,等同于this.mName = name;
mName = name;
//顯式調(diào)用,等同于mAge = age;
this.mAge = age;
}
……
}
注意:在static作用域內(nèi),絕對不可以使用this關(guān)鍵字!??!
(因?yàn)閠his是指向本類的一個(gè)實(shí)例,而static只有一個(gè)實(shí)例)
9、面向?qū)ο蟮?大基本特征:
(1)封裝
(2)繼承
(3)多態(tài)

10、堆區(qū)、棧區(qū)、方法區(qū)
Java的內(nèi)存分為3個(gè)區(qū):堆(heap)、棧(stack)、方法區(qū)(method)。
堆區(qū):
存儲的全部是對象,每個(gè)對象都包含一個(gè)與之對應(yīng)的class的信息。(class的目的是得到操作指令)。
JVM只有一個(gè)堆區(qū)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。
棧區(qū):
每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基本數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中。
每個(gè)棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。
棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。
方法區(qū):
String say(String name){return "abc"}
// name、"abc"等都存放在方法區(qū)
11、靜態(tài)成員
(1)變量
Java中的變量可分為成員變量和局部變量。
兩種變量的作用域和加載時(shí)間均不一樣。
(2)靜態(tài)成員變量
在成員變量前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員變量;
如果類中成員變量被定義為靜態(tài),那么不論有多少個(gè)對象,靜態(tài)成員變量只有一份內(nèi)存拷貝,即所有對象共享該成員變量;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員變量;也可以通過對象訪問靜態(tài)成員變量,但不論使用的是哪個(gè)對象,訪問到的都是同一個(gè)變量。
靜態(tài)成員變量的作用域只在類內(nèi)部,但其生命周期卻貫穿整個(gè)程序。和程序同生命周期。
靜態(tài)成員變量在聲明時(shí)最好初始化,如果不進(jìn)行初始化,系統(tǒng)會默認(rèn)初始化為0。
package test;
class Dog{
public static int count = 0; //靜態(tài)成員變量
public Dog() { //構(gòu)造方法
count++;
}
}
public class Test{
public static void main(String[] args){
System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
Dog d1 = new Dog();
Dog d2 = new Dog();
System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
}
}
(3)靜態(tài)成員方法
在成員方法前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員方法;
靜態(tài)成員方法只能對類的靜態(tài)成員變量(靜態(tài)屬性和靜態(tài)方法)進(jìn)行操作,不能操作非靜態(tài)成員變量。(因?yàn)閟tatic屬性和方法是在編譯(javac)時(shí)開辟的內(nèi)存空間,而普通變量和方法是在運(yùn)行(java)時(shí)才產(chǎn)生)
靜態(tài)成員方法沒有this引用;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員方法。


package test;
class Dog {
private static int count = 0; //靜態(tài)成員變量
public Dog() {
count++;
}
//顯示數(shù)量的方法,靜態(tài)成員方法
public static void displayCount() {
System.out.println("當(dāng)前狗的數(shù)量是:" + count);
}
}
public class Test {
public static void main(String[] args) {
//沒有實(shí)例化對象之前,直接通過類名調(diào)用靜態(tài)成員方法
Dog.displayCount();
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog.displayCount();
}
}
12、包
有時(shí)候,類和類的名稱可能發(fā)生沖突;Java提供了把類名空間劃分為更容易管理的塊的機(jī)制,這就是包;包允許將類組合成較小的單元,類似于文件夾。
- 有助于避免命名沖突,分屬不同包的類即便名稱相同也不會引起誤會。
- 能在包與包之間對于類的訪問權(quán)限提供更有力的約束。
(1)缺省包
如果省略了package語句,類將保存在一個(gè)缺省的沒有名稱的包中;
盡管缺省包很方便,但對于大型的程序,它是不恰當(dāng)?shù)模?br>
請盡量為自己編寫的類定義具體的包。
(2)使用package關(guān)鍵字打包
可以使用package關(guān)鍵字將源文件中的類打入某個(gè)包中,語法是:
package 包名;
該語句必須是整個(gè)源文件的第一條語句。
package mypkg; //將本源文件中的所有類打到mypkg包中
class Student { //定義學(xué)生類
……
}
(3)使用import關(guān)鍵字導(dǎo)入包
如要使用到某個(gè)包中的類,就需要使用import關(guān)鍵字將包或類顯式地包括到程序中。有如下兩種情況:
/*導(dǎo)入java包下的io子包中的所有類*/
import java.io.*;
/*導(dǎo)入mypkg包下的Student類,但并不導(dǎo)入該包中的其它類*/
import mypkg.Student;
……
一個(gè)程序中允許有多條import語句,導(dǎo)入多個(gè)包或多個(gè)類。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...