1.多态:
- 心得体会:
前提:必须有子父类关系。
实质:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
定义格式:父类类型 变量名=new 子类类型();
样例:
多态成员变量:编译运行看左边
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
多态成员方法:编译看左边,运行看右边
Fu f1=new Zi();
System.out.println(f1.show());
//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当无法对父类进行实例化,并且需要通过子类的重写方法来实现父类的方法功能
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
2.final
- 心得体会:
l:用来修饰类,方法、变量
1,修饰变量、常量, 值不可改变
2,修饰方法, 不能被重写
3,修饰类, 不能被继承
3.继承
- 心得体会:
- 子类对象在进行实例化前首先调用父类构造方法,再调用子类构造方法实例化子类对象。
- 实际在子类构造方法中,相当于隐含了一个语句super(),调用父类的无参构造。同时如果父类里没有提供无参构造,那么这个时候就必须使用super(参数)明确指明要调用的父类构造方法。
- 在进行继承的时候,子类会继承父类的所有结构(包括私有属性、构造方法、普通方法) 显示继承:所有非私有操作属于显示继承(可以直接调用)。
隐式继承:所有私有操作属于隐式继承(不可以直接调用,需要通过其它形式调用(get或者set)) - 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过
super 关键字调用父类的构造器并配以适当的参数列表。 如果父类构造器没有参数,则在子类的构造器中不需要使用 super关键字调用父类构造器,系统会自动调用父类的无参构造器。 - 子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。
多态继承的实例运用
package Idea.code.test;
import java .util.Scanner;
public class HelloWorld {
public static void main(String []args)
{
animal ani=new Cat();
animal ani1=new Dog();
animal ani2=new Elephant(); //多态三种动物
Person p=new Person(); //定义一个人
p.feed(ani); //人来喂养动物吃
p.feed(ani1);
p.feed(ani2);
}
}
class Person{ //人来喂动物
public void feed(animal ani) //animal的 ani变量整合了所有动物,但是看实参具体是个什么动物就是什么动物
{
ani.eat(); //比如它多态的子类是个猫就用Cat吃,如果多态的子类是只狗就用Dog吃
}
}
class animal{ //动物整合所有具体动物的吃方法
public void eat()
{
}
}
class Dog extends animal{ //狗是一种动物
public void eat() //继承动物的吃,具体吃什么自定义
{
System.out.println("狗吃肉");
}
}
class Elephant extends animal{ //大象是一种动物
public void eat() //继承动物的吃,具体吃什么自定义
{
System.out.println("大象吃香蕉");
}
}
class Cat extends animal{ //猫是一种动物
public void eat() //继承动物的吃,具体吃什么自定义
{
System.out.println("猫吃鱼");
}
}
4.抽象类与接口
- 心得体会:
-
接口和抽象类都不能被实例化,只能用多态的方法调用子类的重新方法。它们都位于继承树的顶端,用于被其他类实现和继承。
-
接口的成员变量默认为静态常量(public static fianal),成员方法默认为抽象方法(public
abstract),不能定义普通成员变量;抽象类里既可以定义普通成员变量,也可以定义静态常量。 -
接口定义的是一种规范,没有构造器只能包含抽象方法、静态方法、默认方法和私有方法;抽象类里可以包含构造器(有参和无参),但抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始操作。
-
接口中不能包含初始化块;但抽象类完全可以包含初始化块。
-
一个类只能继承一个抽象类,但可以实现多个接口。(接口也可以继承多个接口)
(因为继承多个抽象类,那么重写会造成歧义,继承多个接口是为java灵活性不足所做的补充。)子类名 extends 父类 Implements 接口1,接口2... ```
-
如果实现接口或者抽象类的子类是抽象类,则可以实现一部分 。
-
抽象类实现某个接口,可以不实现所有接口的方法,可以由它的子类实现。而普通类即非抽象类则必须实现接口里的全部方法。
-
抽象类和接口的抽象方法必须全部重写,但抽象类的非抽象类可以不必要重写。
-
接口可以继承接口,抽象类不可以继承接口,但可以实现接口。
接口和抽象类一样,都是在父类中声明多个抽象类让子类来重写调用,都可以用多态,只是接口可以继承多个,但抽象类可以有抽象方法、实现方法而接口只能有抽象方法。
抽象和接口的本质:子类实现多个接口、继承一个抽象类,来调用他们声明好的抽象类方法。