一、抽象
抽象类的概念:
在编写一个类时候,往往会给它定义一些属性或方法,但是有的时候,某些方法只知道应该存在,但是不知道它如何实现,那么该类就是抽象类,这些不知道具体如何实现的方法就叫做抽象方法。
抽象类的抽象方法都是等待子类去继承然后子类去重写父类的抽象方法。
抽象的关键字: abstract
定义抽象类: public abstract class { }
定义抽象方法: public abtract 返回类型 方法名(参数列表);
注意点:
1.抽象类中可以没有抽象方法,可以有具体的方法。
2.抽象方法只能存在于抽象类中。
3.如果某子类继承了一个抽象类,那么该子类必需要重写父类的抽象方法。
练习1:
package com.yyzy.test;
//此时:这个类就是抽象类 : 抽象方法
public abstract class Demo2 {
//抽象方法
public abstract void method2() ;
}
package com.yyzy.test;
public class Demo3 extends Demo2{
public void method2() {
System.out.println("这是method2");
}
}
练习2:
创建一个Teacher抽象类,内部含有一个抽象方法work。
(原因:每个老师都上不同的课,所以该方法没有具有的代码,而是等子类去重写),然后创建一个MathTeacher类,EnglishTeacher子类,去继承该Teacher类。然后重写抽象方法。
package com.yyzy.test;
//这是一个父类
public abstract class Teacher {
//这个是抽象方法
public abstract void work();
public void a() {
System.out.println(111);
}
}
package com.yyzy.test;
public class MathTeacher extends Teacher{
public void work() {
System.out.println("我在上数学课");
}
}
package com.yyzy.test;
public class EnglishTeacher extends Teacher{
public void work() {
System.out.println("我在上英语课");
}
}
package com.yyzy.test;
public class Test1 {
public static void main(String[] args) {
EnglishTeacher et = new EnglishTeacher();
et.work();
MathTeacher mt = new MathTeacher();
mt.work();
}
二、接口
接口的概念:
如果存在某个抽象类中全是抽象方法,而没有具体的方法,那么就可以将该抽象类彻底改成接口。
接口:只有抽象方法的一个特殊的类。接口是等待实现类去实现(implements)。
接口的关键字: interface
语法如下:public interface 接口名{ 抽象方法... }
由于接口中只能存在抽象方法,那么在书写接口中的方法如下:
返回类型 方法名(参数列表); //可以省略public abstract 默认就是这两个。
练习1:
创建一个接口名为Usb的接口,内部有一个方法名叫work。
创建一个类名为Phone的类和Computer的类,去实现该Usb接口, 然后重写该接口内的方法。
package com.yyzy.test;
public interface Usb {
void work();
}
package com.yyzy.test;
public class Phone implements Usb{
@Override
public void work() {
System.out.println("我在使用手机USB");
}
}
package com.yyzy.test;
public class Computer implements Usb{
@Override
public void work() {
System.out.println("我这用电脑的USB");
}
}
三、接口和抽象类的区别
1.关键字:接口是interface 抽象类是:abstract
2.接口是等待实现类去实现。 抽象类是等待子类去继承
3.接口不是一个类。 抽象类是一个类。
4.抽象类里面可以存在普通方法。 接口里面不能存在普通方法。
抽象类:需要子类去继承 然后重写
接口: 需要一个实现类去实现(implements)该接口。然后重写接口的相关方法。
注意不是继承关系了 但是可以理解成继承关系。
继承:extends 实现:implements
此时这个Z2就是一个接口,而非一个类或抽象类
接口里面只能存在抽象方法,所以直接将public abstract省略
package com.yyzy.test;
public interface Z2 {
public abstract 返回类型 方法名(参数列表);
void a1();//一般来说为了简化代码,都是直接这样写即可
public abstract void a2();
abstract void a3();
public void a4();
//以上4个方法 其实都是
专业术语: Z3 不是Z2的子类,因为两者之间没有extends关键字。
Z3叫做Z2的实现类。 Z2是Z3的接口
package com.yyzy.test;
public class Z3 implements Z2 {
@Override
public void a1() {
// TODO Auto-generated method stub
}
@Override
public void a2() {
// TODO Auto-generated method stub
}
@Override
public void a3() {
// TODO Auto-generated method stub
}
@Override
public void a4() {
// TODO Auto-generated method stub
}
}