小豬學(xué)習(xí)

小小白慢慢學(xué)習(xí)中ing 第十七天
努力努力
本日內(nèi)容(接口、類和類的關(guān)系)
1、接口
2.1.1 什么是接口?
接口就是一種能力和約定。一種協(xié)議,一種規(guī)則。
2.1.2 接口的內(nèi)容
A:接口中,包含靜態(tài)常量,默認的(缺省)修飾符:public static final
B:接口中,包含抽象方法,默認的(缺省)修飾符:public abstract
2.1.3 接口的語法
//1.定義一個接口
interface 接口名{
???????//靜態(tài)常量
???????//抽象方法
}
//2.需要實現(xiàn)類來實現(xiàn)接口:類比子類繼承抽象類。
class 實現(xiàn)類 implements 接口名{
???????//重寫接口中的抽象方法
}
//3.創(chuàng)建實現(xiàn)類的對象
2.1.4 接口引用
同父類一樣,接口也可以聲明為引用,指向?qū)崿F(xiàn)類的對象。其實就是一種接口的多態(tài)。
接口類型的引用 = new 實現(xiàn)類的對象
那么只能調(diào)用接口中所聲明的方法。不能調(diào)用實現(xiàn)類中新增的方法??梢詮娭妻D(zhuǎn)回實現(xiàn)類的類型,就可以調(diào)用新增的方法。

2.1.5 接口的注意點
1、接口可以多實現(xiàn):一個實現(xiàn)類可以同時實現(xiàn)多個接口

package com.qf.demo02_interface;
//定義一種規(guī)則:
interface A{
????????public void testA();//
????????public void fun();
}
//定義另一種規(guī)則
interface B{
????????public void testB();
????????public void fun();
}
//實現(xiàn)類,實現(xiàn)接口A。滿足接口的規(guī)則:其實就是要實現(xiàn)接口中所有的抽象方法。
class DemoA implements A,B{
????????@Override
????????public void testA() {
????????????????System.out.println("DemoA類,滿足接口A的規(guī)則。。。");
????????}
????????@Override
????????public void testB() {
????????????????System.out.println("DemoA類,也滿足接口B的規(guī)則。。。");
????????}
????????@Override
????????public void fun() {
????????????????System.out.println("DemoA類,實現(xiàn)類fun方法。。。");
????????}
}
public class Test1Interface {
????????public static void main(String[] args) {
????????????????A a = new DemoA();
????????????????a.testA();
????????????????a.fun();
????????????????B b = new DemoA();
????????????????b.testB();
????????????????b.fun();
????????????????DemoA demoA = new DemoA();
????????????????demoA.testA();
????????????????demoA.testB();
????????}
}
?
2、接口可以多繼承
類中的方法:有聲明有實現(xiàn)的方法。
接口中方法:有聲明,沒有實現(xiàn)。將功能的描述,和功能的實現(xiàn),分離開。

package com.qf.demo03_interface;
//一種規(guī)則
interface C{
????????public void testC();
}
//另一種規(guī)則
interface D{
????????public void testD();
}
//接口可以繼承多個父接口
interface E extends C,D{
????????public void testE();
}
//實現(xiàn)類,實現(xiàn)接口E
class DemoB implements E{
????????@Override
????????public void testC() {
????????????????System.out.println("C協(xié)議。。");
????????}
????????@Override
????????public void testD() {
????????????????System.out.println("D協(xié)議。。");
????????}
????????@Override
????????public void testE() {
????????????????System.out.println("E協(xié)議。。。");
????????}
}
public class Test3Interface {
????????public static void main(String[] args) {
????????????????C c = new DemoB();
????????????????c.testC();
????????????????D d = new DemoB();
????????????????d.testD();
????????????????E e = new DemoB();
????????????????e.testC();
????????????????e.testD();
????????????????e.testE();
????????}
}
?
3、一個類如果實現(xiàn)接口了,還能繼承其他的父類嗎?可以的

