類與對象
面向對象
面向對象是基於面向過程的編程思想
類與對象
Java語言中最基本的單位是類。用類體現事物
類
成員變量 事物屬性
成員方法 事物行爲
類:是一組相關的屬性和行爲的集合。
對象:是該類事物的具體存在,是一個具體的實例。
例如:
學生:類
班長:對象
類的定義及使用
類的定義:
成員變量:定義格式相同,只是位置不同
成員方法:定義格式不同,只是去掉了static
使用類的內容
創建對象格式:
類名 對象名 = new 類名();
使用成員變量、成員方法
對象名.成員變量
對象名.成員方法()
成員變量與局部變量的區別
在類中位置不同
成員變量:類中方法外
局部變量:方法內或方法聲明上
在內存中位置不同
成員變量:棧內存
局部變量:堆內存
生命週期不同
成員變量:隨着對象的存在而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
初始化不同
成員變量:用默認初始化值
局部變量:沒有默認初始化值,必須先定義,賦值,才能使用。
形式參數的問題:
基本類型:形式參數的改變不影響實際參數
引用類型:形式參數的改變直接影響實際參數
(引用類型有:類、接口、數組)
匿名對象:沒有名字的對象。
應用場景:只調用一次的時候適合,調用多次不適合。
匿名對象調用完畢後可以別垃圾回收器回收
class Student1{
public void show() {
System.out.println("hello world");
}
}
class Student1Demo{
public void method(Student1 s) {
s.show();
}
}
public class NoName {
public static void main(String[] args) {
Student1Demo s = new Student1Demo();
Student1 s1 = new Student1();
s.method(s1);
System.out.println("---------");
//匿名方法調用
new Student1Demo().method(new Student1());
}
}
--------------------------------------------------------------------------------------
結果:
hello world
---------
hello world
封裝
封裝
封裝:是指隱藏對象的屬性和實現細節,只對外提供公共訪問方式。
好處:
1、隱藏了實現細節,提供公共的訪問方式
2、提高了代碼的複用性
3、提高了安全性
封裝原則:
將不需要對外提供的內容都隱藏起來
把屬性隱藏,提供公共方法對其訪問
private關鍵字
是一個權限修飾符
可以修飾成員(成員變量和成員方法)
被private修飾的成員只在本類中才能訪問。
private常見應用:
把成員變量用private修飾
提供對應的getXxx()/setXxx()方法
this關鍵字
代表所在類的對象引用
方法被哪個對象調用,this就代表那個對象(當局部變量隱藏成員變量時使用)
構造方法
構造方法作用:給對象的數據進行初始化
構造方法格式:
方法名與類名相同
沒有返回值類型,連void都沒有
沒有具體的返回值
構造方法注意事項
構造方法也是可以重載的
如果給未出構造方法,系統將自動提供一個無參構造方法。
如果給出構造方法,系統將不再提供默認的無參構造方法。(如果還想使用無參構造方法,必須自己給出)
(建議自己給出無參構造方法)
給成員賦值兩種方式
setXxx();
構造方法
class Student{
private String name;
private int age;
//無參構造方法
public Student(){
}
//帶參構造方法
public Student(String name,int age) {
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 show() {
System.out.println(name+"---"+age);
}
}
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.setName("林青霞");
s.setAge(27);
System.out.println(s.getName()+"---"+s.getAge());
Student s1 = new Student("劉意",30);
s1.show();
}
}
----------------------------------------------------------------------------------------
結果:
林青霞---27
劉意---30
類的初始化過程
加載Student.class文件進內存
在棧中爲s開闢空間
在堆內存未學生對象開闢空間
對學生對象的成員變量進行默認初始化
對學生對象的成員變量進行顯示初始化
通過構造方法對學生對象的成員變量賦值
學生對象初始化完畢,把對象地址賦值給s變量
class Phone{
//品牌
private String brand;
//價格
private int price;
//顏色
private String color;
//無參構造方法
public Phone() {
}
public void setBrand(String brand) {
this.brand=brand;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
}
public class PhoneTest {
public static void main(String[] args) {
Phone s = new Phone();
s.setBrand("三星");
s.setPrice(4999);
s.setColor("褐色");
System.out.println(s.getBrand()+"---"+s.getPrice()+"---"+s.getColor());
}
}
-----------------------------------------------------------------------------------------
結果:
三星---4999---褐色
如果一個變量是用來描述這個類的信息,該變量就應該定義爲成員變量
static關鍵字
可以修飾成員變量和成員方法
特點:
隨着類的加載而加載
優先與對象存在
被類的所有對象共享(判斷該不該使用靜態的依據)
可以通過類名調用
注意事項
在靜態方法中是沒有this關鍵字
靜態方法只能訪問靜態成員變量和靜態成員方法(非靜態方法都可以訪問)
靜態變量和成員變量的區別
所屬不同
靜態變量:屬於類,類變量
成員變量:屬於對象,對象變量,實例變量
內存位置不同
靜態變量:方法區的靜態區
成員變量:堆內存
生命週期不同
靜態變量:靜態變量是隨着類的加載而加載,隨着類的消失而消失
成員變量:成員變量是隨着對象的創建而存在,隨着對象的消失而消失
調用不同
靜態變量:可以通過對象名調用,也可以通過類名調用
成員變量:只能通過對象名調用
main方法格式:
public static void main(String[] args){....}
public:公共的,訪問權限是最大的。由於main方法是被jvm調用,所以權限要夠大。
static:靜態的,不需要創建對象,通過類名就可以。方便jvm調用。
void:main方法是被jvm調用,不需要返回值
main:是一個常見的方法入口。(主方法)
String[] args:字符串數組。