面向對象
面向對象的特徵
封裝(encapsulation)
繼承(inheritance)
多態(polymorphism)
類與對象的概述
- 現實生活中如何描述事物
- 屬性 就是該事物的描述信息
- 行爲 該事物能夠做什麼
- Java中最基本的單位是類,Java中用class描述事物
- 成員變量 事物的屬性
- 成員方法 事物的行爲
- 定義類其實就是定義類的成員(成員變量和成員方法)
- 成員變量 和以前定義變量一樣,只是位置發生了變化.在類中方法外
- 成員方法 和以前定義方法一樣,只不過去掉了static
類和對象的概念
- 類:是一組相關屬性和行爲的集合
- 對象:是該類事物的具體體現
- 舉例
- 類:學生
- 對象:具體某個學生
class Demo1_Student {
public static void main
(String[] args){
//創建對象的格式: 類名 對象名=
new 類名();
//對象名:其實就是合法的標識符,如
果一個單詞所有字母小寫,如果是多個
單詞,從第二個單詞開始首字母大寫
Student s=new Student();
//如何使用成員變量? 對象名.變量名
s.nema="張三";
s.age=23;
//如何使用成員方法?
對象名.方法名(...)
s.study();
s.sleep();
}
}
class Student{
String name;
int age;
String gender;
public void study(){
System.out.println("學生學習");
}
public void sleep(){
System.out.println("學生睡覺");
}
}
學生類的使 用
文件名問題
- 在一個Java文件中寫兩個類:一個基本類,一個測試類.
- 建議文件名和測試類一致
如何適用對象
- 創建對象並使用
- 格式: 類名 對象名 = new 類名();
如何使用成員變量
- 對象名.變量名
如何使用成員方法
- 對象名.方法名(…)
class Demo1_Car{
public static void main(String[]
args){
Car c1=new Car();//創建對象
//調用屬性並賦值
c1.color="red";//爲車的輪胎數賦值
c1.num=8; //爲車的輪胎數賦值
//調用行爲
c1.run();
Car c2=new Car();//創建對象
c2.colar="black";//爲車的顏色賦值
c2.num=4;
//爲車的輪胎數賦值
//c2=null;
//用null把原來的地址值覆蓋掉
//c2.run();
//c2裏面的記錄是null,所以報出
空指針異常
Car c3=c2;
c3.run();
}
}
/*
車的屬性 車的顏色 車的輪胎數
車的行爲 車運行
*/
class Car{
//成員變量
String colar; //車的顏色
int num; //車的輪胎數
public void run(){ //車運行
System.out.println(colar+"..."+num);
}
}
一個對象的內存圖
兩個對象的內存圖
三個對象的內存圖
匿名對象內存圖
成員變量和局部變量的區別
在類中的位置不同
- 成員變量:在類中方法外
- 局部變量:在方法定義中或者方法聲明上
在內存中的位置不同
- 成員變量:在對內存中(成員變量屬於對象,對象進堆內存)
- 局部變量:在棧內存中(局部變量屬於方法,方法進棧內存)
生命週期不同
- 成員變量:隨着對象的創建而存在,隨着對象的消失而消失
- 局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
初始化值不同
- 成員變量:有默認初始化值
- 局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用
注意事項
- 局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用的是就近原則
- 基本數據類型變量包括哪些:byte,short,int,long,float,double,boolean,char
- 引用數據類型變量包括哪些:數組,類,接口,枚舉
class Demo2_Person{
public static void main(String[]
args){
Person p =new Person();
p.speak();
}
}
class Person{
String name; //成員變量
int num;
public void speak() {
int num = 10;
//x和num都是局部變量
System.out.println(name);
System.out.println(num);
}
}
方法的形式參數是類名的時候如何調用
- 方法的參數是類名 public void print (Student s){}//print(new Student());
- 一個方法的形式參數是一個類類型(引用類型),這裏其實需要的是該類的對象
匿名對象的概述和應用
class Demo1_Student {
public static void main(String[]
args) {
print(10);
//創建對象,並將對象的地址值賦值給s
Student s = new Student();
print(s);
}
//基本數據類型當作形式參數
public static void print(int x) {
System.out.println(x);
}
//引用數據類型當作形式參數
public static void print(Student stu){
stu.name = "張三";
stu.age = 23;
stu.speak();
}
}
/*
* A:方法的參數是類名public void print
(Student s){}//print(new Student());
* 如果你看到了一個方法的形式參數是一個類
類型(引用類型),這裏其實需要的是該類的對象
*/
class Student {
String name; //姓名
int age; //年齡
public void speak() {
System.out.println(name + "..."
+ age);
}
}
匿名對象:沒有名字的對象
匿名對象的應用場景
- 場景:僅僅用一次的時候
- 好處:節省代碼(多次調用的時候不合適,匿名對象調用完畢就是垃圾,可以被垃圾回收器回收)
- 注意:調用多次的時候不適合.匿名對象調用完畢就是垃圾,可以被垃圾回收器回收
- 匿名對象可以作爲實際參數傳遞
- 案例演示
- 匿名對象應用場景
class Demo2_Car {
public static void main(String[]
args) {
/*Car c1 = new Car();
//創建有名字的對象
c1.run();
c1.run();
new Car().run();
//匿名對象調用方法
new Car().run(); */
/*匿名對象只適合對方法的一次調用,
因爲調用多
次就會產生多個對象,不如用有名字的
對象*/
//匿名對象是否可以調用屬性並賦值?
有什麼意義?
/*
匿名對象可以調用屬性,但是沒有意義
,因爲調用後就變成垃圾
如果需要賦值還是用有名字對象
*/
new Car().color = "red";
new Car().num = 8;
new Car().run();
}
}
class Car {
String color; //顏色
int num; //輪胎數
public void run() {
System.out.println(color + "..."
+ num);
}
}
class Demo3_Car {
public static void main(String[]
args) {
//Car c1 = new Car();
/*c1.color = "red";
c1.num = 8;
c1.run();*/
//method(c1);
method(new Car());
//Car c2 = new Car();
//method(c2);
method(new Car());
//匿名對象可以當作參數傳遞
}
//抽取方法提高代碼的複用性
public static void method(Car cc) {
//Car cc = new Car();
cc.color = "red";
cc.num = 8;
cc.run();
}
}
class Car {
String color; //顏色
int num; //輪胎數
public void run() {
System.out.println(color + "..."
+ num);
}
}
封裝的概述
封裝概述
- 封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問的方式
封裝的好處
- 隱藏實現的細節,提供公共訪問方式
- 提高代碼的複用性
- 提高安全性
封裝原則
- 將不需要對外提供的內容都隱藏起來
- 把屬性隱藏,提供公共方法對其訪問
privite關鍵字的概述和特點
private關鍵字的特點
- 是一個權限修飾符
- 可以修飾成員變量和成員方法
- 被其修飾的成員只能在本類中被訪問
案例演示
- private僅僅是封裝的一種體現形式,不能說封裝就是privat
/*
* A:人類賦值年齡的問題
* B:private關鍵字特點
* a:是一個權限修飾符
* b:可以修飾成員變量和成員方法
* c:被其修飾的成員只能在本類中被訪問
* C:案例演示
* 封裝和private的應用:
* A:把成員變量用private修飾
* B:提供對應的getXxx()和setXxx()方法
* private僅僅是封裝的一種體現形式,不
能說封裝就是私有
*/
class Demo1_Person {
public static void main(String[]
args) {
Person p1 = new Person();
p1.name = "張三";
//調用姓名屬性並賦值
//p1.age = -17;
//調用年齡屬性並賦值
//p1.speak(); //調用行爲
p1.setAge(-17);
System.out.println(p1.getAge());
}
}
class Person {
String name; //姓名
private int age; //年齡
public void setAge(int a) {
//設置年齡
if (a > 0 && a < 200) {
age = a;
}else {
System.out.println(
"請回火星吧,地球不適合你");
}
}
public int getAge() {
//獲取年齡
return age;
}
public void speak() {
System.out.println(name + "..."
+ age);
}
}
this關鍵字的概述和應用
this關鍵字的特點
- 代表對當前對象的引用
案例演示
- this的應用場景
- 用來區分成員變量和局部變量重名
/*
* A:this關鍵字特點
* 代表當前對象的引用
* B:案例演示
* this的應用場景
* 用來區分成員變量和局部變量重名
*/
class Demo1_This {
public static void main(String[]
args) {
Person p1 = new Person();
p1.setName("張三");
p1.setAge(23);
System.out.println(p1.getName()
+ "..." +
p1.getAge());
Person p2 = new Person();
p2.setName("李四");
p2.setAge(24);
System.out.println(p2.getName()
+ "..." +
p2.getAge());
}
}
class Person {
private String name;
//姓名
private int age;
//年齡
public void setAge(int age) {
//設置年齡
if (age > 0 && age < 200) {
this.age = age;
//System.out.println(age);
}else {
System.out.println(
"請回火星吧,地球不適
合你");
}
}
public int getAge() {
//獲取年齡
return age;
}
public void setName(String name) {
//設置姓名
this.name = name;
//System.out.println(name);
}
public String getName() {
return name;
}
}
class Demo2_Phone {
public static void main(String[]
args) {
Phone p1 = new Phone();
p1.setBrand("三星");
p1.setPrice(5288);
System.out.println(p1.getBrand()
+ "..." + p1.getPrice());
p1.call();
p1.sendMessage();
p1.playGame();
}
}
/*
手機類
屬性:品牌brand,價格price
行爲:打電話call,發短信sendMessage,玩
遊戲,playGame
*/
class Phone { //java bean
private String brand;
//品牌
private int price;
//價格
public void setBrand(String brand) {
//設置品牌
this.brand = brand;
}
public String getBrand() {
//獲取品牌
return this.brand;
//this.可以省略,你不加系統會默認
給你加
}
public void setPrice(int price) {
//設置價格
this.price = price;
}
public int getPrice() {
//獲取價格
return price;
}
public void call() {
//打電話
System.out.println("打電話");
}
public void sendMessage() {
//發短信
System.out.println("發短信");
}
public void playGame() {
//玩遊戲
System.out.println("玩遊戲");
}
}