抽象类
一.抽象类的产生原因
由于多态的出现,父类中的方法被子类重写覆盖,不可能被调用到。“用进废退”,由于父类方法不再被使用,所以去掉了方法体,退化为抽象方法。而抽象类就是用来存放没有方法体的抽象方法的。
二.抽象类和抽象方法的定义
抽象类定义:在修饰符后面返回值前面加上abstract。
抽象方法定义:在修饰符后面返回值前面加上abstract,并且删除方法体{}。
public abstract class Demo01 {//抽象类 public abstract void method();//抽象方法 }
讯享网
三.抽象方法具备特性
1.抽象方法没有方法体
2.含有抽象方法的类必须是抽象类
3.抽象类中可以暂时没有抽象方法
4.抽象类中的抽象方法跟子类有什么联系?
(1)如果子类完全实现了父类的抽象方法,那么子类可以不用声明为抽象类。
(2) 如果子类没有完全实现父类的抽象方法,那么子类必须声明为抽象类。
四.抽象类的语法规则
1.被abstract修饰的类是抽象类
2.抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以没有。
3.抽象方法没有方法体,只有方法声明。
4.子类继承抽象类需要重写父类所有的抽象方法,否则,子类也必须声明为抽象类
5.抽象类有构造方法,但是不能被显示调用,也就是不能实例化,或者说抽象类没有对象。
6.抽象类的构造方法只在子类实例化时隐式调用。
7.抽象类的使用一般是作为引用类型,指向非抽象的引用实例,体现出多态。
8.构造方法和静态方法都不能(abstract)抽象修饰
9. 静态方法不能被子类覆盖(重写),一旦声明为抽象方法 将永远没有具体的实现
接口
一.接口的介绍
接口就是提供一种统一的“协议”,而接口中的属性也属于“协议”中的成员,它们是公共的(public)、静态的(static)、最终的常量(final)。接口是比抽象类更加抽象的对外提供服务的功能模块,是没有构造方法不能实例化的。
二.接口的定义语法规则
1.定义一个接口:和定义类的区别在于,将class关键字换成了interface
2.接口中也有成员属性和方法 :
所有的成员属性都是 public static final (公共的静态常量)类型,
所有的方法都是:public abstract (公共的抽象方法)
3.abstract(抽象)只修饰类和方法,不修饰属性和变量。
4.Static(静态)只修饰属性和方法,不修饰局部变量,也就是定义在方法体中的变量。
5.由抽象到具体:接口 > 抽象类 > 类 > 对象
三.接口方法的实现
接口中的方法:抽象方法、静态方法、实例方法(jdk8中加的)
讯享网 public interface Demo01 {//接口 public static final int A=0;//属性 public abstract void method();//抽象方法 public static void method1(){}//静态方法 default void method2(){}//实例方法 }
接口与实体类关系:接口是附属于实体类的,实体类可以通过implements来实现接口中的方法,也可以通过定义接口类型的属性来实现接口中的方法。
//实现方法一 public class Demo02 implements Demo01 { @Override public void method() { System.out.println("实现接口中的抽象方法"); } }
讯享网//实现方法二 import org.junit.Test; public class Demo02 { private Demo01 demo01; public Demo01 getDemo01() { return demo01; } public void setDemo01(Demo01 demo01) { this.demo01 = demo01; } @Test public void Test(){ Demo02 d=new Demo02(); d.setDemo01(new Demo01() { @Override public void method() { System.out.println("接口中抽象方法的实现");//匿名内部类实现 } }); } }
案例:
防盗门案例(一个类多个接口实现)
1.抽象类门有两个抽象方法,关和开;接口锁也有两个抽象方,锁门(lockUp)和开锁(openLock);防盗门类TheftproofDoor,继承门,实现锁接口的抽象方法(共4个)。编写测试类,调用防盗门重写的四个抽象方法。
@Override
public void lockUp() {
System.out.println(“**钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。”);
}
@Override
publicvoid openLock() {
System.out.println(“**钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。”);
}
@Override
public void open() {
System.out.println(“用力推,门打开了。”);
}
@Override
public void close() {
System.out.println(“轻轻拉门,门关上了。”);}

Door.java代码:
package task03; public abstract class Door implements Lock { public abstract void open();//开门 public abstract void close();//关门 }
Lock.java代码:
讯享网package task03; public interface Lock { public abstract void lockUp();//锁门 public abstract void openLock();//开锁 }
TheftproofDoor.java代码:
package task03; import org.junit.Test; public class TheftproofDoor extends Door { @Override public void open() { System.out.println("用力推门,门打开了"); } @Override public void close() { System.out.println("轻轻拉门,门关上了"); } @Override public void lockUp() { System.out.println("使用钥匙开门,锁打开了"); } @Override public void openLock() { System.out.println("使用钥匙锁门,门锁上了"); } @Test public void Test(){ open(); close(); lockUp(); openLock(); } }
测试类Demo01.java代码:
讯享网package task03; public class Demo01 { public static void main(String[] args) { TheftproofDoor t=new TheftproofDoor(); t.open(); t.close(); t.lockUp(); t.openLock(); } }

打印机案例(一个接口多个类实现)
2定义纸张接口paper和墨盒inkbox接口,分别有A4纸和B5纸实现纸张接口,黑白墨盒和彩色墨盒实现墨盒接口。定义打印机类,成员属性是两个接口,和对应的set方法,以及打印方法print.创建测试类,实现:
1、使用黑白墨盒在A4纸上打印
2、使用彩色墨盒在B5纸上打印
/ * 使用墨盒在纸张上打印 */
public void print(){
System.out.println(“使用”+inkBox.getColor()+“墨盒在”+paper.getSize()+“纸张上打印。”);
}

接口Inkbox.java代码:
package task05.jieko; public interface Inkbox { public abstract String method2(); }
接口Peper.java代码:
讯享网package task05.jieko; public interface Paper { public abstract String method1(); }
实现类A4.java代码:
package task05.jiekosx; import task05.jieko.Paper; public class A4 implements Paper { @Override public String method1() { return "A4"; } }
实现类A5.java代码:
讯享网package task05.jiekosx; import task05.jieko.Paper; public class A5 implements Paper { @Override public String method1() { return "A5"; } }
实现类BlackWhite.java代码:
package task05.jiekosx; import task05.jieko.Inkbox; public class BlackWhite implements Inkbox { @Override public String method2() { return "黑白"; } }
实现类Colour.java代码:
讯享网package task05.jiekosx; import task05.jieko.Inkbox; public class Colour implements Inkbox { @Override public String method2() { return "彩色"; } }
实现类Printr.java代码:
package task05; import task05.jieko.Inkbox; import task05.jieko.Paper; import task05.jiekosx.A4; import task05.jiekosx.Colour; public class Printer { private Inkbox method2; private Paper method1; public Inkbox getMethod2() { return method2; } public void setMethod2(Inkbox method2) { this.method2 = method2; } public Paper getMethod1() { return method1; } public void setMethod1(Paper method1) { this.method1 = method1; } public void print(){ System.out.println("打印机开始工作"); System.out.println("使用"+method2.method2()+"墨盒在"+method1.method1()+"纸张上打印。"); } }
测试类Text01.java代码:
讯享网package task05; import task05.jiekosx.A4; import task05.jiekosx.A5; import task05.jiekosx.BlackWhite; import task05.jiekosx.Colour; public class Text01 { public static void main(String[] args) { A4 a4=new A4(); A5 a5=new A5(); BlackWhite b=new BlackWhite(); Colour c=new Colour(); Printer p1=new Printer(); p1.setMethod1(a4); p1.setMethod2(c); p1.print(); } }


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58210.html