一、抽象类
(1)定义:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。被abstract关键字修饰,其中可能包含抽象方法
抽象类的特点:抽象类除了不能创建对象之外,类的其他功能都正常(成员变量,构造方法,成员方法)
抽象类一般位于类结构的上层,用来定义有哪些功能,让具体的子类继承实现即可
抽象类只能用作基类,继承抽象类的非抽象类必须实现它所有的抽象方法,且实现方法的参数、返回值需与抽象方法相同
(2)抽象方法:是一种特殊的方法:它只有声明,而没有具体的实现,用abstract关键字修饰
注意:静态方法不能内修饰为抽象方法. 一个类中可以定义多个抽象方法
//抽象类 public abstract class Animal { private String name; private int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } /* 抽象方法,定义方法,没有具体的实现. */ public abstract void eat(); } public class Dog extends Animal{ //在dog类中实现了eat方法 @Override public void eat() { System.out.println("狗吃骨头"); } }
二、面向语言特征----多态
(1)定义:同一种事物,在不同时刻表现不同状态。二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即形成多态。
(2)注意事项:注意成员调用时,分为编译期间和运行期间,编译期间: 写代码时由于类型上升为了父类类型,所以只能调用到父类中定义的成员,而在运行期间: 运行代码时,实际调用的是子类中重写的方法
对于子类如果没有重写父类中的方法,那么调用的是子类对象中父类的方法
(3)对成员方法的调用:对于非静态成员变量:编译看左边, 运行看右边(=的两端)
class Animal{ void show() { System.out.println(“Anmial"); } } class Cat extends Animal{ void show() { System.out.println(“cat"); } } Animal x = new Cat() x.show() //调用的是子类中的方法
对于静态成员变量:编译看左边,运行也看左边
class Animal{ static void show() { System.out.println(“Animal"); } } class Cat extends Animal { static void show() { System.out.println(“Cat"); } } Animal x = new Cat() x.show() //调用的是动物类中的静态成员方法
(4)向下转型:为了实现多态性,我们将子类类型向上转为了父类类型,但是一旦类型上升为父类类型,那么就调用不到子类中特有的方法。这就是多态在某种情况下的缺点. 解决办法:向下转型,把父类类型转为子类类型。作用是为了使用子类中特有的方法
class Animal{ void eat(){ } } class Cat extendsAnimal{ void look() { System.out.println("看家"); } } Animal x=new Cat() x.look();//编译报错,Animal类型中没有look方法 Cat m=(Cat)x; //需要向下转型,转为Cat类型 m.eat() ; m.look();//子父类中的方法都可以使用
三、final关键字
final关键字作用:可以修饰类,方法,参数,成员变量
(1)final修饰类不能为抽象类和接口,因为final修饰的类不能被继承
(2)final修饰方法,修饰后方法不能被子类重写
(3) final修饰方法的参数,在方法内部不能修改参数值
(4)final修饰成员变量,两种情况:
//情况1: 在编码时,值就确定了,就直接进行赋值,后期都不能修改,此种情况最好加上static关键字,让其在内存中只有一份. static final int num = 10; //情况2: 每一个对象中都有一个常量,必须在构造方法中为常量进行初始化,一旦初始化后,值都不能更改 final int count;
四、接口
(1)定义:是一种更为彻底的抽象,主要用来定义功能,它不关心具体的实现,只关心有何能力,使用interface关键字声明接口
(2)内容:jdk8之后接口可以定义4种内容: 1.静态常量 2.抽象方法 3.静态方法(jdk8之后才开始有的) 4.默认方法(jdk8之后才开始有的)
(3)接口的实现:类实现接口,一个类可以实现多个接口,类使用implements关键字实现接口,例如
public class MyInterfaceImpl implements MyInterface { public static void main(String[] args) { } } //格式:[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{}
(4)特性
当类实现接口的时候,类要实现接口中所有的抽象方法,否则,该类必须 声明为抽象的类
接口与实现类之间存在多态性