當前位置:
首頁 > 遊戲 > 3.面向對象(三)

3.面向對象(三)

3.面向對象(三)


1.static關鍵字

1.static:靜態的,可以用來修飾屬性、方法、*代碼塊(或初始化塊)、*內部類

2.

static修飾屬性(類變數):

* 1.由類創建的所有的對象,都共用這一個屬性

* 2.當其中一個對象對此屬性進行修改,會導致其他對象對此屬性的一個調用。vs 實例變數(非static修飾的屬性,各個對象各自擁有一套副本)

* 3.類變數隨著類的載入而載入的,而且獨一份

* 4.靜態的變數可以直接通過「類.類變數」的形式來調用

* 5.類變數的載入是要早於對象。所以當有對象以後,可以「對象.類變數」使用。但是"類.實例變數"是不行的。

* 6.類變數存在於靜態域中。

*

* static修飾方法(類方法):

* 1.隨著類的載入而載入,在內存中也是獨一份

* 2.可以直接通過「類.類方法」的方式調用

* 3.內部可以調用靜態的屬性或靜態的方法,而不能調用非靜態的屬性或方法。反之,非靜態的方法是可以調用靜態的屬性或靜態的方法

* >靜態的方法內是不可以有this或super關鍵字的!

* 註:靜態的結構(static的屬性、方法、代碼塊、內部類)的生命周期要早於非靜態的結構,同時被回收也要晚於非靜態的結構

3.面向對象(三)

public class TestCircle {
public static void main(String[] args) {
Circle c1 = new Circle();
Circle c2 = new Circle(2.3);
System.out.println(c1);
System.out.println(c2);
System.out.println(Circle.getTotal());
}
}

class Circle{
private double radius;
private static String info = "我是一個圓";
private int id;//編號
private static int init = 1001;//控制每個對象的id
private static int total = 0;//記錄創建了多少個對象

public Circle(){
this.id = init++;
total++;
}
public Circle(double radius){
this.radius = radius;
this.id = init++;
total++;
}

public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public static String getInfo() {
return info;
}
public static void setInfo(String info) {
Circle.info = info;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public static int getTotal() {
return total;
}
public static void setTotal(int total) {
Circle.total = total;
}
@Override
public String toString() {
return "Circle [radius=" + radius + ", id=" + id + "]";
}
public static void show(){
System.out.println(Circle.info);
}

public void desc(){
System.out.println(this.info);
}
}

單例模式

23種設計模式

單例模式:

解決的問題:如何只讓設計的類只能創建一個對象

如何實現:餓漢式 & 懶漢式

//餓漢式1
class Bank{
//1.私有化構造器
private Bank(){}
//2.創建類的對象,同時設置為private的,通過公共的來調用,體現封裝性
//4.要求此對象也為static的
private static Bank instance = new Bank();
//3.此公共的方法,必須為static
public static Bank getInstance(){
return instance;
}
}
//餓漢式2
class Bank{
//1.私有化構造器
private Bank(){}
//2.創建類的對象,同時設置為private的,通過公共的來調用,體現封裝性
//4.要求此對象也為static的
private static Bank instance = null;
static{
instance = new Bank();
}
//3.此公共的方法,必須為static
public static Bank getInstance(){
return instance;
}
}
//懶漢式
class Bank{
private Bank(){}

private static Bank instance = null;

public static Bank getInstance(){
if(instance == null){//可能存在線程安全問題的!
instance = new Bank();
}
return instance;
}
}

2.main方法

public static void main(String[] args){

//方法體

}

//1.main()是一個方法,是主方法,為程序的入口

//2.許可權修飾符:public protected 預設 private ---面向對象的封裝性

//3.對於方法來講:static final abstract

//4.方法的返回值:void / 具體的返回值類型(基本的數據類型 & 引用數據類型),方法內部一定要有return

//5.方法名:命名的規則:xxxYyyZzz。給方法命名時,要見名之意

//6.形參列表:同一個方法名不同的形參列表的諸多個方法間構成重載。 形參 & 實參---方法的參數傳遞機制:值傳遞

//7.方法體:方法定義的是一種功能,具體的實現由方法體操作。


3.代碼塊

代碼塊:是類的第4個成員

作用:用來初始化類的屬性

分類:只能用static來修飾。

* 靜態代碼塊:

* 1.裡面可以有輸出語句

* 2.隨著類的載入而載入,而且只被載入一次

* 3.多個靜態代碼塊之間按照順序結構執行

* 4.靜態代碼塊的執行要早於非靜態代碼塊的執行。

* 5.靜態的代碼塊中只能執行靜態的結構(類屬性,類方法)

*

* 非靜態代碼塊:

* 1.可以對類的屬性(靜態的 & 非靜態的)進行初始化操作,同時也可以調用本類聲明的方法(靜態的 & 非靜態的)

* 2.裡面可以有輸出語句

* 3.一個類中可以有多個非靜態的代碼塊,多個代碼塊之間按照順序結構執行

* 4.每創建一個類的對象,非靜態代碼塊就載入一次。

* 5.非靜態代碼塊的執行要早於構造器

*

* 關於屬性賦值的操作:

①默認的初始化

②顯式的初始化或代碼塊初始化(此處兩個結構按照順序執行)

③構造器中;

—————————以上是對象的屬性初始化的過程—————————————

④通過方法對對象的相應屬性進行修改

4.final關鍵字

/*

* final:最終的 ,可以用來修飾類、屬性、方法

*

* 1.final修飾類:這個類就不能被繼承。如:String類、StringBuffer類、System類

*

* 2.final修飾方法:不能被重寫。如:Object類的getClass()

*

* 3.final修飾屬性:此屬性就是一個常量,一旦初始化後,不可再被賦值。習慣上,常量用大寫字元表示。

* 此常量在哪裡賦值:①此常量不能使用默認初始化 ②可以顯式的賦值、代碼塊、構造器。

*

* 變數用static final修飾:全局常量。比如:Math 類的PI

*

* >與finally finalize()區分開

*

*/

class D{

final int I = 12;

final double PI;

final String NAME;

public void m1(){

System.out.println(I);

// I = 10;

}

{

PI = 3.14;

}

public D(){

NAME = "DD";

}

public D(String name){

this();

//NAME = name;

}

}


5.抽象:abstract

重點!

abstract:抽象的,可以用來修飾類、方法

* 1.abstract修飾類:抽象類

* 1)不可被實例化

