书接上回,面向对象的三大特征。
一.多态
1.父亲引用指向子类对象,从而产生多种形态。
Animal dog=new Dog();
Animal cat=new Cat();
2.同一种事物,在不同时刻表现出不同状态。
这里有两种时间段:
①编译期:写代码时 类型是Animal(父类类型)
②运行期:运行代码时 类型是具体的子类类型。
Animal dog=new Dog();
3.对于普通方法:编译看左边,运行看右边。
上述这个例子中,dog对象只能去调出来Animal类(父类)中的方法,但是dog是无法调出来Dog类中特有的方法。如果调用的方法在子类中重写过,那么调用的方法就会执行子类中被重写的方法。
对于静态方法和成员变量的编译和运行都是看左边。
多态的缺点:对象上升到父类,就不能调用子类中特有的方法了。
想要解决此问题必须用到向下转型,将父类类型转为子类类型。
Dog d=(Dog)dog;
d.lookhome();
这样就可以再通过 d对象去调用到Dog中的特有的方法lookhome()了。
4.instanceof关键字
用法格式:
父类类型 instanceof 具体子类类型 --true 否则 false
if( Animal instanceof Dog)
二.final关键字
final可修饰类,方法,参数,成员变量(常量)。
类:final修饰类,不能被继承,所以不能修饰抽象类。eg:Java中的String类就是由final修饰的。
方法:final修饰的方法不能重写。
参数:方法中带有final修饰的参数,方法中是不能改变参数的大小的。
成员变量:必须给他赋初值,在类定义时直接赋初值或者在构造方法中赋初值。(并且后期都不能修改)
赋值后值不能改变,所以建议使用static修饰。
public class Final {
public static final int max=10; //这里就是直接赋初值
public final int min;
final int a=10;
public Final(){
this.min=1; //这里实在构造方法中赋初值
}
public final void eat(){ //被final修饰的方法不能被重写
System.out.println(" ");
}
public void sleep(final int a){ //方法参数中有final修饰的,在方法中不能改变参数的值
//a=20;
}
}
//被final修饰的类不能继承
public class Finalextend extends Final{
public Finalextend() {
super();
}
}
三.接口
1.认识接口
接口是计算机领域的名词。
2.面向接口编程
接口可以看作是一种特殊的抽象类,里面也可以包含抽象方法。
3.接口的格式
public interface Myinterface{
int num=10; //所有属性默认为public static final
public void foo(); //所有方法默认为public abstruct
public static void test(){ //jdk8之后加入静态方法,可以通过接口名直接调用
}
public default void test1(){ //jdk8之后加入默认方法,需要通过子类调用,子类可以选择是否去重
//写这个方法。
}
}
4.接口的定义
使用 interface 关键字来声明一个接口。具体格式如下:
5.接口的实现
接口的实现需要用到 implements 关键字,implements关键字声明放到class 的后面。
class 类名 implements 接口名
结合继承:
[权限修饰符] class 子类名 extends 父类名 implements 接口名
6.接口的特点
①接口是隐式抽象的,主要用来定义功能。
②接口中可以定义静态方法,常量,默认方法,抽象方法。
③一个类可以实现多个接口,只需要接口间用‘ ,’隔开即可。
④一个接口还可以同时继承多个接口。
public interface InterfaceD extends InterfaceB,InterfaceC{
//多继承
}
⑤接口不能实例化对象。
⑥当类要实现接口时必须实现接口中所有的抽象方法,否则,必须将该类声明为抽象类。
⑦接口与实现类之间存在多态性。
MyInterface myinterface = new Myclass();
接口 对象名 MyInterface的实现类