初识Java—(十九)多态的示例

createh54周前 (03-23)技术教程7

5.7.3.1 新旧车案例

我们用一个例子来总结解释一下多态情况下里对于变量与方法的调用问题。

车行里我们有一辆BmwX5车。

public class BmwX5{
public int price = 500000;
public void speed(){
System.out.println(“150KM/H”);
}
}
我们这里还有一辆二手的X5;
public class BmwX5_1 extends BmwX5{
public int price = 200000;
public void speed(){
System.out.println(“120KM/H”);
}
}


有人来买车,新车没了,只有一辆二手的在这。然后开着出去试驾了,工作人员说这是新车。

BmwX5 bmw = new BmwX5_1(); // 这叫向上转型

人问了,你这家多钱?

System.out.println(bmw.price); // 你说应该说这车多少钱? 成员变量是事物的外物描述

然后,买车的人一脚油门下去。

bmw.speed(); // 最大能开多快?? 成员方法是事物的具体功能

你赶紧拦着,说这边限速,只开到了90KM/H.

然后试驾的回去了。来了个人说买二手车。现在这个车,是二手车,还是新车?

BmwX5_1 bmw1 = (BmwX5_1)bmw; //向下转型
System.out.println(bmw1.price);
bmw1.speed();

5.7.3.2多态继承中的内存图解

class Car{
public String price = “10”;
public void print(){
System.out.println(“我就是辆车!”);
}
}

class BmwCar extends Car{
public String price = “55”;
public void print(){
System.out.println(“我是宝马车”);
}
public void price(){
System.out.println(“这个车有点贵”);
}
}

class TestDemo{
public static void main(String[] args){
Car car = new BmwCar();
System.out.println(car.price);
car.price();
car.print();
}
}



5.7.3.3多态中的对象变化内存图解

class Car{
public void print(){}
}

class BmwCar extends Car{
public void print(){}
public void price(){}
}
class BenzCar extends Car {
public void print(){};
public void speed(){}
}

class CarDemo{
public static void main(String[] args){
Car c = new Bmwcar();
c.print();
c.price();

BmwCar bmw = (BmwCar)c;
bmw.print();
bmw.price();

c = new BenzCar();
c.print();
c.speed();

BenzCar benz = (BenzCar)c;
benz.print();
benz.speed();

BmwCar bmw1 = (Benz)c;
}
}

画图之前,先看一下。代码哪里会出错误。



5.7.3.4多态需要注意的地方及练习:

例 1:

class Car{} class BmwCar extends Car{} class BenzCar extends Car{}
class CarDemo{
BmwCar bmw = new Car(); 错 从语法定义来看,车叫宝马。行吗? 报错,不兼容类型
BmwCar bmw1 = new BenzCar(); 错 从语法定义来看,奔驰是宝马。报错,不兼容类型
}

例 2:看下面程序有没有问题,如果没有问题,结果是多少?

class Car {
public void print() {
System.out.println("I’m Car ");
}
}

class BmwCar extends Car {
public void print() {
System.out.println("I’m BmwCar");
}
public void price() {
System.out.println("500000");
}
}

class TestDemo {
public static void main(String[] args) {
Car c = new BmwCar();
c.print();
c.price();
}
}

例 3:

class A {
public void show() {
show2();
}
public void show2() {
System.out.println("A");
}
}
class B extends A {
public void show2() {
System.out.println("B");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("C");
}
}

public class TestDemo {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}

OK,这里总合一下。

多态成员访问特点:成员变量:编译运行都看左边。方法:编译看左边,运行看右边。

继承:子类中有和父类一样的方法,是重写。子类中没有出现父类中的方法,也继承了过来。

5.7.4 instanceof运算符

instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口,接口也是类,是一种特殊的类),它用于判断前面引用变量所指向的具体对象是否是后面这个类,或者后面这个类的子类,或者后面这个类的实现类的一个实例对象。是则返回ture,否则返回false。

举例1:

package com.langsin.test;
public class Test {
public static void main(String[] args) {
Object obj = "hello";
System.out.println(obj instanceof Object);
//true
System.out.println(obj instanceof String);
//true
System.out.println(obj instanceof Math);
//false
String a = "hello";
//编译失败报错:Incompatible conditional operand types String and Math(不相容的条件和数学操作数类型字符串)
System.out.println(a instanceof Math);
}
}

相关文章

「Java」绘图入门和机制,绘图方法演示(绘制坦克)

目录1.绘图入门(绘制一个圆)1.第一步//1.先定义一个Mypanel,继承JPanel,画图行就在面板上画。//Mypanel可以理解为一个画板//Graphics可以理解为一个画笔,提供了很多绘...

stable-diffusion.java, Java调用Stable Diffusion实现AI 画图

今天了解了一个新的项目,stable-diffusion.java, 这是一个Java 项目,通过底层调用stable-diffusion.cpp, 从而让Java 项目也能AI 画图, 好神奇!st...

java Graphics2D 画图

在Java中,当需要画一些特殊的形状时,比如说椭圆、矩形等,可以使用 Graphics2D 来绘图。一些API:g.drawLine(3,3,50,50);//画一条线段 g.drawRect(80...

有趣的EXCEL&vba作图

还记不记得之前有个日本老爷爷用EXCEL绘图,美轮美奂,可谓是心思巧妙。我是没有那样的艺术细胞,不过咱有自己的方式,用代码作图通过vba代码将指定的图片写入excel工作表中,可不是插入图片哦解题思...

还能这么玩?用VsCode画类图、流程图、时序图、...不要太爽

软件设计中,有好几种图需要画,比如流程图、类图、组件图等,我知道大部分人画流程图一般都会用微软的viso绘制,我之前也是这个习惯。viso画图有个不好的地方是需要时刻去调整线条和边框已达到简洁美观,今...

Python绘图Turtle库详解

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行...