「java多态入门教程」Java实现多态
今天给各位分享java多态入门教程的知识,其中也会对Java实现多态进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java中的多态 到底怎么使用
Java中的多态允许父类指针指向子类实例。如:Father obj=new Child();(其中Child是Father的子类)。这样就产生了一个问题——
使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪一个属性或方法会被调用呢?
最好的办法是实验:
class Father
{
int r;
Father()
{
r=4;
}
void printname()
{
System.out.println("I’m father");
}
}
class Child extends Father
{
int r;
Child()
{
r=5;
}
void printname()
{
System.out.println("I’m Child");
}
}
public class Test
{
public static void main(String[] args)
{
Father obj=new Child();
System.out.println(obj.r);
obj.printname();
}
}
结果输出:
4
I’m Child
实验证明。属性会访问父类的。方法分访问子类的。
这就是多态了。
不要以为Father obj=new Child();这条语句一定会让obj.printname()指向Chlid定义的printname()。实际上,如果你把Father类中的printname()方法删除,这个程序将编译失败。因为Father中的并没有定义printname()这个函数。多态是晚绑定*(见本文最后的资料)的,在Father obj=new Child();这个语句中,如果Father中没有printname()这个函数,就不会为obj建立一个用于调用printname()函数的指针。所以调用obj.printname()会出错。如果Father中有这个函数。指向printname()函数的指针会被创建。在调用obj.printname()时,不会出错,而且,因为obj指向的是new Child(),是个Chld类的实例。所以调用obj.printname()时调用了Child类中定义的printname()。这就是方法的动态绑定。
那么,刚才说到把Father类中的printname()方法删掉后,obj将无法调用Child类中的printname(),因为obj.printname()会编译失败。那么如果我就是需要调用要怎么办呢?其实虽然obj是Father类型的,但是它指向的是一个Child类的实例。那么可以将obj强制类型转换为Child。再调用printname()方法就可以了。
在上面程序中,把Father类中的printname()方法整个删掉,再将obj.printname() 改成 ((Child)obj).printname()后,编译成功,结果输出:
4
I’m Child
两次输出的结果都是I’m Child。
那么如何可以运行Child类中的printname()来输出“I’m Father”呢?
其实只需要将Father obj=new Child();改成Father obj=new Father();就可以了,呵呵。另一个办法就是将Child类中定义的printname()整个删掉。为什么这样可以成功呢?自己想想,嘿嘿。最后会有个这样的思考题。
看到这儿你可能早就想问了:
为什么obj.r是4?为什么不是5?
呵呵。其实很简单。Java中的多态仅为方法而言,成员变量还是使用的父类的成员变量。也就是说,因为“Father obj =……”,所以obj是Father类型的,所以obj里面的r是Father里面的r,所以输出obj.r就是4了。
你又想问:
那么5去哪了?new Child()的时候,不是会把5放到Child的r中吗?
实际上5还是有的。只是obj.r是4而已。想访问Child中的r,把5读出来,可以这样写:
((Child)obj).r
就是把obj由Father型强制转换成了Child型。
OK,方法和属性在多态中是什么样的你都清楚了。现在做个题测试一下吧:
这是J@Whiz1.4的一道题:
class Base {
int i = 99;
public void amethod() {
System.out.println("Base.amethod()");
}
Base() {
amethod();
}
}
public class Derived extends Base {
int i = -1;
public static void main(String argv[]) {
Base b = new Derived();
System.out.println(b.i);
b.amethod();
}
public void amethod() {
System.out.println("Derived.amethod()");
}
}
会输出什么?
先想想,再看答案:
答案:
========================
Derived.amethod()
99
Derived.amethod()
========================
讲解:
这个程序的执行过程是这样的:
第一行:Base b=new Derived();
执行这一行语句的过程中,要构造Derived这个类,而它有父类Base,所以先构造Base类。构造Base类的默认构造函数有定义。内容是执行amethod()方法。
实际上,Base类构造方法中的执行amethod(),相当于执行this.amethod(),在这个程序中,就相当于执行b.amethod()。而b是Base类型的,指向了Derived类的实例的指针。所以跟据上面我们的总结,实际上执行的是Derived类的amethod()函数。所以,第一行“Base b=new Derived();”执行完,输出"Derived.amethod()"。
第二行:System.out.println(b.i);
这个很简单,成员变量,不考虑多不多态,只看它定义时前面的类型。这个程序中是Base b,所以b.i就是Base类中的i。输出99
第三行:b.amethod();
调用Derived类中的amethod()方法。
其实这行就是迷惑你的,如果没有这一行。你可能会警觉起来——咦?为什么这儿定义一个amethod()呢?没有地方调用它啊?
有了这行代码,就会使你放松警惕。觉得,啊。定义了这个是用来让b.amethod();调用的。
java基础入门教程都有哪些?
网上教程挺多的,刚刚看了一个九天的Java学习入门教程,通过《学生管理系统》案例整合基础知识,巩固加深知识理解。
学习内容:
第一阶段:Java基础语法
Java背景与环境搭建;常量、变量、数据类型;运算符;分支语句;循环语句;数组;方法;二维数组
第二阶段:面向对象基础
面向对象思想理解;类和对象的关系;对象的使用;对象内存图;this关键字;封装;构造方法;JavaBean类的编写
第三阶段:常用API
API手册的使用;String类的特点;不同方式创建String对象的区别;字符串常见面试题;字符串常用方法;StringBuilder类的使用;StringBuilder常用方法;String和StringBuilder的区别对比
第四阶段:集合框架
集合和数组的对比;ArrayList集合对象的使用;ArrayList集合对象常用方法;ArrayList集合遍历,与封装数据到集合;综合案例 - 学生管理系统
网页链接 912t
JAVA基础多态性~!!
1 多态包括方法的多态和对象的多态
2 方法的多态主要是指方法的重写和重载。
3 我在这里主要解释一下对象的多态:一个对象,多种形态。
4 对象多态的基础: 子类对象可以当做父类对象来看.
例如:Animal a= new Bird();
5 对象多台的核心定理:
a。 如果我们吧子类对象当做父类对象来看,那么我们就只能访问负累中已有定义的属性和方法(不能访问子类扩展的属性和方法)
b。 如果子类吧负累的方法覆盖了,在把子类对象当做负累对象来看,去调用该方法,调用的是覆盖之后的方法(子类中定义的方法)。
6 例如:Animal接口里面有一个eat ()方法
现在有俩个实现类 horse 和 tiger 类。这俩个类分别重写了eat()方法
现在我们new 俩个对象
如: Animal animal1= new horse(); animal1.eat();
调用的就是马的eat方法。执行结果是马吃草;
Animal animal2 = new tiger() ;animal2.eat();
这里调用的就是老虎的eat方法,执行结果就是老虎吃肉;
如何实现Java的多态
使用继承或者接口实现都能体现多态,例如:
public class XSSDefenseFormat implements Format {
}
public class XSSDefenseFormat extends Format {
}
JAVA基础入门教程 -
第一阶段:Java语言基础
★ Java语言基础
1、面向对象思维JAVASE
2、(类加载机制与反射,annotation,泛型,网络编程,多线程,IO,异常处理,常用API,面向对象,JAVA编程基础)
3、Java8新特性
JAVA战狼班第二阶段:数据库
★ 数据库
1、Oracle(SQL语句、SQL语句原理、SQL语句优化、表、视图
2、序列、索引、Oracle数据字典、Oracle 数据库PL/SQL开发
3、数据库设计原则、 MySQL 、 JDBC
第三阶段:Web基础
★ Web基础
1、HTML5(H5)基本文档结构、链接、列表、表格、表单;
2、CSS 基础语法、盒子模型、浮动布局、定位;
3、JavaScript语言基础、DOM 编程、事件模型等),JQuery,AJAX框架,XML,BootStrap组件
第四阶段:Java Web技术和主流框架
★ Java Web技术和主流框架
1、JSPServlet、struts2,hibernate4,spring4,JPA,maven
2、SpringData,SpringMVC,MyBatis,SpringSecurity,shiro,Nginx
第五阶段:Linux
★ Linux
1、Linux安装、熟悉Linux的基础命令、vi编辑器的使用、awk和sed命令使用、用户和组
2、文件及目录权限管理、使用ACL进行高级访问控制、网络配置和软件包安装、启动流程和服务管理
3、系统监控和日志管理、进程管理和计划任务、ssh远程登录、shell基础和shell脚本。
第六阶段:大数据技术(Hadoop和Spark)
★ 大数据技术(Hadoop和Spark)
1、Hadoop (Hadoop基础和环境搭建,HDFS体系结构,MapReduce;Hadoop的集群模式、HDFS联盟,利用ZooKeeper来实现Hadoop集群的HA(高可用性)功能
2、Yarn的任务调度机制,Apache Hive,Pig数据处理,集成Hadoop和Sqoop
3、Flume以及Apache Kafka来实现数据的交换,安装部署HBase,Storm)
4、Scala 语言(Scala环境搭建、Scala基础语法、模式匹配、重载与构造器、Map与reduce、元组、继承、StringContext,Option Some None,Tuple;集合方法和运算,future 对象同步处理和异步处理返回结果)
5、Spark(Spark搭建,Spark-shell 的使用,Spark-submit 提交应用, Spark的内核设计和实现,并对内核中的实现架构、运行原理进行详细的讲解;Spark生态体系中的各个组件,包括:Spark Core,Shark,Spark SQL和Spark Streaming等等)
第七阶段:项目
★ 项目
1、China-UCSP 项目 SSM(Spring+SpringMVC+MyBatis)
2、用户关系管理系统 S2SH+Maven+Nodejs+MySQL技术实战开发
3、电子商务交易平台 S2SH+Maven+Shiro+Oracle
请问java中怎么实现多态?
首先多态是多种形式或形态,它在计算机程序设计语言中代表一种能力,即用一个特定类型的变量来引用不同类型的对象,并且根据引用对象的不同而自动的调用相应的方法。比如说我们想象一个农民种蔬菜的列子,Vagetable包括Potato和Cabbage两种蔬菜。农民中类中只需种蔬菜,并不用知道它具体是哪种蔬菜,只需要把实现了蔬菜类的土豆和大白菜放进方法里就可以了,然后java会根据多态的特性来自动为我们调用土豆类的方法和大白菜类的方法。创建了一个抽象类Vagetable(蔬菜)类,这个类中有个抽象的方法public abstract void grow();再在Potato和Cabbage中实现这个抽象方法:土豆类中写一个方法public void grow(){System.out.println("我是土豆")};大白菜类写一个方法:public void grow(){System.out.println("我是大白菜")};我们再建个农民类,农民有个plant()方法,我们写一个农民种蔬菜的抽象方法:public void plant(Vagetable v){v.grow()};最后我们可以让农民种蔬菜了,创建对象Farm f=new Farm();f.plant(new Potato);f.plant(new Cabbage);就可以打印出各自的方法了,即”我是土豆“和”我是大白菜”两句话!
关于java多态入门教程和Java实现多态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。