前言:
当我们在创建一个动物类的同时在这个类中创建动物对象,但是当你提到动物类,你并不知道我说的是什么动物,只有看到了具体的动物对象,你才知道这是什么动物,所以说动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物,同理我们也可以推理不同的动物,他们的行为习惯应该是不一样的,所以我们不应该在动物类中给出具体体现,而是给出一个声明即可。因此,这样的一个动物类才是抽象类,而狗,猫才是实体对象类。
抽象类
限制这个类不能被实例化,只能被继承
语法: public abstract class 类名(){}
抽象类包含哪些东西:
1.属性
2.普通方法
3.构造方法
4.抽象方法(可以有可无)
父类定义某个方法,但是这个方法实现不重要,但这个方法一定需要子类去重写,强制性的,子类不重写就会报错
抽象类不一定包含抽象方法,抽象方法一定要写在抽象类中
抽象方法就可以实现上面的问题,抽象方法等着子类去重写
语法: public abstract 返回值类型 方法名([参数列表]);
// Animal类 public abstract class Animal { String name;//属性 public void sleep() { //普通方法 System.out.println("我趴着睡"); } public Animal(){//构造方法 System.out.println("这是无参构造器。。。。"); } public abstract void eat(); //抽象方法 }
实现狗类继承动物类:
/**
* 狗类
*/
public class Dog extends Animal {
@Override
public void eat() {
super.sleep();
System.out.println("狗吃骨头~~~");
}
}
调用:
/**
* 调用
*/
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();//new一个对象出来
dog.eat();
}
}
结果:
这是无参构造器。。。。
我趴着睡
狗吃骨头~~~
注意:
如果父类定义抽象方法,
子类有两种解决方案:
1)子类变为抽象方法;
2)子类重写父类的全部抽象方法
细节:
1)抽象方法不能用private修饰
2)抽象方法不能使用static修饰
3)抽象方法不可以使用final修饰
接口
接口其实是一个更抽象的抽象类,只包含 常量
,抽象方法
关键字:
interface
定义语法:
public interface 接口名{ //常量 public static final double PI=3.1415926; //抽象方法 public abstract 返回值类型 方法名([参数列表]); //。。。 }
借口不能实例化,等待其他类去实现class A
implements
B,C,D{},接口相当于父类public interface UseInterface { //属性 报错 //String name; //常量 ,可以省略 public static final //只能写 public static final double PI = 3.14; //构造方法 报错 //public UseInterface(){}; /*//非抽象方法 ,不能包含 public void fun1(){ }*/ //抽象方法 ,可以省略 public abstract //只能写 public abstract void service(); /*//jdk1.8 特有 default void fun1(){ }*/ }
public class UDisk implements UseInterface,Save{//接两个接口 //实现接口的抽象方法 @Override public void service() { System.out.println("正在传输数据。。。"); } @Override public void save() { System.out.println("正在保存数据。。。"); } }
经验:
我们可以定义一个没有任何抽象方法的接口,作为一种标签,类实现接口表示该类贴了这个标签
注意:
类 extends 类
类 implements 接口1,接口2.。。。
接口 extends 接口1,接口2.。。。
类 extends 类 implements 接口1,接口2.。。。