java基礎-面向對象(三)

abstract類

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


 * 1.abstract修飾類:抽象類
 * 1)不可被實例化
 * 2)抽象類有構造器 (凡是類都有構造器)
 * 3)抽象方法所在的類,一定是抽象類。
 * 4)抽象類中可以沒有抽象方法。
 * >當我們設計一個類,不需要創建此類的實例時候,就可以考慮將其設置爲抽象的,由其子類實現這個類的抽象方法以後,就行實例化
 * 
 * 2.abstract修飾方法:抽象方法
 * 1)格式:沒有方法體,包括{}.如:public abstract void eat();
 * 2)抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法。
 * 3)若子類繼承抽象類,並重寫了所有的抽象方法,則此類是一個"實體類",即可以實例化
 * 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;
}
}

接口

 * 接口(interface)  是與類並行的一個概念
 * 1.接口可以看做是一個特殊的抽象類。是常量與抽象方法的一個集合,不能包含變量、一般的方法。
 * 2.接口是沒有構造器的。
 * 3.接口定義的就是一種功能。此功能可以被類所實現(implements)。
 * 比如:class CC extends DD implements AA
 * 4.實現接口的類,必須要重寫其中的所有的抽象方法,方可實例化。若沒有重寫所有的抽象方法,則此類仍爲一個抽象類
 * 5.類可以實現多個接口。----java 中的類的繼承是單繼承的
 * 6.接口與接口之間也是繼承的關係,而且可以實現多繼承
 * >5,6描述的是java中的繼承的特點。
 * 7.接口與具體的實現類之間也存在多態性
 * 8.面向接口編程的思想:

面向接口編程,就是面向抽象編程。
舉例來說,你老師說的那個例子
A是接口(接口就是抽象的),B是類(生成後類對象是具體的)。
A s=new B;
s這個對象具有A接口規定的一切方法(B類裏強制必須實現的)。
這樣C,D, E ,F類也可以實現A接口,
如果想替換成C,D ,E, F就很簡單了,調用時候還是用A接口規定的哪些方法。
結合一些動態載入(例如Spring的xml配置可以動態生成類),不會耦合了,
甚至不用重新編譯,也稱之爲爲”解耦“。
面向接口是面向對象設計(OO)的一種方法,Java提供了,而C/C++沒有。

main()方法

public static void main(String[] args){
     //方法體     
}
1.main()是一個方法,是主方法,爲程序的入口
2.權限修飾符:public protected 缺省 private ---面向對象的封裝性
3.對於方法來講:static final abstract 
4.方法的返回值:void /  具體的返回值類型(基本的數據類型 & 引用數據類型),方法內部一定要有return
5.方法名:命名的規則:xxxYyyZzz。給方法命名時,要見名之意
6.形參列表:同一個方法名不同的形參列表的諸多個方法間構成重載。   形參 & 實參---方法的參數傳遞機制:值傳遞
7.方法體:方法定義的是一種功能,具體的實現由方法體操作。

static關鍵字

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

2.static修飾屬性(類變量):
 * 1.由類創建的所有的對象,都共用這一個屬性
 * 2.當其中一個對象對此屬性進行修改,會導致其他對象對此屬性的一個調用。vs 實例變量(非static修飾的屬性,各個對象各自擁有一套副本)
 * 3.類變量隨着類的加載而加載的,而且獨一份
 * 4.靜態的變量可以直接通過“類.類變量”的形式來調用
 * 5.類變量的加載是要早於對象。所以當有對象以後,可以“對象.類變量”使用。但是"類.實例變量"是不行的。
 * 6.類變量存在於靜態域中。
 * 
 * static修飾方法(類方法):
 * 1.隨着類的加載而加載,在內存中也是獨一份
 * 2.可以直接通過“類.類方法”的方式調用
 * 3.內部可以調用靜態的屬性或靜態的方法,而不能調用非靜態的屬性或方法。反之,非靜態的方法是可以調用靜態的屬性或靜態的方法
 * >靜態的方法內是不可以有this或super關鍵字的!
 * 注:靜態的結構(static的屬性、方法、代碼塊、內部類)的生命週期要早於非靜態的結構,同時被回收也要晚於非靜態的結構

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);
}
}

代理模式

//接口的應用:代理模式(靜態代理)
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("=====被代理類執行完畢======");
}
}

代碼塊

代碼塊:是類的第4個成員
作用:用來初始化類的屬性
分類:只能用static來修飾。

 * 靜態代碼塊:
 * 1.裏面可以有輸出語句
 * 2.隨着類的加載而加載,而且只被加載一次
 * 3.多個靜態代碼塊之間按照順序結構執行
 * 4.靜態代碼塊的執行要早於非靜態代碼塊的執行。
 * 5.靜態的代碼塊中只能執行靜態的結構(類屬性,類方法)
 * 
 * 非靜態代碼塊:
 * 1.可以對類的屬性(靜態的 & 非靜態的)進行初始化操作,同時也可以調用本類聲明的方法(靜態的 & 非靜態的)
 * 2.裏面可以有輸出語句
 * 3.一個類中可以有多個非靜態的代碼塊,多個代碼塊之間按照順序結構執行
 * 4.每創建一個類的對象,非靜態代碼塊就加載一次。
 * 5.非靜態代碼塊的執行要早於構造器
 * 
 * 關於屬性賦值的操作:
①默認的初始化
②顯式的初始化或代碼塊初始化(此處兩個結構按照順序執行) 
③構造器中;
—————————以上是對象的屬性初始化的過程—————————————
④通過方法對對象的相應屬性進行修改

單例模式

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;
}
}

工廠方法的設計模式

//接口的應用:工廠方法的設計模式
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 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;
}
}
}

內部類

 * 類的第5個成員:內部類
 * 1.相當於說,我們可以在類的內部再定義類。外面的類:外部類。裏面定義的類:內部類
 * 2.內部類的分類:成員內部類(聲明在類內部且方法外的)  vs 局部內部類(聲明在類的方法裏)
 * 3.成員內部類:
 3.1是外部類的一個成員:①可以有修飾符(4個)②static final ③可以調用外部類的屬性、方法

 
  3.2具體類的特點:①abstract ②還可以在其內部定義屬性、方法、構造器
  
 * 4.局部內部類:
即在方法中定義的內部類,與局部變量類似,在局部內部類前不加修飾符public或private,其範圍爲定義它的代碼塊。


 * 5.關於內部類,三點:
 *   ①如何創建成員內部類的對象(如:創建Bird類和Dog類的對象)
 *   ②如何區分調用外部類、內部類的變量(尤其是變量重名時)
 *   ③局部內部類的使用 (見TestInnerClass1.java)
發佈了38 篇原創文章 · 獲贊 1 · 訪問量 5454
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章