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); } }
解決的問題:如何只讓設計的類只能建立一個對象
如何實現:餓漢式 & 懶漢式java
class Bank{ //1.私有化構造器 private Bank(){} //2.建立類的對象,同時設置爲private的,經過公共的來調用,體現封裝性 //4.要求此對象也爲static的 private static Bank instance = new Bank(); //3.此公共的方法,必須爲static public static Bank getInstance(){ return instance; } }
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 static void main(String[] args){ //方法體 } //1.main()是一個方法,是主方法,爲程序的入口 //2.權限修飾符:public protected 缺省 private ---面向對象的封裝性 //3.對於方法來說:static final abstract //4.方法的返回值:void / 具體的返回值類型(基本的數據類型 & 引用數據類型),方法內部必定要有return //5.方法名:命名的規則:xxxYyyZzz。給方法命名時,要見名之意 //6.形參列表:同一個方法名不一樣的形參列表的諸多個方法間構成重載。 形參 & 實參---方法的參數傳遞機制:值傳遞 //7.方法體:方法定義的是一種功能,具體的實現由方法體操做。
總結:由父及子,靜態先行編程
class Root{ static{ System.out.println("Root的靜態初始化塊"); } { System.out.println("Root的普通初始化塊"); } public Root(){ super(); System.out.println("Root的無參數的構造器"); } } class Mid extends Root{ static{ System.out.println("Mid的靜態初始化塊"); } { System.out.println("Mid的普通初始化塊"); } public Mid(){ super(); System.out.println("Mid的無參數的構造器"); } public Mid(String msg){ //經過this調用同一類中重載的構造器 this(); System.out.println("Mid的帶參數構造器,其參數值:" + msg); } } class Leaf extends Mid{ static{ System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf(){ //經過super調用父類中有一個字符串參數的構造器 super("尚硅谷"); System.out.println("Leaf的構造器"); } } public class LeafTest{ public static void main(String[] args){ new Leaf(); System.out.println(); new Leaf(); } }
package com.atguigu.java3; class Father { static { System.out.println("11111111111"); } { System.out.println("22222222222"); } public Father() { System.out.println("33333333333"); } } public class Son extends Father { static { System.out.println("44444444444"); } { System.out.println("55555555555"); } public Son() { System.out.println("66666666666"); } public static void main(String[] args) { // 由父及子 靜態先行 System.out.println("77777777777"); System.out.println("************************"); new Son(); System.out.println("************************"); new Son(); System.out.println("************************"); new Father(); } }
final:最終的 ,能夠用來修飾類、屬性、方法設計模式
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; } }
abstract:抽象的,用來修飾類、方法安全
//模板方法設計模式 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; } } }
//抽象類的應用:模板方法的設計模式 public class TemplateMethodTest { public static void main(String[] args) { BankTemplateMethod btm = new DrawMoney(); btm.process(); BankTemplateMethod btm2 = new ManageMoney(); btm2.process(); } } abstract class BankTemplateMethod { // 具體方法 public void takeNumber() { System.out.println("取號排隊"); } public abstract void transact(); // 辦理具體的業務 //鉤子方法 public void evaluate() { System.out.println("反饋評分"); } // 模板方法,把基本操做組合到一塊兒,子類通常不能重寫 public final void process() { this.takeNumber(); this.transact();// 像個鉤子,具體執行時,掛哪一個子類,就執行哪一個子類的實現代碼 this.evaluate(); } } class DrawMoney extends BankTemplateMethod { public void transact() { System.out.println("我要取款!!!"); } } class ManageMoney extends BankTemplateMethod { public void transact() { System.out.println("我要理財!我這裏有2000萬美圓!!"); } }
接口(interface) 是與類並行的一個概念ide
5,6描述的是java中的繼承的特色。工具
public class USBTest { public static void main(String[] args) { Computer com = new Computer(); //1.建立了接口的非匿名實現類的非匿名對象 Flash flash = new Flash(); com.transferData(flash); //2. 建立了接口的非匿名實現類的匿名對象 com.transferData(new Printer()); //3. 建立了接口的匿名實現類的非匿名對象 USB phone = new USB(){ @Override public void start() { System.out.println("手機開始工做"); } @Override public void stop() { System.out.println("手機結束工做"); } }; com.transferData(phone); //4. 建立了接口的匿名實現類的匿名對象 com.transferData(new USB(){ @Override public void start() { System.out.println("mp3開始工做"); } @Override public void stop() { System.out.println("mp3結束工做"); } }); } } class Computer{ public void transferData(USB usb){//USB usb = new Flash(); usb.start(); System.out.println("具體傳輸數據的細節"); usb.stop(); } } interface USB{ //常量:定義了長、寬、最大最小的傳輸速度等 void start(); void stop(); } class Flash implements USB{ @Override public void start() { System.out.println("U盤開啓工做"); } @Override public void stop() { System.out.println("U盤結束工做"); } } class Printer implements USB{ @Override public void start() { System.out.println("打印機開啓工做"); } @Override public void stop() { System.out.println("打印機結束工做"); } }
//接口的應用:工廠方法的設計模式 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("=====被代理類執行完畢======"); } }
interface A { int x = 0; } class B { int x = 1; } class C extends B implements A { public void pX() { //編譯不經過。由於x是不明確的 // System.out.println(x); System.out.println(super.x);//1 System.out.println(A.x);//0 } public static void main(String[] args) { new C().pX(); } }
Java中容許將一類A聲明在類B中,則類A就是內部類ui
局部內部類(方法內、代碼塊、構造器中)this
public class InnerClassTest { public static void main(String[] args) { //建立Dog實例(靜態的成員內部類): Person.Dog dog = new Person.Dog(); dog.show(); //建立Bird實例(非靜態的成員內部類): // Person.Bird bird = new Person.Bird();//錯誤的 Person p = new Person(); Person.Bird bird = p.new Bird(); bird.sing(); System.out.println(); bird.display("黃鸝"); } } class Person{ String name = "小明"; int age; public void eat(){ System.out.println("人:吃飯"); } //靜態成員內部類 static class Dog{ String name; int age; public void show(){ System.out.println("卡拉是條狗"); // eat(); } } //非靜態成員內部類 class Bird{ String name = "杜鵑"; public Bird(){ } public void sing(){ System.out.println("我是一隻小小鳥"); Person.this.eat();//調用外部類的非靜態屬性 eat(); System.out.println(age); } public void display(String name){ System.out.println(name);//方法的形參 System.out.println(this.name);//內部類的屬性 System.out.println(Person.this.name);//外部類的屬性 } } public void method(){ //局部內部類 class AA{ } } { //局部內部類 class BB{ } } public Person(){ //局部內部類 class CC{ } } }
package com.atguigu.java; public class InnerClassTest { /* * 在局部內部類聲明的方法中(好比:show)若是調用局部內部類所聲明的方法(好比:method)中的局部變量(好比:num)的話, * 要求此局部變量聲明爲final的。 * * jdk 7及以前版本:要求此局部變量顯式的聲明爲final的 * jdk 8及以後的版本:能夠省略final的聲明 * */ public void method(){ //局部變量 int num = 10; class AA{ public void show(){ // num = 20; System.out.println(num); } } } }