1. 程式人生 > 實用技巧 >JavaSE學習筆記07面向物件程式設計03

JavaSE學習筆記07面向物件程式設計03

面向物件程式設計03

1.static關鍵字補充

package com.oop.demo07;

public class Student {

    private static int age;//靜態的變數
    private double score;//非靜態的變數

    public void run(){

    }
    public static void go(){

    }

    public static void main(String[] args) {

        Student s1 = new Student();

        System.out.println(Student.age);
        //System.out.println(Student.score);報錯
        System.out.println(s1.age);
        System.out.println(s1.score);

        s1.run();
        s1.go();
        Student.go();
        go();
        //run();報錯
        //Studnet.run();報錯
    }
}
package com.oop.demo07;
//靜態匯入包
import static java.lang.Math.random;

public class Test {
    public static void main(String[] args) {

        System.out.println(Math.random());
        //靜態匯入包後如下
        System.out.println(random());
    }
}

2.final關鍵字

  1. 表示最終的,不可變的

  2. final修飾的區域性變數,一旦賦值就不能重新賦值

  3. final修飾的方法無法被覆蓋,無法被重寫

  4. final修飾的類無法繼承

Public class Test{
	Public static void main(String[] args){
		//區域性變數
		int i = 100;
		i = 200;
		final int k = 100;
		k = 300;	//錯誤,無法為最終變數k分配值

		final int m;
		m = 200;
		m = 300;	//重新賦值:錯誤,可能已分配變數m
	}
}
//如果不希望B類繼承A類,可以給A類加final關鍵字
final class A{…}//A沒有子孫

class B extends A{…}//錯誤,無法從最終A進行繼承

class C{
	public final void doSome(){
		System.out.println(“C’s doSome…”);
	}
}
Class D extends C{
	Public void doSome(){
		System.out.println(“D’s doSome…”);
	}//錯誤,D中的doSome()無法覆蓋C中的doSome()
}

注意:一般例項變數若沒有手動賦值,系統會預設賦值,但如果加了final,系統就不負責付預設值,要求程式設計師必須手動賦值

public class Test{
	public static void main(String[] args){
	}
}
class User{
	//例項變數
	final int age;//錯誤
	final double height = 1.8;
	final double weight;
	//構造方法
	public User(){
		this.weight = 80;
	}
}

3.抽象類

  1. abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該方法就是抽象類。
  2. 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類
  3. 抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的
  4. 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的
  5. 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類
package com.oop.demo08;

public class Application {
    public static void main(String[] args) {

        //Action a = new Action();報錯
    }
}
package com.oop.demo08;

//abstract 抽象類  類 extends:單繼承(介面可以多繼承)
public abstract class Action {

    //abstract,抽象方法,只有名字,沒有方法的實現!
    public abstract void doSomething();
    /*
    1.不能new這個抽象類,只能靠子類去實現它:約束!
    2.抽象類中可以寫普通方法
    3.抽象方法必須要在抽象類中
     */
}
package com.oop.demo08;

//抽象類的所有方法,繼承了它的類,都必須要實現它的方法
public class A extends Action {
    @Override
    public void doSomething() {
        System.out.println("doSomething");
    }
}

4.介面

  1. 普通類:只有具體實現
  2. 抽象類:具體實現和規範(抽象方法)都有
  3. 介面:只有規範

介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑...

OO的精髓,是對物件的抽象,最能體現這一點的就是介面

宣告類的關鍵字是class,宣告介面的關鍵字是interface

注意:

  1. 介面中只有常量和抽象方法,沒有其他內容

  2. 介面中所有元素都是public修飾的(都是公開的)

  3. 介面不能被例項化,介面中沒有構造方法

package com.oop.demo09;

//類可以實現介面,implements 介面
//實現了介面的類,就需要重寫介面中的方法
//利用介面實現多繼承
public class UserServiceImpl implements UserService,TimeService{

    @Override
    public void add(String name) {}

    @Override
    public void delete(String name) {}

    @Override
    public void update(String name) {}

    @Override
    public void query(String name) {}

    @Override
    public void timer() {}
}
package com.oop.demo09;

//抽象的思維
//定義的關鍵字interface,介面都需要有實現類
public interface UserService {

    //public void run(){}報錯

    //介面中的所有定義其實都是抽象的 public abstract
    //可以省略public 前面的 public abstract
    //public abstract add();
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);

    //常量
    //public static final int AGE = 99;
    int AGE = 99;
}
package com.oop.demo09;

public interface TimeService {

    void timer();
}

例子

Public class Test{
	Public static void main(String[] args){
	//同一個介面,呼叫同一個fly()方法,最後的執行結果不同
	Flyable f = new Cat();
	f.fly();

	Flyable f2 = new Fish();
	f2.fly();
	}
}
class Animal{…}//動物類,父類

//介面,可飛翔的介面(是一對翅膀)
interface Flyable{
	Void fly();
}

//Flyable是一個介面,通過介面插到貓身上,讓貓可以飛翔
Class Cat extends Animal implements Flyable{//子類,貓類
	Public void fly(){
		System.out.println("貓咪起飛~");
	}
}
//子類,蛇類,不想讓她飛,可以不實現Flyable介面
Class Snake extends Animal{}

5.內部類(瞭解)

內部類就是在一個類的內部再定義一個類,比如,A類中定義了一個B類,那麼B類相對於A類來說就成為內部類,而A類相對於B類來說就是外部類了。

  1. 成員內部類
  2. 靜態內部類
  3. 區域性內部類
  4. 匿名內部類

注意:

  1. 使用內部類編寫的程式碼,可讀性差,能不用盡量不用

  2. 匿名內部類是區域性內部類的一種,因為沒有名字而得名匿名內部類

Class Test{
	//由於前面有static,所以稱為靜態內部類
	static class Inner1{}

	//沒有static叫做例項內部類
	Class Inner2{}

	Pulic void doSome(){
		//區域性變數
		int i = 100;
		//區域性內部類
		Class Inner3{}
	}
	Public void doOther(){
	//doSome()方法中的區域性內部類Inner3在doOther()中不能用
	}
	Public static void main(String[] args){
		MyTime mm = new MyMath();
		//匿名內部類,後面的{}代表了對介面的實現
		mm.mysum(new Compute(){
			public int sum(int a,int b){
				return a + b;
			}
		},100,200)
	}
}
//負責計算的介面
interface Compute{
	//抽象方法
	int sum(int a,int b);
}
Class MyMath{
	//求和方法
	Public void mysum(Compte c,int x,int y){
		int revalue = c.sum(x,y);
		System.out.println(x + “+” + y + “=” + retValue);
	}
}