面向對象的思想
面向對象思想:強調對象,由對象去調用功能
- 1-是一種符合我們思考習慣的思想
- 2-將複雜變簡單
- 3-將我們從執行者變成指揮者
類
如何表示事物:
-
1-屬性
-
2-行爲
-
例如-學生
-
Java語言最基本的單位是類:一組相關的屬性和行爲的集合
-
對象:就是該事物的具體體現
-
舉例:
-
類-學生
-
對象-學生
類的簡單定義
- 類的定義:屬性和方法
- 類:
-
成員變量:和普通變量的定義是一樣的,只是位置不同(類中,方法外),不需要給初始化
-
成員方法:和普通方法的定義是一樣的,只是要去掉static關鍵字
package com.object1;
/*
* 手機類的定義:
* 變量:品牌、價格、顏色
* 方法:短信、電話
*/
public class Phone {
//變量
String brand;
int price;
String color;
//方法
public void call(String name) {
System.out.println("給"+name+"打電話");
}
public void mess(String name) {
System.out.println("給"+name+"發信息");
}
}
package com.object1;
public class PhoneDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Phone p=new Phone();
//變量賦值
p.brand="錘子";
p.color="黑色";
p.price=2999;
//輸出變量
System.out.println("品牌:"+p.brand);
System.out.println("顏色:"+p.color);
System.out.println("價格:"+p.price);
//調用方法
p.call("wang");
p.mess("li");
Phone p2=new Phone();
//變量賦值
p2.brand="小米";
p2.color="白色";
p2.price=1999;
//輸出變量
System.out.println("品牌:"+p2.brand);
System.out.println("顏色:"+p2.color);
System.out.println("價格:"+p2.price);
//調用方法
p2.call("jiang");
p2.mess("shi");
//在創建新對象
Phone p3=p;
p3.brand="OPPO";
p3.color="紫色";
p3.price=3999;
//此時p的值p3是一致的(兩個引用指向同一個對象)
System.out.println("---------------------");
System.out.println("品牌:"+p.brand);
System.out.println("顏色:"+p.color);
System.out.println("價格:"+p.price);
System.out.println("品牌:"+p3.brand);
System.out.println("顏色:"+p3.color);
System.out.println("價格:"+p3.price);
}
}
成員變量和局部變量
成員變量和局部變量:
-
A- 成員變量:類中,方法外
-
局部變量:方法中或方法聲明上(形式參數)
-
B- 在內存中的位置不同:
-
成員變量:堆內存
-
局部變量:棧內存
-
C- 生命週期不同
-
成員變量:隨獨享的創建存在,隨對象的消失而消失
-
局部變量:隨着方法的調用存在,隨着方法調用完畢而消失
-
D- 初始化
-
成員變量:有默認值
-
局部變量:沒有默認值,必須先定義再使用
private修飾
package com.object3;
/*
* 通過對象直接訪問成員變量,會存在數據安全問題
* 使用private不讓外界直接訪問成員變量
* private修飾符:可以修飾成員變量和成員方法,被修飾後只能在本類中使用
*
* 針對private修飾的成員變量,我們會相應的提供getXXX()和setXXX()方法用於獲取和設置成員變量的值,
* 方法用public修飾
*/
public class Student {
//屬性-姓名、年齡---
//方法-學習、喫飯
//成員變量
String name;
private int age;
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
if (a<0||a>200) {
System.out.println("年齡設置有誤");
}else {
age=a;
}
}
public int getAge() {
return age;
}
//方法
public void show() {
System.out.println("name:"+name+";"+"age:"+age);
}
public void study() {
System.out.println("認真學習");
}
public void eat() {
System.out.println("好好喫飯");
}
}
package com.object3;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s=new Student();
s.show();
s.setAge(28);
s.setName("wang");
s.show();
}
}
封裝-面向對象的三大特徵之一(繼承和多態)
封裝的原則:把不需要對外提供的內容隱藏
把屬性隱藏,提供公共方法對其訪問
private修飾的成員變量,我們會相應的提供getXXX()和setXXX()方法用於
獲取和設置成員變量的值,方法用public修飾
this 關鍵字
如果局部變量和成員變量同名,在局部使用時,採用就近原則
- this關鍵字(解決局部變量隱藏成員變量的問題):代表所在類的對象引用
- 方法被哪個對象調用,this就代表那個對象
package com.object4;
public class Student {
//成員變量
String name;
private int age;
public void setName(String name) {
//name=name;
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age=age;
this.age=age;
}
public int getAge() {
return age;
}
//方法
public void show() {
System.out.println("name:"+name+";"+"age:"+age);
}
}
構造方法
給對象的數據進行初始化
構造方法的格式:
方法名和類名相同
沒有返回值類型,連void都不能寫
沒有具體的返回值
構造方法的調用
通過new關鍵字調用
格式爲:
-
類名 對象名 = new 構造方法(.....);
構造方法的注意:
-
1-如果我們沒有構造方法,那麼系統會默認提供一個無參的構造方法
-
2-如果我們給出了構造方法,系統將不再提供無參的構造方法,如果想使用必須自己提供
-
3-構造方法也是可以重載的
成員變量賦值:
-
1-setXX方法
-
2-帶參構造方法
package com.object5;
public class Student {
private String name;
private int age;
public Student() {
System.out.println("這是無參構造方法");
}
public Student(String name) {
System.out.println("這是帶一個參數的構造方法");
this.name = name;
}
public Student(String name,int age) {
System.out.println("這是帶兩個參數的構造方法");
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
一個完整的類的書寫方式如下:
package com.object6;
public class Student {
//成員變量
private String name;
private int age;
//構造方法
public Student() {
System.out.println("無參構造方法");
}
public Student(String name,int age) {
System.out.println("有參構造方法");
this.name = name;
this.age = age;
}
//成員方法-get和set方法
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.object6;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//無參方法進行賦值
Student s = new Student();
s.setName("wang");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
//另一種構造方法進行賦值
Student s1 =new Student("tong",27);
System.out.println(s1.getName()+"---"+s1.getAge());
}
}