JavaSE學習筆記07面向物件程式設計03
阿新 • • 發佈:2020-10-21
面向物件程式設計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關鍵字
-
表示最終的,不可變的
-
final修飾的區域性變數,一旦賦值就不能重新賦值
-
final修飾的方法無法被覆蓋,無法被重寫
-
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.抽象類
- abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該方法就是抽象類。
- 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類
- 抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的
- 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的
- 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類
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.介面
- 普通類:只有具體實現
- 抽象類:具體實現和規範(抽象方法)都有
- 介面:只有規範
介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑...
OO的精髓,是對物件的抽象,最能體現這一點的就是介面
宣告類的關鍵字是class,宣告介面的關鍵字是interface
注意:
-
介面中只有常量和抽象方法,沒有其他內容
-
介面中所有元素都是public修飾的(都是公開的)
-
介面不能被例項化,介面中沒有構造方法
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類來說就是外部類了。
- 成員內部類
- 靜態內部類
- 區域性內部類
- 匿名內部類
注意:
-
使用內部類編寫的程式碼,可讀性差,能不用盡量不用
-
匿名內部類是區域性內部類的一種,因為沒有名字而得名匿名內部類
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);
}
}