java自学笔记4:java中的多态
来源:互联网 发布:西直门桥主要数据 编辑:程序博客网 时间:2024/06/05 23:08
一.
对象中的多种形态
1.引用的多态:
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
2.方法的多态:
创建父类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
代码描述:
父类:Animal类
package com.vishuo.www;public class Animal { public void eat(){ System.out.println("动物具有吃的能力"); }}
子类:Dog类
package com.vishuo.www;public class Dog extends Animal { public void eat(){ System.out.println("狗是吃肉的"); } public void watchDoor(){ System.out.println("狗具有看门的能力"); }}
子类:Cat类
package com.vishuo.www;public class Cat extends Animal {}
测试类:Initial类
package com.vishuo.www;public class Initail { public static void main(String[] args) { // TODO Auto-generated method stub Animal obj1 = new Animal(); Animal obj2 = new Dog();//父类的引用是可以指向子类对象的 Animal obj3 = new Cat(); obj1.eat(); obj2.eat(); obj3.eat();// obj2.watchDoor(); //不允许通过父类的引用调用子类独有的方法 }}
测试类输出:
动物具有吃的能力
狗是吃肉的
动物具有吃的能力
二.多态中的引用类型转换
1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
无风险
2.向下类型转换(强制类型转换),是大类型到小类型
有风险
3.instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
代码演示:
package com.vishuo.www;public class Initail { public static void main(String[] args) { // TODO Auto-generated method stub Dog dog = new Dog(); Animal animal = dog;//自动类型提升 向上类型转换 //通过instanceof运算符避免类型转换的安全性问题 if(animal instanceof Dog){ Dog dog2 = (Dog)animal;//向下类型转换 强制类型转换 System.out.println("转换成功"); }else{ System.out.println("无法进行类型转换 转换成Dog类型"); } //通过instanceof运算符避免类型转换的安全性问题 if(animal instanceof Cat){ Cat cat =(Cat)animal;//1.编译时 Cat类型 2.运行时 Dog类型 }else{ System.out.println("无法进行类型转换 转换层Cat类型"); } }}
三.java中的抽象类
1.语法定义:
抽象类前使用abstract关键字修饰,则该类为抽象类。
abstract class Animal{ abstract void grow();}
2.应用场景
a.在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
b.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3.作用:
限制规定子类必须实现某些方法,但不关注实现细节
4.使用规则
a.abstract定义抽象类
b.abstract定义抽象方法,只有声明,不需要实现
c.包含抽象方法的类是抽象类
d.抽象类中可以包含普通的方法,也可以没有抽象方法
e.抽象类不能直接创建,可以定义引用变量
代码实现:
创建父类Telphone时,选中abstract选项
package com.vishuo.www;public abstract class Telphone { public abstract void call(); public abstract void message();}
创建子类Cellphone,继承父类Telphone,会自动创建父类中需要声明的方法
package com.vishuo.www;public class Cellphone extends Telphone { public void call() { // TODO Auto-generated method stub System.out.println("通过键盘来打电话"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("通过键盘来发短信"); }}
创建智能手机子类,继承父类Telphone
package com.vishuo.www;public class Smartphone extends Telphone { @Override public void call() { // TODO Auto-generated method stub System.out.println("通过语音打电话"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("通过语音发短信"); }}
创建测试类Initail
package com.vishuo.www;public class Initail { public static void main(String[] args){ Telphone tel1 = new Cellphone(); tel1.call(); tel1.message(); Telphone tel2 = new Smartphone(); tel2.call(); tel2.message(); }}
输出数据:
通过键盘来打电话
通过键盘来发短信
通过语音打电话
通过语音发短信
父类图形类Shape
package com.vishuo.www;public abstract class Shape { public abstract float calculateArea(float width,float heigth,float radius);//计算面积 public abstract float calculatePerimeter(float width,float heigth,float radius);//计算周长}
子类矩形类Rectangle
package com.vishuo.www;public class Rectangle extends Shape { @Override public float calculateArea(float width, float heigth, float radius) { // TODO Auto-generated method stub float area = width * heigth; return area; } @Override public float calculatePerimeter(float width, float heigth, float radius) { // TODO Auto-generated method stub float perimeter = (width + heigth) * 2; return perimeter; }}
子类圆形类Circle
package com.vishuo.www;public class Circle extends Shape { @Override public float calculateArea(float width, float heigth, float radius) { // TODO Auto-generated method stub float area = (float) (3.14 * Math.pow(radius, 2)); return area; } @Override public float calculatePerimeter(float width, float heigth, float radius) { // TODO Auto-generated method stub float perimeter =(float) ((float)2 * radius * 3.14); return perimeter; }}
测试类Initail
package com.vishuo.www;public class Initail { public static void main(String[] args) { // TODO Auto-generated method stub Shape shape = new Rectangle(); float area = shape.calculateArea(12, 20, 0); System.out.println("矩形面积为:"+area); float perimeter = shape.calculatePerimeter(12, 15, 0); System.out.println("矩形周长为:"+perimeter); Shape circle = new Circle(); float circleArea = circle.calculateArea(0, 0, 15); System.out.println("圆形面积为:"+circleArea); float circlePerimeter = circle.calculatePerimeter(0, 0, 15); System.out.println("圆形周长为:"+circlePerimeter); }}
- java自学笔记4:java中的多态
- java自学笔记1:java中的类
- java自学笔记2:java中的封装
- java自学笔记3:java中的继承
- java自学笔记5:java中的接口
- java自学笔记10:java中的字符串
- java自学笔记12:java中的集合框架(上)
- java自学笔记
- Java 自学 笔记
- java thread自学笔记
- (JAVA自学笔记)随笔
- 自学Java笔记自述
- JAVA入门自学笔记
- 自学JAVA笔记 day1
- 自学java基础笔记
- JAVA自学笔记
- JAVA自学笔记
- JAVA自学笔记(二):重用与多态
- 从TCP三次握手说起——浅析TCP协议中的疑难杂症(真心不错)
- mysql 查询缓存
- ubuntu根目录空间不够用
- Nginx实现HTTP负载均衡和TCP负载均衡
- codevs 1860 最大数
- java自学笔记4:java中的多态
- 欢迎使用CSDN-markdown编辑器
- [RunLoop 让返回值在耗时操作完成后返回]
- android jni 中的事件回调机制JNIenv的使用
- arduino + esp8266+ ds18b20 采集温度上传贝壳网
- rabbitmq channel接口常用方法详解
- Description Resource Path Location Type Java compiler level does not match the version o
- Python文件
- 计算机相关技术资料整理