接口的多實(shí)現(xiàn):Java中是單繼承 多實(shí)現(xiàn)蚀狰,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 ;一個(gè)類能繼承一個(gè)父類同時(shí)實(shí)現(xiàn)多個(gè)接口职员。
多實(shí)現(xiàn)的格式:
class 類名 [extends 父類名] implements 接口1麻蹋,接口2.。焊切。扮授。{
}
多實(shí)現(xiàn):
1.必須重寫接口中所有的抽象方法
2.重寫接口中的默認(rèn)方法
多實(shí)現(xiàn)注意:
1.如果抽象方法有重名的,只需重寫一次就可以
public interface Liveable {
//多實(shí)現(xiàn)抽象方法重名
public void show("Show()重寫");
}
public interface Pet {
// 多實(shí)現(xiàn)抽象方法重名
public void show();
}
}
public class Dog extends Animal implements Liveable,Pet {
@Override
public void show() {
System.out.println("show()重寫");
}
}
public class InterfaceTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.show();
}
}
2.如果默認(rèn)方法有重名的专肪,必須重寫一次
public interface Liveable {
//多實(shí)現(xiàn)默認(rèn)方法重名
public default void method() {
System.out.println("Liveable!");
}
}
public interface Pet {
//多實(shí)現(xiàn)默認(rèn)方法重名
public default void method() {
System.out.println("Pet");
}
}
public class Dog extends Animal implements Liveable,Pet {
@Override
public void method() {
System.out.println("Dog");
}
}
public class InterfaceTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.method();
}
}
3.存在同名的靜態(tài)方法不會(huì)沖突刹勃,因?yàn)橹荒芡ㄟ^(guò)接口名去訪問(wèn)靜態(tài)方法
4.當(dāng)一個(gè)類既繼承了一個(gè)父類,又實(shí)現(xiàn)了多個(gè)接口嚎尤,父類中的成員方法與接口中默認(rèn)方法重名荔仁,子類就近執(zhí)行父類的成員方法
public interface A {
public default void method(){
System.out.println("AAAAAAAAAAAAA");
}
}
public class D {
public void method() {
System.out.println("DDDDDDDDD");
}
}
public class C extends D implements A {
//未重寫method方法,執(zhí)行輸出為"DDDDDDDDDD"
//重寫method方法,執(zhí)行C類的method方法
public void method(){
System.out.println("CCCCCCCCCC");
}
}
public class InterfaceTest1 {
public static void main(String[] args) {
C c = new C();
c.method();
}
}
接口的多繼承
- 一個(gè)接口可以繼承多個(gè)接口
- 如果父接口中默認(rèn)方有重名的乏梁,那么子接口需要重寫一次
public interface F {
public default void method(){
System.out.println("FFFFFFFFFF");
}
}
public interface G {
public default void method(){
System.out.println("GGGGGGGGGGG");
}
}
public interface H extends F,G{
@Override
default void method() { //子接口繼承父接口 接口默認(rèn)方法是寫default
}
}
//public class K implements F,G {
// @Override
// public void method() { //類接口默認(rèn)方法是不能寫default
// }
//}
其他成員特點(diǎn):
1.接口中次洼,無(wú)法定義成員變量,但是可以定義常量掌呜,其值不可以改變滓玖,默認(rèn)使用public static final修飾
2.沒(méi)有構(gòu)造方法,所以不能創(chuàng)建對(duì)象质蕉,也就是不能被new
3.沒(méi)有靜態(tài)代碼塊
多態(tài)
1.同一種行為具有不同的表現(xiàn)形式
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("Dog 在造狗糧");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat 在喵喵的吃貓糧");
}
}
public class DynamicTest {
public static void main(String[] args) {
// 多態(tài)形式
Dog dog = new Dog();
// 格式:父類類型 對(duì)象名 = new 子類對(duì)象
Animal dog = new Dog();
dog.eat();
Animal cat = new Cat();
cat.eat();
}
}
多態(tài)的好處(接上面):
public class DynamicTest {
public static void main(String[] args) {
//多態(tài)的好處
Dog dog = new Dog();
Cat cat = new Cat();
//調(diào)用showCatEat
showCatEat(cat);
showDogEat(dog);
等于||
showAnimalEat(dog);
showAnimalEat(cat);
}
public static void showCatEat(Dog dog){
dog.eat();
}
public static void showDogEat(Cat cat){
cat.eat();
}
等于||
public static void showAnimalEat(Animal animal){
animal.eat();
}
}
2.前提:
- 繼承或者實(shí)現(xiàn)
- 方法的重寫
- 父類引用指向子類對(duì)象
3.體現(xiàn):格式:父類類型 對(duì)象名 = new 子類對(duì)象
子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象
多態(tài)的轉(zhuǎn)型:
1.向上轉(zhuǎn)型:默認(rèn)的;多態(tài)本身是子類類型向父類類型轉(zhuǎn)化的過(guò)程 格式:父類類型 對(duì)象名 = new 子類對(duì)象 (轉(zhuǎn)成更大的類型)
2.向下轉(zhuǎn)型: 父類轉(zhuǎn)成子類的類型(強(qiáng)制轉(zhuǎn)化) 格式:子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象
注:
1.instanceof 判斷對(duì)象是或否屬于某種類型 是true 否 false
2.轉(zhuǎn)型異常時(shí)會(huì)發(fā)生 ClassCastException
轉(zhuǎn)型案例:
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat 在喵喵的吃貓糧");
}
}
public class JiaFei extends Cat{
@Override
public void eat() {
System.out.println("JiaFei 大口的吃貓糧");
}
}
public class DynamicTest2 {
public static void main(String[] args) {
//向上轉(zhuǎn)型
Animal cat = new Cat();
// cat.eat();
//向下轉(zhuǎn)型
// 格式:子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象
// Cat cat1 = new Cat();
// cat1.eat();
// 注:轉(zhuǎn)型的異常 ClassCastException
Dog dog = (Dog) cat;
dog.eat(); //Dog 和 cat 屬于Animal下的兩個(gè)分支翩肌,不能強(qiáng)制轉(zhuǎn)換
//instance of 判斷對(duì)象屬于某種類型
// if (cat instanceof Animal){
// Cat c = (Cat) cat;
// c.eat();
// }else {
// System.out.println("不是父類類型不能強(qiáng)制轉(zhuǎn)換");
// }
Cat jiaFei = new JiaFei();
if (jiaFei instanceof Cat){
JiaFei fei = (JiaFei) jiaFei;
fei.eat();
}else {
System.out.println("不是父類類型不能強(qiáng)制轉(zhuǎn)換");
}
}
}
練習(xí)1:
public interface USB {
void open(); //開啟功能
void close();//關(guān)閉功能
}
public class Mouse implements USB {
@Override
public void open() {
System.out.println("鼠標(biāo)開啟模暗,小燈閃閃閃");
}
@Override
public void close() {
System.out.println("鼠標(biāo)關(guān)閉,小燈熄滅");
}
public void click(){
System.out.println("鼠標(biāo)點(diǎn)擊");
}
}
public class KeyBoard implements USB {
@Override
public void open() {
System.out.println("鍵盤開啟念祭,小彩燈閃閃閃");
}
@Override
public void close() {
System.out.println("鍵盤關(guān)閉兑宇,小燈熄滅");
}
public void input(){
System.out.println("鍵盤在瘋狂的輸入");
}
}
public class Laptop {
public void run(){
System.out.println("筆記本運(yùn)行中");
}
public void useUSB(USB usb){
//判斷是否有usb設(shè)備
if (usb != null){
usb.open();
if (usb instanceof Mouse){
Mouse mouse = (Mouse) usb;
mouse.click();
}else if (usb instanceof KeyBoard){
KeyBoard keyboard = (KeyBoard) usb;
keyboard.input();
}
usb.close();
}
}
public void shutDown(){
System.out.println("筆記本關(guān)閉");
}
}
public class LaptopTest {
public static void main(String[] args) {
Laptop laptop = new Laptop();
//開啟
laptop.run();
// 使用鼠標(biāo)
USB mouse = new Mouse();
laptop.useUSB(mouse);
//使用鍵盤
USB keyBoard = new KeyBoard();
laptop.useUSB(keyBoard);
//筆記本關(guān)閉
laptop.shutDown();
}
}
練習(xí)2:
public interface Universe {
void doAnything();
}
public class Star {
public void shine(){
System.out.println("star:星星一閃一閃亮晶晶");
}
}
public class Sun extends Star implements Universe {
@Override
public void doAnything() {
System.out.println("sun:太陽(yáng)吸引著9大行星旋轉(zhuǎn)");
}
@Override
public void shine() {
System.out.println("sun:光照八分鐘,到達(dá)地球");
}
}
public class Test {
public static void main(String[] args) {
Star star = new Star();
star.shine();
System.out.println("==================");
Universe sun = new Sun();
sun.doAnything();
Sun sun1 = (Sun)sun;
sun1.shine();
}
}
練習(xí)3:
public interface A {
public abstract void showA();
private static void show10(String str){
for (int i = 0; i < 10; i++) {
System.out.print(str + " \t");
}
}
public static void showB10(){
System.out.println("static BBBB");
show10("BBBB");
System.out.println();
}
public static void showC10(){
System.out.println("static CCCC");
show10("CCCC");
}
}
public class B implements A {
@Override
public void showA() {
System.out.println();
System.out.println("AAA");
}
public static void showD(){
System.out.println("DDDD");
}
}
public class Test {
public static void main(String[] args) {
A.showB10();
A.showC10();
B b = new B();
b.showA();
B.showD();
}
}
final :
1.開放擴(kuò)展粱坤,關(guān)閉修改
2.用于修飾不可改變的內(nèi)容 格式:final class 類名()
3.修飾對(duì)象 :
1)類:被修飾的類不能被繼承 final class 類名() 目的是僅限使用隶糕,不允許修改
2)方法:被修飾的方法不能被重寫 修飾符 final 返回值類型 方法名(參數(shù)列表){}
3)變量:被修飾的變量不能被重新賦值
final 修飾變量 :
1.局部變量:
-基本類型 :
public class FinalDemo1 {
public static void main(String[] args) {
//聲明一個(gè)變量,使用final修飾
final int al;
al = 40;
System.out.println(al);
// al = 20; 報(bào)錯(cuò) 不可重新賦值
final int b = 100;
// b = 111; 報(bào)錯(cuò) 不可重新賦值
// final int c = 0;
// for (int i = 0; i < 10; i++) {
// c = i;
// System.out.println(c);
// }
//可以通過(guò)編譯站玄,可以運(yùn)行枚驻,c是局部變量每次循環(huán)都是創(chuàng)建了一個(gè)新的變量c
for (int i = 0; i < 10; i++) {
final int c = i;
System.out.println(c);
}
}
}
-引用類型:
public class User {
private String name = "張三";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class FinalDemo2 {
public static void main(String[] args) {
//引用類型的局部變量,被final修飾株旷,只能指向一個(gè)對(duì)象再登,地址值是不能改變的
//但是,不影響對(duì)象內(nèi)部成員變量值的修改
final User user1 = new User(); //user1地址值不能改變
System.out.println(user1.getName());
//// user1 = new User();
user1.setName("李四");
System.out.println(user1.getName());
// User user = new User();
// User user1 = new User();
// System.out.println(user == user1); //false 被final修飾晾剖,只能指向一個(gè)對(duì)象锉矢,地址值是不能改變的
}
}
2.成員變量:
1)顯示初始化
public class UserF {
//顯示初始化
final String USERNAME = "張三"; //常量所有字母大寫
private int age;
}
2)構(gòu)造方法初始化
public class UserF2 {
final String USERNAME;
private int age;
public UserF2(String username,int age) {
this.USERNAME = username;
this.age = age;
}
}
權(quán)限修飾符:
- public
- protected
- default
-
private
權(quán)限修飾符修飾權(quán)限
權(quán)限使用建議:
1.成員變量使用 private 隱藏細(xì)節(jié)
2.構(gòu)造方法使用 public 方便創(chuàng)建對(duì)象
3.成員方法使用 public 方便調(diào)用方法
注:權(quán)限使用建議符合JavaBean