一,多态
●
多态
父类引用指向子类对象,从而产生多种形态
Animal dog = new Dog();
Animal cat = new Cat();
同一种事物,在不同时刻表现不同状态
二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即
形成多态。
l
当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象
class Animal{
……
}
class Cat extends Animal{
……
}
class Dog extends Animal {
……
}
Animal c = new Cat() //Animal 的引用指向Cat的对象
Animal d = new Dog() //Animal 的引用指向Dog的对象
●
向上转型
class Animal{
void eat(){ }
}
class Cat extends Animal{
void eat() {
System.out.println("狗吃骨头");
}
}
………
Animal x=new Cat() //向上造型,Cat对象提升到Animal对象
x.eat() //在编译奇迹只能调用父类中定义的方法, 如果子类重写了父类方法,那么运行时
调用子类重写的方法
l
多态性的好处:提高代码的扩展性
class Animal{
void eat() { }
}
class Cat extends Animal{
void eat() { }
}
class Dog extends Animal{
void eat(){ }
}
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}
l
多态性的好处:提高代码的扩展性
class Animal{
void eat() { }
}
class Cat extends Animal{
void eat() { }
}
class Dog extends Animal{
void eat(){ }
}
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}
●
多态环境下对成员方法的调用
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() //调用的是动物类中的静态成员方法。
简单的说:编译和运行都看左边。
●
多态环境下对成员变量的调用
class Animal{
int num = 3;
}
class Cat extends Animal {
int num = 4;
}
…….
Animal x = new Cat()
x.num; //调用的是动物类中的成员变量。
简单的说:编译和运行都看等号左边。
注意:变量不存在被子类覆写这一说法,只有方法存在覆写。
向下转型
父类引用仅能访问父类所声明的属性和方法,不能访问子类独有的属性
和方法。
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关键字
l
final 用于修饰类,方法,参数,和属性
类:不能被定义为抽象类或是接口,不可被继承
方法:子类里不可以重写
参数:参数值在方法中不可被修改
属性:定义时就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改
三,接口
●
认识一下接口
public
interface
MyInterface {
int num = 10; 所有属性默认为:public static final
所有属性默认为: public atic
public void foo()
; 抽象方法是:public abstract
public static void test(){ } jdk8之后添加静态方法,接口可直接调用
public default void test1(){} jdk8之后添加默认方法,通过子类调用
}
接口的定义:使用 interface 关键字用来声明一个接口。
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n]
{
// 声明常量 抽象方法 静态方法 默认方法
}
接口的使用:
类使用implements关键字实现接口。在类声明中,Implements
关键字放在class声明后面。
[访问修饰符] class 类名 implements 接口名1,接口名2……{ }
结合继承:
[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{ }
l
接口是隐式抽象的,主要用来定义功能.
l
接口中可以定义静态常量,抽象方法,静态方法,默认方法.
l
一个接口能继承其它多个接口.
l
接口不能实例化对象.
l
接口是要被类实现,一个接口可以被多个实现
l
当类实现接口的时候,类要实现接口中所有的抽象方法,否则,该类必须
声明为抽象的类.
l
接口与实现类之间存在多态性
抽象方法是:public abstract
所有属性默认为: public static final
jdk8之后添加静态方法,接口可直接调用
jdk8之后添加默认方法,通过子类调用