java父类引用指向子类对象好处_java子类调用父类属性

java父类引用指向子类对象好处_java子类调用父类属性1.什么是多态?方法的重写、重载与动态连接构成多态性Java之所以引入多态的概念,原因之一就它在类的继承上的问题和C++不同,后者允许多继承,这确实给其带来了非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象类和接口也是解决单继承规定限制的重要手段.同时,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1.什么是多态?

方法的重写、重载与动态连接构成多态性

Java之所以引入多态的概念,原因之一就它在类的继承上的问题和C++不同,后者允许多继承,这确实给其带来了非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象类和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在.

2.多态的体现

1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的

2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.

子类覆盖父类实现多态:

    如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性,不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了

重写父类方法:

//父类
public class Father{
//父类有一个打孩子方法
	public void hitChild(){
	}
}
//子类1
public class Son1 extends Father{
//重写父类打孩子方法
	public void hitChild(){
		System.out.println("为什么打我?我做错什么了!");
	}
}
//子类2
public class Son2 extends Father{
//重写父类打孩子方法
	public void hitChild(){
		System.out.println("我知道错了,别打了!");
	}
}
//子类3
public class Son3 extends Father{
//重写父类打孩子方法
	public void hitChild(){
		System.out.println("我跑,你打不着!");
	}
}

//测试类
public class Test{
	public static void main(String args[]){
		Father father;
	
		father = new Son1();
		father.hitChild();
	
		father = new Son2();
		father.hitChild();
	
		father = new Son3();
		father.hitChild();
	}
}
//重写父类打孩子方法
	public void hitChild(){
		System.out.println("我跑,你打不着!");
	}
}

//测试类
public class Test{
	public static void main(String args[]){
		Father father;
	
		father = new Son1();
		father.hitChild();
	
		father = new Son2();
		father.hitChild();
	
		father = new Son3();
		father.hitChild();
	}
}

Jetbrains全家桶1年46,售后保障稳定

 

   Java里没有多继承,一个类之能有一个父类。而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一样。这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果

 

都调用了相同的方法,出现了不同的结果!这就是多态的表现!

 

3.如何理解向上转型?

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat();

实例化一个Cat对象,这个不难理解。但当我这样定义时:

Animal a = new Cat();

这样代表什么意思呢?

很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特:

    定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

 

对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

来我们举个栗子:

class Father {
	public void func1(){
		func2();
	} 
	public void func2(){
		System.out.println("AAA");
	}
}

class Child extends Father{
	
	public void func1(int i){
		System.out.println("BBB");
		} 
	
	public void func2(){
		System.out.println("CCC");
		}
	
}


public class Test {
	public static void main(String[] args) {
		
		Father child = new Child();
		child.func1();//打印结果将会是什么?
  }
}

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

  经过上面的分析我们可以知道打印的结果是什么呢? 很显然,应该是”CCC”

4.对于多态总结一下

    一、使用父类类型的引用指向子类的对象;

    二、该引用只能调用父类中定义的方法和变量;

    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中       的这个方法;(动态连接、动态调用)

    四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父       类中的变量,那么在编译时会报错。

在现实生活中的体现:

      自己用自己的,儿子有父亲一样的,就用儿子的。省点钱是点。儿子独有的,父亲不会用,所以不能用

5.站在内存分配的角度分析

    1.从对象的内存角度来理解. 

假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,里面的变量需要占用0.5M内      存.   
    2.现在通过代码来看看内存的分配情况:

    f = new Father();//系统将分配1M内存.
    Son s = new Son();//系统将分配1.5M内存
//系统将分配1M内存.
    Son s = new Son();//系统将分配1.5M内存

     因为子类中有一个隐藏的引用super会指向父类实例,所以在实例    化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用   父类的方法.
    3.

  

    Son s1 = s;//s1指向那1.5M的内存.
    Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存//s1指向那1.5M的内存.
    Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存

    即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
   