* 2)抽象類有構造器 (凡是類都有構造器)

* 3)抽象方法所在的類,一定是抽象類。

* 4)抽象類中可以沒有抽象方法。

* >當我們設計一個類,不需要創建此類的實例時候,就可以考慮將其設置為抽象的,由其子類實現這個類的抽象方法以後,就行實例化

*

* 2.abstract修飾方法:抽象方法

* 1)格式:沒有方法體,包括{}.如:public abstract void eat();

* 2)抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法。

* 3)若子類繼承抽象類,並重寫了所有的抽象方法,則此類是一個"實體類",即可以實例化

* 4)若子類繼承抽象類,沒有重寫所有的抽象方法,意味著此類中仍有抽象方法,則此類必須聲明為抽象的!


模板方法設計模式

//模板方法設計模式

public class TestTemplate {

public static void main(String[] args) {

new SubTemplate().spendTime();

}

}

abstract class Template {

public abstract void code();

public void spendTime() {

long start = System.currentTimeMillis();

this.code();

long end = System.currentTimeMillis();

System.out.println("花費的時間為:" + (end - start));

}

}

class SubTemplate extends Template {

public void code() {

boolean flag = false;

for(int i = 2;i <= 10000;i++){

for(int j = 2;j <= Math.sqrt(i);j++){

if(i % j == 0){

flag = true;

break;

}

}

if(!flag){

System.out.println(i);

}

flag = false;

}

}

}


6.介面interface

* 介面(interface) 是與類並行的一個概念

* 1.介面可以看做是一個特殊的抽象類。是常量與抽象方法的一個集合,不能包含變數、一般的方法。

* 2.介面是沒有構造器的。

* 3.介面定義的就是一種功能。此功能可以被類所實現(implements)。

* 比如:class CC extends DD implements AA

* 4.實現介面的類,必須要重寫其中的所有的抽象方法,方可實例化。若沒有重寫所有的抽象方法,則此類仍為一個抽象類

* 5.類可以實現多個介面。----java 中的類的繼承是單繼承的

* 6.介面與介面之間也是繼承的關係,而且可以實現多繼承

* >5,6描述的是java中的繼承的特點。

* 7.介面與具體的實現類之間也存在多態性

* 8.面向介面編程的思想:

3.面向對象(三)


工廠方法的設計模式

//介面的應用:工廠方法的設計模式

public class TestFactoryMethod {

public static void main(String[] args) {

IWorkFactory i = new StudentWorkFactory();

i.getWork().doWork();

IWorkFactory i1 = new TeacherWorkFactory();

i1.getWork().doWork();

}

}

interface IWorkFactory{

Work getWork();

}

class StudentWorkFactory implements IWorkFactory{

@Override

public Work getWork() {

return new StudentWork();

}

}

class TeacherWorkFactory implements IWorkFactory{

@Override

public Work getWork() {

return new TeacherWork();

}

}

interface Work{

void doWork();

}

class StudentWork implements Work{

@Override

public void doWork() {

System.out.println("學生寫作業");

}

}

class TeacherWork implements Work{

@Override

public void doWork() {

System.out.println("老師批改作業");

}

}


代理模式

//介面的應用:代理模式(靜態代理)

public class TestProxy {

public static void main(String[] args) {

Object obj = new ProxyObject();

obj.action();

}

}

interface Object{

void action();

}

//代理類

class ProxyObject implements Object{

Object obj;

public ProxyObject(){

System.out.println("代理類創建成功");

obj = new ObjctImpl();

}

public void action(){

System.out.println("代理類開始執行");

obj.action();

System.out.println("代理類執行結束");

}

}

//被代理類

class ObjctImpl implements Object{

@Override

public void action() {

System.out.println("=====被代理類開始執行======");

System.out.println("=====具體的操作======");

System.out.println("=====被代理類執行完畢======");

}

}


7.內部類

* 類的第5個成員:內部類

* 1.相當於說,我們可以在類的內部再定義類。外面的類:外部類。裡面定義的類:內部類

* 2.內部類的分類:成員內部類(聲明在類內部且方法外的) vs 局部內部類(聲明在類的方法里)

* 3.成員內部類:

* 3.1是外部類的一個成員:①可以有修飾符(4個)②static final ③可以調用外部類的屬性、方法

*

* 3.2具體類的特點:①abstract ②還可以在其內部定義屬性、方法、構造器

*

* 4.局部內部類:

*

* 5.關於內部類,大家掌握三點:

* ①如何創建成員內部類的對象(如:創建Bird類和Dog類的對象)

* ②如何區分調用外部類、內部類的變數(尤其是變數重名時)

* ③局部內部類的使用 (見TestInnerClass1.java)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |