1.抽象类
在面向对象过程中,所有的对象都可以通过类来描述(创建)。反过来讲,并不是所有的类都能创建对象。如果一个类中没有足够完整的信息来描述具体的对象,那么这样的类就叫做抽象类。
在Java中,使用abstract关键字来修饰的类叫抽象类。
1.1代码示例1
//使用abstract修饰的方法叫做抽象方法
//使用abstract修饰的类叫做抽象类
abstract class 类名 {
//普通方法
public void eat() {
}
//抽象方法
//无大括号
public abstract void eat();
}
//抽象类不能实例化,那如何使用这个类呢?
//解决方法:再写一个普通类去继承抽象类,重写父类方法即可
1.2代码示例2
class Cell {
public void add () {
System.out.println("分裂");
}
}
//抽象类可以继承非抽象类
abstract class Animal extends Cell{
public abstract void run();
}
//抽象类可以继承抽象类
abstract class Monkey extends Animal{
//抽象类中可以有普通成员方法
public void call () {
System.out.println("咿咿呀呀.......");
}
//抽象类中的抽象方法
public abstract void eat();
public abstract void sleep();
}
//声明一个普通类去继承抽象类
class People extends Monkey {
//多重继承到的所有抽象方法都要重写
@Override
public void eat() {
System.out.println("干饭人,干饭魂!!!");
}
@Override
public void sleep() {
System.out.println("呼噜呼噜~~~");
}
@Override
public void call() {
System.out.println("莫西莫西~~~");
}
@Override
public void run() {
System.out.println("你是风儿,我是沙~~~");
}
}
public class Demo2 {
public static void main(String[] args) {
People people = new People();
people.add();
}
}
1.3抽象类总结
1.如果一个类用abstract来修饰,那么这个类叫做抽象类。
2.抽象类中可以有抽象方法和非抽象的方法(成员方法,构造方法)。
3.抽象方法是没有方法体的,是一个不完整的方法。
4.抽象类不能被实例化,即不能直接用来创建对象。
5.写一个普通类去继承抽象类可解决不能被实例化的问题。
6.在继承抽象类时,一定要重写抽象类中所有的抽象方法,让抽象方法变得有意义。
7.抽象类中的非抽象方法在子类中可重写可不重写。
8.一个抽象类A可以继承另一个抽象类B,此时继承A的普通类还需要重写B中的抽象方法。
9.抽象类可以继承一个非抽象类。
2.接口
2.1Java中的接口
接口的作用:拓展功能。
语法格式:
interface 接口名字 {
//成员变量
//成员属性
}
2.2代码示例1
interface USB {
//接口下的方法默认全都是抽象方法
//public可以省去
public void connection();
}
//接口的抽象方法无法实例化
//要使用一个普通的类来实现(implements)接口的功能,重写接口的方法
class Computer implements USB {
@Override
public void connection() {
System.out.println("连接鼠标");
}
}
public class Demo1 {
public static void main(String[] args) {
Computer computer = new Computer();
computer.connection();
}
}
2.3代码示例2
interface B2 {
public void work();
}
//一个接口可以继承另一个接口
interface B1 extends B2{
public void smoking();
}
//声明一个接口
interface A1 {
//接口下的属性默认用static和final修饰,要赋初始值
//属性名一般每个字母都要大写
String NAME = "狗蛋";
//接口下默认都是抽象方法
public void test();
//public可以省
void eat();
//jdk1.8之后,允许接口下写带有方法体的方法,但必须用default修饰
public default void sleep () {
System.out.println("睡觉睡得啥也不知道");
}
}
//写一个普通的类去实现(implements)当前的接口
//一个类可以实现多个接口
class TestA1 implements A1, B1{
//要在实现类中重写所有的抽象方法
@Override
public void test() {
System.out.println("测试");
}
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
@Override
public void smoking() {
System.out.println("吸烟有害健康!");
}
@Override
public void work() {
System.out.println("努力搞钱!!!");
}
}
public class Demo2 {
public static void main(String[] args) {
TestA1 testA1 = new TestA1();
testA1.eat();
testA1.test();
testA1.sleep();
}
}
2.4接口总结
1.使用关键字interface声明一个接口。
2.接口下面可以有属性,但这个属性必须赋值。这是因为接口的属性都是常量!!!默认用static和final修饰。
3.接口下面的方法默认全是抽象方法,abstract可写可不写。
4.从jdk1.8之后,接口下面可以写带有方法体的方法,只不过这种方法必须要用default修饰的(jdk1.8新特性),这种方法也可以被重写。
5.接口中没有构造方法,因此不能被实例化!!!
6.一般写一个普通的类去实现(implements)当前的接口,此类可以继承接口中的属性,但不能对其进行赋值!此类还可以使用接口中带有方法体的方法。
7.一定要在实现类中实现接口中所有的抽象方法
8.一个类可以实现多个接口,中间用逗号隔开,弥补了单继承的缺陷。
9.一个接口可以去继承另外一个接口,使用关键字extends。
10.一个抽象类可以实现(不能继承)一个接口。