java类多态_Java类的特点——多态、抽象

所谓多态,顾名思义,就是多种形式多种状态。多态可以说是面向对象编程的精髓所在。因此理解多态的含义对理解面向对象编程有特别重要的意义。Java之所以引入多态的概念,原因之一是它在类的继承问题上与C++不同,C++允许多继承,这确实给它带来了非常强大的功能,但是多继承必然会引起程序错综复杂,难于阅读理解。为了规避这种风险,java采取了单继承的方法,虽然这样使继承关系简单明了,但是同时也限制了其功能的实现。为了弥补这点不足,java引入了多态性的概念。

多态有两种理解方式,第一种是对像的不同方法可以用相同的一个方法名,即重载。另一种是同一对象根据不同的消息执行相应的行为,也就是,发送一个消息给某一个对象,让对象自行选择哪种行为。由此可以将多态分为静态多态和动态多态

静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也成为编译时多态。在java中实现静态多态的实现方式是方法重载。

动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态。动态多态的实现方式是重写父类中的同名成员方法。动态多态主要是通过动态绑定和重写的机制来实现的。

//定义一个shape类

public class Shape {

public void draw(){

System.out.println("画一个图形");

}

}

//定义一个多边形子类,继承Shape类

public class Rectangle extends Shape{

private int width;

private int height;

//with访问修改方法

public int getWidth() {

return width;

}

public void setWidth(int width) {

if(width>=1&&width<=15){

this.width = width;

}

}

//height访问修改方法

public int getHeight() {

return height;

}

public void setHeight(int height) {

if(height>=1&&height<=15){

this.height = height;

}

}

//重写父类draw方法

public void draw(){

System.out.println("*******\n* *\n*******");

}

}

//定义一个多边形子类,继承Shape类

public class Rectangle extends Shape{

private int width;

private int height;

//with访问修改方法

public int getWidth() {

return width;

}

public void setWidth(int width) {

if(width>=1&&width<=15){

this.width = width;

}

}

//height访问修改方法

public int getHeight() {

return height;

}

public void setHeight(int height) {

if(height>=1&&height<=15){

this.height = height;

}

}

//重写父类draw方法

public void draw(){

System.out.println("*******\n* *\n*******");

}

}

//定义一个Aritst类,将Shape类型的变量传给此类

public class Artist{

public void drawShape(Shape shape){

shape.draw();

}

}

//写一个main方法

public class ArtistDemo {

public static void main(String[] args){

//建个Shape类对象

Shape shape=new Shape();

//建个Rectangle类对象

Rectangle rectangle=new Rectangle();

//建个RightTriangle对象

RightTriangle rt=new RightTriangle();

//建个Artist对象

Artist artist=new Artist();

artist.drawShape(shape);

artist.drawShape(rectangle);

artist.drawShape(rt);

}

}

上面程序输出的结果是:

画一个图形

*******

* *

*******

*

***

*****

*******

由此可见动态多态在运行中系统才能动态确定方法所指的对象,传递不同的对象,只要在子类中有重写该方法就会执行子类的方法,没有重写时才会调用父类的方法。

此外java类还有抽象这个特点,抽象用关键字abstract修饰。经过abstract修饰过的类称为抽象类,抽象类只可以用来继承,不可以用来产生对象。进过abstract修饰的方法称为抽象方法,一个类一旦有了抽象方法,那么这个类也要变成抽象类。在继承了一个有抽象方法的抽象类时,这个子类必须重写重新类中的抽象方法。这样就要求合理设计类与类之间的继承关系并且规范了子类。

//定义一个静态类

public abstract class Mammal {

public void breathe(){

System.out.println("Mammal is breathing");

}

//定义一个静态方法

public abstract void nurse();

}

//定义一个鲸类,继承Mammal类

public class Whale extends Mammal{

public void breathe(){

System.out.println("Whale is breathing");

super.breathe();

}

//重写nurse静态方法

public void nurse(){

System.out.println("Whale is nursing");

}

}

//定义一个Cat类

public class Cat extends Mammal{

public void breathe(){

System.out.println("Cat");

}

//这里没有重写nurse静态方法,编译就要报错

public void nurse(int t){

System.out.println("cat nurse");

}

}

public class TestMain {

//定义一个main方法

public static void main(String[] args){

Mammal w=new Whale();

w.breathe();

w.nurse();

Mammal m=w;

m.breathe();

m.nurse();

System.out.println(m instanceof Whale);

System.out.println(w instanceof Mammal);

System.out.println(m instanceof Cat);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值