abstract類
* 1.abstract修飾類:抽象類
* 1)不可被實例化
* 2)抽象類有構造器 (凡是類都有構造器)
* 3)抽象方法所在的類,一定是抽象類。
* 4)抽象類中可以沒有抽象方法。
* >當我們設計一個類,不需要創建此類的實例時候,就可以考慮將其設置爲抽象的,由其子類實現這個類的抽象方法以後,就行實例化
*
* 2.abstract修飾方法:抽象方法
* 1)格式:沒有方法體,包括{}.如:public abstract void eat();
* 2)抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法。
* 3)若子類繼承抽象類,並重寫了所有的抽象方法,則此類是一個"實體類",即可以實例化
* 4)若子類繼承抽象類,沒有重寫所有的抽象方法,意味着此類中仍有抽象方法,則此類必須聲明爲抽象的!
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;
}
}
接口
* 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()方法
//方法體
}
1.main()是一個方法,是主方法,爲程序的入口
2.權限修飾符:public protected 缺省 private ---面向對象的封裝性
3.對於方法來講:static final abstract
4.方法的返回值:void / 具體的返回值類型(基本的數據類型 & 引用數據類型),方法內部一定要有return
5.方法名:命名的規則:xxxYyyZzz。給方法命名時,要見名之意
6.形參列表:同一個方法名不同的形參列表的諸多個方法間構成重載。 形參 & 實參---方法的參數傳遞機制:值傳遞
7.方法體:方法定義的是一種功能,具體的實現由方法體操作。
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("=====被代理類執行完畢======");
}
}
代碼塊
作用:用來初始化類的屬性
分類:只能用static來修飾。
* 靜態代碼塊:
* 1.裏面可以有輸出語句
* 2.隨着類的加載而加載,而且只被加載一次
* 3.多個靜態代碼塊之間按照順序結構執行
* 4.靜態代碼塊的執行要早於非靜態代碼塊的執行。
* 5.靜態的代碼塊中只能執行靜態的結構(類屬性,類方法)
*
* 非靜態代碼塊:
* 1.可以對類的屬性(靜態的 & 非靜態的)進行初始化操作,同時也可以調用本類聲明的方法(靜態的 & 非靜態的)
* 2.裏面可以有輸出語句
* 3.一個類中可以有多個非靜態的代碼塊,多個代碼塊之間按照順序結構執行
* 4.每創建一個類的對象,非靜態代碼塊就加載一次。
* 5.非靜態代碼塊的執行要早於構造器
*
* 關於屬性賦值的操作:
①默認的初始化
②顯式的初始化或代碼塊初始化(此處兩個結構按照順序執行)
③構造器中;
—————————以上是對象的屬性初始化的過程—————————————
④通過方法對對象的相應屬性進行修改
單例模式
單例模式:
解決的問題:如何只讓設計的類只能創建一個對象
如何實現:餓漢式 & 懶漢式
//餓漢式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;
}
}
}
內部類
* 1.相當於說,我們可以在類的內部再定義類。外面的類:外部類。裏面定義的類:內部類
* 2.內部類的分類:成員內部類(聲明在類內部且方法外的) vs 局部內部類(聲明在類的方法裏)
* 3.成員內部類:
3.2具體類的特點:①abstract ②還可以在其內部定義屬性、方法、構造器
* 4.局部內部類:
即在方法中定義的內部類,與局部變量類似,在局部內部類前不加修飾符public或private,其範圍爲定義它的代碼塊。
* 5.關於內部類,三點:
* ①如何創建成員內部類的對象(如:創建Bird類和Dog類的對象)
* ②如何區分調用外部類、內部類的變量(尤其是變量重名時)
* ③局部內部類的使用 (見TestInnerClass1.java)