黑马程序员---Java基础---多态

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一、多态概述:

某一个事物,在不同时刻表现出来的不同状态。


二、多态前提

a:要有继承关系。

b:要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。

c:要有父类引用指向子类对象。   父 f =  new ();


三、多态中的成员访问特点

A:多态中的成员访问特点

a:成员变量

编译看左边,运行看左边。

b:构造方法

创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。

c:成员方法

编译看左边,运行看右边。

d:静态方法(静态和类相关,算不上重写,所以,访问还是左边的)

编译看左边,运行看左边。

package cn.hebei.sjz_多态;
/*
 * 多态的联系
 */
class Animal{
	int age = 10;
	public void load(){
		System.out.println("叫");
	}
	public void eat(){
		System.out.println("吃");
	}
	public static void method(){
		System.out.println("父类的静态方法");
	}
}
class Cat extends Animal{
	int age = 18;
	public void load(){
		System.out.println("喵喵叫");
	}
	public void ti(){
		System.out.println("尥蹶子");
	}
	public static void method(){
		System.out.println("子类的静态方法");
	}
}
public class Demo1 {
	public static void main(String[] args) {
		Animal a = new Cat();
		System.out.println(a.age);//结果为10,成员变量:编译看左边,运行看左边。
		a.load();//喵喵叫  成员方法:编译看左边,运行看右边,  运行的是子类中的load()方法。
		a.eat();//吃   子类中没有重写eat()方法,继承父类中的。
		//a.ti();  //错误,找不到符号。  这是子类特有的功能,在编译中没有在父类中找到,编译失败。
		//调用静态方法,编译看左边,运行看左边,不是多态的体现
		a.method();
	}

}

四、多态的好处和弊端

A:多态的好处

a:提高了代码的维护性(继承保证)

b:提高了代码的扩展性(由多态保证)

B:通过多态的弊端

a:不能使用子类特有的功能

C:要想使用子类的特有功能就需要把父类引用强制转换成子类的引用,这就要用到向上转型和向下转型

Fu f = new Zi();  向上转型,相当于小的数据类型往大的数据类型转换。

Zi z = (Zi)f;  乡下转型,前提是父类引用必须指向该子类对象。

package cn.hebei.sjz_多态;
/*
 * 向下转型和向上转型
 */
class F{
	int age = 50;
	String name = "父亲";
	public void house(){
		System.out.println("三间房");
	}
}
class Z extends F{
	int age = 25;
	String name = "儿子";
	public void house(){
		System.out.println("一间房");
	}
	public void netManager(){
		System.out.println("工人");
	}
}
class Nv extends Fu{
	int age = 23;
	String name = "女儿";
	public void house(){
		System.out.println("一间房");
	}
	public void work(){
		System.out.println("财务");
	}
}
class Demo2 {
	public static void main(String[] args) {
		F f = new Z();//向上转型
		System.out.println(f.age);//50   成员变量:编译看左边,运行看左边
		System.out.println(f.name);//父亲
		f.house();//一间房    成员方法:编译看左边,运行看右边
		Z z = (Z)f;//向下转型
		z.netManager();
	}
}

五、抽象类的概述

抽象类就是描述不清楚的类。

Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

abstract关键字  表示抽象,可以修饰类又可以修饰方法。

抽象方法格式: public abstract 返回值类型 方法名();

       

六、抽象类的特点

a:抽象类和抽象方法必须用abstract关键字修饰

抽象类格式: abstract class 类名 {}

抽象方法格式: public abstract 返回值类型 方法名();

b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

c:抽象类中可以有构造方法,抽象类不能进行实例化,用于子类访问父类数据时的初始化

d:抽象类不能实例化但是可以按照多态的方式,由具体的子类实例化。

e:抽象类的子类

要么是抽象类,没有意义。

要么重写抽象类中的所有抽象方法的具体类


七、抽象类的成员特点

A:抽象类的成员特点

a:成员变量:既可以是变量,也可以是常量。

b:构造方法:有。用于子类访问父类数据的初始化。

c:成员方法:既可以是抽象的,也可以是非抽象的。

package cn.hebei.sjz_多态;

/*
 * 抽象类的练习
 */
abstract class An {
	public An() {
	}

	public abstract void eat();//抽象方法

	public void show() {
		System.out.println("我是父类的非抽象方法");//非抽象方法
	}
}

class Ca extends An {
	public void eat() {
		System.out.println("猫爱吃鱼");
	}
}

public class Demo3 {
	public static void main(String[] args) {
		An a = new Ca();
		a.eat();
	}
}

B:抽象类的成员方法特性:

a:抽象方法  强制要求子类做的事情。

b:非抽象方法  子类继承的事情


八、abstract不能和哪些关键字共存?

private  冲突 被private修饰的不能继承

final   冲突 被final修饰的方法不能被重写 

static  无意义 如果被static 修饰 该方法是静态的是随着类的加载而加载,是要被类调用,被abstract修饰的方法没有方法体,调用没意义。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值