什么是抽象类:
一个类中没有包含足够的信息来描绘一个具体的对象;用abstract修饰的类就是抽象类;抽象类中不一定有抽象方法;但是有抽象方法就一定存在于抽象类中;
抽象类只能用作父类,表示继承关系。继承抽象类的子类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。
定义抽象类:
【访问权限】abstract class 类名 {成员列表}
抽象方法:
在类中没有方法体的方法,称之为抽象方法;
抽象方法的声明:
【访问权限】abstract 返回值类型 方法名称(参数列表);
作用:可扩展性好;可优化程序;
多态性:
体现在:方法重载;方法覆盖;多态参数;
①:编译期类型与运行期类型相同;
A a = new A();
a.show();
在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。
构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法
②:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型;
//A类是B类的父类
A ab = new B();
ab.show();
对象ab的编译期类型为父类A类,运行期类型为子类B类。
如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系。
多态环境下对成员方法的调用:
编译在左,运行在右;
多态环境下对静态成员方法的调用:
编译在左,运行也在左;
多态环境下对成员变量的调用:
简单的说:编译和运行都看等号左边。
注意:变量不存在被子类覆写这一说法,只有方法存在覆写。
父类:
public class Anmainal {
String name = "动物";
//方法
void eat(){
System.out.println("父类 : 吃饭");
}
Anmainal(){
System.out.println("父类 :构造方法");
}
static void jump() {
System.out.println("父类 :jump ");
}
}
子类1:
public class Cat extends Anmainal {
String name = "猫";
void eat() {
System.out.println("猫 子类 : 吃饭");
}
void drink(){
System.out.println("猫 子类 :喝水");
}
Cat(){
System.out.println("猫 子类 :构造方法");
}
static void jump() {
System.out.println("猫 子类 :jump ");
}
}
public class Main {
public static void main(String[] args) {
Anmainal A=new Cat();
A.eat(); //结果:猫 子类 : 吃饭
System.out.println(A.name); //结果:动物
A.jump(); //调用静态方法时,出现父类的结果
Cat B = (Cat) A; //需要强制转换,子类中创新的方法才能出现结果
B.drink();
System.out.println(B.name); //需要强制转换,子类中属性才能出现结果 }
父类引用指向子类对象:
当编译器类型是父类,运行期类型是子类时,被称为父类引用指向子类对象;
class Animal{ //父类
……
}
class Cat extends Animal{
…… //子类Cat
}
class Dog extends Animal {
…… //子类Dog
}
Cat m = new Cat()
Animal x = new Cat() //Animal 的引用指向Cat的对象
对象m可以调用猫类中的所有方法,x只能调用动物类中定义的方法,
猫类扩展的新方法不能调用。 (例子如上)
多态参数:
方法参数具有多态性:
父类:
public class Anmainal {
String name = "动物";
//方法
void eat(){
System.out.println("父类 : 吃饭");
}
Anmainal(){
System.out.println("父类 :构造方法");
}
static void jump() {
System.out.println("父类 :jump ");
}
}
子类猫:
public class Cat extends Anmainal {
String name = "猫";
void eat() {
System.out.println("猫 子类 : 吃饭");
}
void drink(){
System.out.println("猫 子类 :喝水");
}
Cat(){
System.out.println("猫 子类 :构造方法");
}
static void jump() {
System.out.println("猫 子类 :jump ");
}
}
子类狗:
public class Dog extends Anmainal{
String name = "狗";
void eat() {
System.out.println("狗 子类 : 吃饭");
}
void drink(){
System.out.println("狗 子类 :喝水");
}
Dog(){
System.out.println("狗 子类 :构造方法");
}
static void jump() {
System.out.println("狗 子类 :jump ");
}
}
public class Main {
public static void main(String[] args) {
Anmainal A1 = new Anmainal();
Cat B = new Cat();
Dog D = new Dog();
A1.eat();
B.eat();
D.eat();
}
void sing(Anmainal A1) {
A1.eat();
}
}
多态环境下对象造型:
向上造型 –又称自动类型提升:
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look() {
System.out.println("看家");
}
}
………
Animal x=new Cat() //向上造型,Cat对象提升到Animal对象
x.eat() //只能使用父类中的方法
x.look() //报错!不能使用子类中的方法
向上造型的作用是:提高程序的扩展性。
向下造型 –又称向下转型:
class Animal{
abstract void eat();
}
class Cat extendsAnimal{
void look() {
System.out.println("看家");
}
}
………
Animal x=new Cat()
Cat m=(Cat)x; //向下转型
m.eat() ;
m.look();//子父类中的方法都可以使用
向下造型的作用是:为了使用子类中的特有方法。