標籤:java 介面 類
介面:
[修飾符] interface 介面名 [extends 父介面名1,父介面名2,...]{
[public] [static] [final] 類型 變數;
[public] [abstract] 方法;
}
修飾符,選擇性參數,用於指定介面的存取權限,可選值為public。如果省略則使用預設的存取權限。
介面名,必選參數,用於指定介面的名稱,介面名必須是合法的java標示符。一般首字母大寫。
extends父介面名列表,選擇性參數,用於指定要定義的介面繼承於哪個父介面。當使用extends關鍵字時,父介面名為必選參數。
方法,介面中的方法只有定義而沒有被實現。
eg:
public interface Calculate{
float pi = 3.14;
float getArea(float r);
}
等價於:
public interface Calculate{
public fianl float pi = 3.14;
public abstract float getArea(float r);
}
介面的實現:
[修飾符]class 類名 [extends 父類名] [implements 介面列表]{
}
修飾符,選擇性參數,用於指定類的存取權限,可選值為public、abstract、final。
類名,必選參數,用於指定類的名稱,類名必須是合法的java標示符。一般情況下,首字母大寫。
extends 父類名,選擇性參數,用於指定要定義的類繼承於哪個父類。當使用extends關鍵字時,父類名為必選參數。
implements 介面列表,選擇性參數,用於指定該類實現的是哪些介面。當使用implements關鍵字時,介面列表為必選參數。當介面列表中存在多個介面名時,各個介面名之間使用逗號分隔。
eg:
public interface Calculate{
float pi = 3.14;
float getArea(float r);
}
public class Circle implements Calculate{
public float getArea(float r){
return pi * r * r;
}
}
繼承的實現:
[修飾符] class 子類名 extends 父類名{
}
修飾符,選擇性參數,用於指定類的存取權限,可選值為public、abstract、final。
子類名,必選參數,用於指定子類的名稱,類名稱必須是合法的java標示符。一般情況下,首字母大寫。
extends 父類名,必選參數,用於指定要定義的子類繼承於哪個父類。
eg:
public class Bird{
protected String color;
protected String skin;
}
public class extends Bird{
public void fly(){
}
}
抽象類別:
abstract class 類名{
}
eg:
public abstract class Fruit{
protected String color;
public Fruit(){
color = "green";
}
}
抽象方法(不能使用private或static關鍵字修飾,因為要在子類中重寫,不能用類名直接調用方法)
abstact <方法返回值類型> 方法名(參數列表);
eg:
public abstract class Fruit{
protected String color;
public Fruit(){
color = "green";
}
public abstract void harvest();
}
成員內部類(內部類只能在外部類中使用,一般作為外部類的成員變數,內部類的執行個體化操作必須在外部類或外部類中的非靜態方法中;內部類可以訪問外部類成員)
public class OuterClass{
private class InnerClass{
}
}
eg:
public class OuterClass{
private int i = 0;
private void g(){
}
private InnerClass{
void f(){
g();
i++;
}
}
}
局部內部類(在類的方法中定義的類,他得作用範圍也是在這個方法體內)
eg:
public class SellOutClass{
private String name;
public SellOutClass(){
name = "apple";
}
public void sell(double price){
class Apple{
double price;
public Apple(double price){
this.price = price;
}
public void price(){
System.out.println("現在開始賣" + name);
System.out.println("單價為:" + price);
}
}
Apple a = new Apple(price);
a.price();
}
}
匿名內部類(匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫;但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面)
eg1:不使用匿名內部類來實現抽象方法
public abstract class Person {
public abstract void eat();
}
public class Child extends Person {
public void eat() {
System.out.println("eat something");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
運行結果:eat something
可以看到,我們用Child繼承了Person類,然後實現了Child的一個執行個體,將其向上轉型為Person類的引用.但是,如果Child類只使用一次,那麼將其編寫為獨立的一個類有些浪費。這個時候就引入了匿名內部類。
eg2:匿名內部類的基本實現
public abstract class Person {
public abstract void eat();
}
public class Test {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
運行結果:eat something
可以看到,我們直接將抽象類別Person中的方法在大括弧中實現了,這樣便可以省略一個類的書寫;並且,匿名內部類還能用於介面上。
eg3:在介面上使用匿名內部類
public interface Person {
public abstract void eat();
}
public class Test {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
運行結果:eat something
由上面的例子可以看出,只要一個類是抽象的或是一個介面,那麼其子類中的方法都可以使用匿名內部類來實現;當然一般類的子類也可以使用匿名內部類來實現。
最常用的情況就是在多線程的實現上,因為要實現多線程必須繼承Thread類或是繼承Runnable介面。
eg4:Thread類的匿名內部類實現
public class Test {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 3; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
運行結果:1 2 3
eg5:Runnable介面的匿名內部類實現
public class Test {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 3; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
運行結果:1 2 3
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java介面、類