目录
多态
1.多态概述:
多态是面向对象继承,封装之后的一大特性.大多表现为一只动物或者人有不同的身份而对应的不同行为。
举个栗子:我们小时候常常看的电影熊出没,里面的熊大他不仅仅是熊,还是动物,而然这就是多态,在java中同样也能表示出来.
2.一般实现多态的三个必要条件
- 子类继承父类
- 子类重写父类的方法
- 父类引用指向子类对象(多态的主要体现方式)
3.使用方法实现多态
package com.tang.test;
/**
* 动物类
*/
public class Animal {
//动物具有吃的方法
public void eat(){
System.out.println("我要干饭!!!");
}
//动物具有跑的方法
public void run(){
System.out.println("连跑带奔...");
}
}
/**
* 熊大类
* 熊大也是动物所以需要继承动物
* 回忆:子类继承父类可以拥有父类的全部(私有除外)属性和方法
*/
class XiongDa extends Animal{
@Override
public void eat() {
System.out.println("俺爱吃蜂蜜....");
}
}
/**
* 测试:实现多态
*/
class Test{
public static void main(String[] args) {
//new一个动物(Animal)的子类
XiongDa xiongDa = new XiongDa();
//应为XiongDa也是子类所以可以进行方法的多态
show(xiongDa);
}
//方法实现多态
public static void show(Animal animal){
animal.eat();
animal.run();
}
}
输出:
俺爱吃蜂蜜....
连跑带奔...
4.父类对象引用指向子类对象
代码中格式为:
父类类型 name=new 子类类型();
父类引用指向子类,就是父类对象new一个子类对象,为了同一个行为具有多种的表达形式.
注意:
- 多态是方法的多态,不是属性的多态
- 多态是一个接口使用不同实例来实现不同方法的操作.
5. 父类对象引用子类对象实现多态(常用)
package com.tang.test;
/**
* 动物类
*/
public class Animal {
//动物具有吃的方法
public void eat(){
System.out.println("我要干饭!!!");
}
//动物具有跑的方法
public void run(){
System.out.println("连跑带奔...");
}
}
/**
* 熊大类
* 熊大也是动物所以需要继承动物
* 回忆:子类继承父类可以拥有父类的全部(私有除外)属性和方法
*/
class XiongDa extends Animal{
@Override
public void eat() {
System.out.println("俺爱吃蜂蜜....");
}
}
/**
* 测试:实现多态
*/
class Test{
public static void main(String[] args) {
//父类引用指向子类对象
Animal animal=new XiongDa();
//应为这种方式更加的方法所以我们常常使用此方式
animal.eat();
animal.run();
}
}
5.上下转型:
向上转型:子类对象转换为父类,小转大自动转,多态本身就是向上转型
父类类型 name=new 子类类型();
子类对象转为父类对象时可能会丢失本身独有的方法.
向下转型:父类对象转为子类,大转小强制转换
并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型。
子类类型 name=(子类类型)父类对象;
用途:一般需要使用子类独有的方法才会向下转型
向下转型如:
/**
* 测试:实现多态
*/
class Test{
public static void main(String[] args) {
//父类引用指向子类对象
Animal animal=new XiongDa();
//向下转型
XiongDa xiongda= (XiongDa)animal;
xiongda.eat();
}
}
6. 关键字instanceof(扩展)
关键字instanceof返回值为布尔类型用来判断是不是这个的实例化,与is-a的关系,案例如:
Animal animal=new Animal();
Animal dog=new Dog();
Animal cat=new Cat();
System.out.println(dog instanceof Animal);//理解为dog对象是Animal吗? true
System.out.println(animal instanceof Dog);//理解为animal对象是Dog吗? false 动物不止有狗
System.out.println(cat instanceof Animal);//理解为cat对象是Animal吗? true
System.out.println(animal instanceof Cat);//理解为animal对象是Cat吗? false 动物不止有猫
接口
1.接口的概述:
作者描述:java中接口可以说是抽象方法的集合,同时也是对类的一组需求描述,主要用来描述实现接口的类有什么功能,但并不给出每个功能的具体实现,接口在JDK8之前100%都是抽象方法,JDK8之后又新增默认方法和静态方法。
官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).
注:这里如果有不知道抽象类的小伙伴,可以花10分钟回去看一遍这篇博客:
java复习第十一天[抽象类]_123小步的博客-CSDN博客
2.接口的注意事项:
- java中是没有c++那样的继承的,但是接口可以通过implements关键字来实现多继承.
- 接口与抽象类一样可以进行实例化不过需要重写接口里的所有方法。
- 接口中的变量都是默认常量
3.接口的基本使用
接口的基本语法为:
public interface People{
//接口中方法都是默认抽象方法
void reflection();//相当于public abstract void reflection();
}
People接口里的reflection()方法代表了人的特征,那么只要实现了People接口里的这个方法则实现类就会被接口承认这个类是人类,因为他具有人类独特的方法思考,如:
/**
* 接口
*/
public interface People{
//接口中方法都是默认抽象方法
void reflection();//相当于public abstract void reflection();
}
/**
* 接口实现类
*/
class realizeHuman implements People{
@Override
public void reflection() {
System.out.println("认真思考问题");//人的特征
}
}
4.接口中的默认方法(扩展)
接口中的默认方法是在JDK8的时候新加入的,据说是因为当时的接口需要引入新的方法,但是如果引如新的方法,那些他的实现类全部都要在重写一遍新的方法,很不方便,所以在JDK8的时候引入了接口的默认方法,默认方法是有方法体的,但是接口的实现类不必强制去重写,如:
public interface People{
//接口中方法都是默认抽象方法
void reflection();//相当于public abstract void reflection();
//接口中的默认方法,可以重写也可以不用重写
default void eat(){
System.out.println("爱吃吃大米饭");
}
}
class realizeHuman implements People{
@Override
public void reflection() {
System.out.println("认真思考问题");//人的特征
}
}
5.接口中的静态方法(扩展)
与默认方法相同接口中的静态方法也是与JDK1.8加入,接口的静态方法可以通过接口直接去调用如:
public interface People{
//接口中方法都是默认抽象方法
void reflection();//相当于public abstract void reflection();
//接口中的默认方法,可以重写也可以不用重写
default void eat(){
System.out.println("爱吃吃大米饭");
}
//静态方法
static void drink(){
System.out.println("多喝热水");
}
}
class Test_1{
public static void main(String[] args) {
People.drink();
}
}
注意:这里不可以用实现接口的类去调用接口中的静态方法.需以接口名.需要调用的静态方法或属性.