意味著,一個類繼承了一個父類:那么就可以直接使用父類的非私有化的屬性和方法。
同時,還實現(xiàn)接口某個接口規(guī)則。
這個類即作為一個父類的子類,又作為了一個接口的實現(xiàn)類。
package com.qf.demo04_interface;
//表示一種協(xié)議,一種規(guī)則
interface H{
????????public void testH();
????????public void fun();
}
//繼承?is - a,子類是一個特殊的父類
class M{
????????public void testM(){
????????????????System.out.println("我是M類的方法。。");
????????}
????????public void fun(){
????????????????System.out.println("M類中的fun方法。。。");
????????}
}
//定義一個類:N
//繼承了父類M:意味著N這個類可以直接使用父類的非私有化的屬性和方法。
//同時實現(xiàn)接口H:意味著滿足接口H中的所有規(guī)則:抽象方法。。
class N extends M implements H{
????????@Override
????????public void testH() {
????????????????System.out.println("滿足了接口H的協(xié)議規(guī)則。。");
????????}
????????//父類的fun方法,一旦存在繼承關(guān)系,相當(dāng)于子類也有一份。
????????// public void fun(){
????????// System.out.println("M類中的fun方法。。。");
????????// }
}
public class Test4 {
????????public static void main(String[] args) {
????????????????M m = new N();//父類引用,指向子類的對象:一種對象的多態(tài)
????????????????m.testM();
????????????????m.fun();
????????????????System.out.println("-----------------");
????????????????H h = new N();//接口引用,指向?qū)崿F(xiàn)類對象:一種接口的多態(tài)
????????????????h.testH();
????????????????h.fun();
????????}
}
4、如果一個類沒有實現(xiàn)接口中的所有的方法,那么它是抽象的
一個實現(xiàn)類可以實現(xiàn)接口,但是如果沒有實現(xiàn)全部的方法, 那么該類是抽象的。等待子類繼承,并且實現(xiàn)抽象方法。
package com.qf.demo05_interface;
interface K{
????????public void test1();
????????public void test2();
}?
abstract class KImpl implements K{
????????@Override
????????public void test1() {
????????}
}
class L extends KImpl{
????????@Override
????????public void test2() {
????????}
}
public class Test5 {
????????public static void main(String[] args) {
????????}
}
?
5、接口中的兩個特殊的方法
1、靜態(tài)方法:
2、默認的方法:jdk1.8版本出現(xiàn)的新特性。
目的:不強制一定要實現(xiàn)某個功能。
2.1.6 關(guān)于接口和抽象類
Java中類都是單繼承的。如果父類的方法種類無法滿足子類的需求,可以通過實現(xiàn)接口來擴充子類的功能。而且接口支持多繼承,多實現(xiàn)的。更靈活一些。
概念:
抽象類:講究的是繼承。
接口:講究的是規(guī)范,規(guī)則。

2.1.7接口的好處
A:降低了程序的耦合性。代碼的關(guān)聯(lián)程度。
????????接口中只做功能的聲明,沒有具體的實現(xiàn)。
????????面向接口編程:關(guān)心功能有哪些
B:定義的都是規(guī)則,對外暴露的功能是一致。
C:接口可以多繼承,以及多實現(xiàn),使用更靈活。
2.1.8 接口回調(diào)
首有個接口A,和它 實現(xiàn)類。然后在另一個類B中,持有A的引用,那么在B類中可以調(diào)用接口A的方法。這就是一種回調(diào)。

2、類和類的關(guān)系
Java中的數(shù)據(jù)了類型:兩大類(基本類型和引用類型)
基本類型:又叫簡單類型。直接賦值數(shù)值即可。4類8種
byte,short,int,long,float,double,char,boolean
引用類型:存儲的地址。操作引用。默認值都是null
String,數(shù)組,Person類,Student,Cat,接口類型。。。
Exception in thread "main" java.lang.NullPointerException
空指針異常:對象是null,沒有,非要訪問它的屬性或方法。
Book book = null;
null.屬性:賦值取值
null.方法(),表示調(diào)用
1、繼承關(guān)系
繼承是指一個類繼承另一個類。一個作為子類,另一個是父類。子類可以使用父類的內(nèi)容,還可以擴展自己的內(nèi)容。(類,接口)
public class Animal{}
public class Cat extends Animal{}
2、實現(xiàn)關(guān)系
實現(xiàn)是指一個類,實現(xiàn)接口中所有的抽象方法。一個類可以同時實現(xiàn)多個接口。
public interface A{}
public class AImple implements A{}
3、依賴關(guān)系
一個類依賴另一個類。兩個類之間的耦合度不大。代碼層面體現(xiàn):一個類作為另一個類的方法的參數(shù)。
public class Pet{}
public class Girl{
???????public void play(Pet pet){
????? }
}
4、關(guān)聯(lián)關(guān)系
兩個類之間的依賴關(guān)系比較強。代碼層面體現(xiàn):一個類作為另一個類的屬性。
public class Book{}
public class Person{
????????Book book;
}
特殊的關(guān)聯(lián)關(guān)系:聚合,組合。。。