Son s2 = (Son)f;//这句代码运行时会报ClassCastException.//这句代码运行时会报ClassCastException.

  因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.

Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.//这句可以通过运行,这时s3指向那1.5M的内存.

  由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

  所以可以实现强转…
    4.static   顾名思义,就是静态的,他是方法的,他属于这个类,由于是类的方法,他可以直接引用类名来引用方法,也可以通过类的对象来引用这个方法,他既不能被子类覆盖,也不能被子类继承。简单的说,他是在编译的时候就和类帮定在一起了,不能被运行时动态加载。

   对子类与父类的static问题
    ——没覆盖也没继承,子类存有指向父类的引用

    对于private
    ——该方法或属性只能在该类内使用

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • elasticsearch集群搭建对服务器硬件_elasticsearch集群搭建

    elasticsearch集群搭建对服务器硬件_elasticsearch集群搭建一、ElasticSearch集群1.1搭建集群Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群,三个Master节点最多只能故障一台Master节点,如果故障两个Master节点,Elasticsearch将无法组成集群.会报错,Kibana也无法启动,因为Kibana无法获取集群中的节点信息。由于,我们使用只有一台虚拟机,所以我们在虚拟机中安装三个ES实例,搭建伪集群,而ES启动比较耗内存,所以先设置虚拟机的内存3G和CPU个数4个

    2022年10月10日
    2
  • elk的搭建和使用_搭建云服务器教程

    elk的搭建和使用_搭建云服务器教程首先准备安装包传输到linux下找个目录存放安装elasticsearch-head作为web展示所以首先安装nodejs主要是利用npm1安装wgetyuminstall-ywget2.镜像淘宝下载node-v11wgethttps://npm.taobao.org/mirrors/node/v11.0.0/node-v11.0.0.tar.gz3.解压tar-…

    2022年10月21日
    2
  • Kafka集群配置[通俗易懂]

    Kafka集群配置[通俗易懂]之前一篇博文简单讲述了zookeeper和kafka的单机配置,详细可以参考《Linux(CentOS)中常用软件安装,使用及异常——Zookeeper,Kafka》。本文只要讲述Kafka集群的配置事项,包括zookeeper集群的配置。本文讲述的前提是kafka和zookeeper在单机情况下已正确安装和配置。如有疑问,可以参考《Linux(CentOS)中常用软件安装,使用及异常——Z…

    2022年4月25日
    32
  • 51单片机毕业设计题目_单片机毕业设计怎么做

    51单片机毕业设计题目_单片机毕业设计怎么做以下是学长亲手整理的C51单片机相关的毕业设计选题,都是经过学长精心审核的题目,适合作为毕设,难度不高,工作量达标,对毕设有任何疑问都可以问学长哦!相对容易工作量达标题目新颖,含创新点httpshttpshttpshttpshttpshttps。……

    2022年10月3日
    3
  • 2021 Java面试真题集锦

    2021 Java面试真题集锦目录…1大厂面试的基本流程 17字节跳动 17阿里 17腾讯 18网易游戏 18面试前需要准备: 18面试中可以借鉴的套路 19用简历争取到更多的面试机会 19自我介绍时,立即全面抛出技术栈和亮点 20先介绍项目背景,打消面试官疑问 21通过说项目管理工具,说明你不仅会写代码 22用SPRINGBOOT项目举例,说明你的技术基本面 23用实例说明你在内存调优方面的经验 24展示你在数据库调优方面的经验 25总结前文说辞 26准备项目说辞时,更可以准备后继面试官的问

    2022年7月8日
    52
  • vc6.0控件工具栏_mfc控件隐藏

    vc6.0控件工具栏_mfc控件隐藏DevExpressVCLControls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序DevExpressVCLv21.1.6最新版下载具体更新内容如下:此列表包括v21.1.6中已解决的所有问题。所有VCL产品T1035535–如果VCL设计器的DPI值不同于96,DevExpress在RADStud…

    2022年9月24日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号