黑马程序员_多态与继承

------- android培训java培训、期待与您交流! ----------

1:多态

(1)对象在不同时刻表现出来的不同状态。

举例:水(冰,水,水蒸气)

(2)多态的前提

A:要有继承或者实现关系。

B:要有方法的重写。

C:要有父类引用或者父接口引用指向子类对象。

 

注意:多态有三种体现形式

类多态

抽象类多态

接口多态

(3)多态中的成员特点:

A:成员变量

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

B:成员方法

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

 

此特点是因为方法存在重写,而变量没有。

 

举例:孔子装爹。

孔子爹:讲课("JavaSE"),age=40

孔子:讲课("论语"),玩游戏(),age=20

 

//多态

孔子爹 k爹 = new 孔子(); //装爹,打扮的和爹一样。

System.out.println(k爹.age);//40

k爹.讲课(); //论语

//k爹.玩游戏(); //有问题

 

//讲了一天课,很累

孔子 k = (孔子)k爹; //去掉爹的装备

System.out.println(k.age);

k.讲课();

k.玩游戏();

 

 

(4)多态的弊端:

父类(接口)引用不能使用子类特有功能。

为了解决这个弊端,我们需要向下转型。

 

Fu f = new Zi(); //向上转型

Zi z = (Zi)f; //向下转型

 

Zi z = new Zi();

(5)多态的好处:

可以提高代码的扩展性和可维护性。

代码举例:

class Animal

{

public void show()

{

System.out.println("show Animal");

}

}

 

class Cat extends Animal

{

public void show()

{

System.out.println("show Cat");

}

 

public void playGame()

{

System.out.println("捉迷藏");

}

}

 

class Dog extends Animal

{

public void show()

{

System.out.println("show Dog");

}

}

class DuoTaiDemo4 

{

public static void main(String[] args) 

{

//多态

Animal a = new Dog(); //向上转型

a.show();

 

//给a重新赋值

a = new Cat(); //向上转型

a.show();

 

Cat c = (Cat)a; //向下转型

c.show();

c.playGame();

 

Dog d = (Dog)a;

d.show();

}

}

 

继承

(1)把多个类中的相同的属性和行为进行抽取,封装到一个类中,

   然后再建立新类的时候,不需要从头做起,继承刚才定义的那个类即可。

(2)好处:

A:提高代码的复用性。

B:让类与类之间产生了一个关系,是多态的前提。

(3)什么时候使用继承?

A:如果类之间存在着:

is a 的关系,就可以考虑使用继承。

B:不要为了继承部分功能,而去使用继承。

(4)继承的特点:

A:Java只支持单继承,不支持多继承。

为什么?如果支持多继承,就会有调用不明确的问题。

B:Java支持多层(重)继承。

(5)super和this的区别?

A:super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)

B:它和this的用法相似

a:成员变量

this.变量 -- 本类的

super.变量 -- 父类的

b:构造方法

this(...) -- 本类的

super(...) -- 父类的

c:成员方法

this.方法名() -- 本类的

super.方法名() -- 父类的

(6)子父类中成员变量的用法:

A:名称不同,这个太简单了。

B:名称相同,子类对象的在使用的时候:

先找子类局部范围

再找子类成员范围

最后找父类成员范围

(7)子父类中成员方法的用法:

A:名称不同。

B:名称相同,子类对象的在使用的时候:

先找子类的

再找父类的

C:方法重写

在子类中,方法声明(修饰符,返回值,方法名,参数列表)相同的情况。

 

注意事项:

a:父类中私有方法是不能被重写

b:子类方法的访问权限一定要大于等于父类的访问权限

(8)子父类中构造方法的用法:

A:子类的初始化过程中,首先回去执行父类的初始化动作。

   因为子类的构造方法中默认有一个super()。

为什么?子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。

所以,子类的初始化过程中,会先执行父类的初始化。

B:如果父类没有无参构造方法

A:使用super调用父类的带参构造。推荐方式。

B:使用this调用本身的其他构造。

3:代码块

(1)执行顺序:

静态代码块 --> 构造代码块 --> 构造方法

(2)注意事项:

静态代码块只执行一次

 

4:final

(1)是一个关键字,可以用于修饰类,成员变量,成员方法。

(2)特点:

它修饰的类不能被继承。

它修饰的成员变量是一个常量。

它修饰的成员方法是不能被子类重写的。

 

代码举例:

class Person

{

public void show()

{

System.out.println("person");

}

}

 

/*

class School

{

public void show()

{

System.out.println("school");

}

}

*/

 

//class Student extends Person,School

class Student extends Person

{

public void method()

{

System.out.println("method");

}

}

 

class Coder extends Student

{

 

}

 

class ExtendsDemo2

{

public static void main(String[] args)

{

Person p = new Person();

p.show();

System.out.println("------");

 

Student s = new Student();

s.show();

s.method();

System.out.println("------");

 

Coder c = new Coder();

c.show();

c.method();

}

}

------- android培训java培训、期待与您交流! ----------

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值