[Java问题] 继承方法调用问题

  由于用java的时间不长,一上来就让我把一个软件从matlab移到java中,所以不断出现了很多问题,解决这些问题最快的方法就是写一些小代码调试和上网问度娘,另一个方法是问师兄,但是跟他们描述一个问题的时候比我上网搜发的时候还多,另外他们也未必知道答案,所以第二个方法我很少用,这也是我写这篇文章的原因,把问题写下来,慢慢思考,随着java技术的增进,说不定会解决,即使不能解决,下一次编程的时候,我也知道这样编写代码是不能达到我的要求的,要换一中方法。

  说了这么多,来说我遇到的继承方法调用的问题吧,来看一个例子:

  文件1名称:First.java

public class First
{
   private double a =10;
   private double b =20;
 
 public First()
 {
  
 }
 
 public First(double a,double b)
 {
    this.a =a ;
    this.b =b;
 }
 
 public double getA()
 {
    return a;
 }
 
 public double getB()
 {
    return b;
 }
 
}

  

  文件2名称:Second.java

public class Second extends First
{
   private double a;
   private double b;
   First first ;
 
 public Second (First first)
 {
    this.first = first;
    a = first.getA();
    b  = first.getB();
 }

}

  文件3名称:test.java(主函数所在的文件)

public class test

 public static void main(String [] args)
 {
    First firstMain = new First(30,40);
    Second SecondMain = new Second(firstMain);
    double testa = SecondMain.getA();
    double testb = SecondMain.getB();
    System.out.println(testa);
    System.out.println(testb);
 }

}

主函数用Debug调试截图:

   

    

输出结果是:10 ,20.很显然这并不是我想要的答案,我要的答案是30 ,40.

对文档1中的方法在文档2中重写,就可以得到我想要的答案.具体如下:

  在文档2中添加getA()和getB()方法,即重写(@Override)。

  对主函数调试结果如下:

   

  

对以上问题,换一个思路考虑,如果不采用继承,在文档2中在一次写getA()和getB()方法,即文档2的完整java程序如下:

public class Second       //此处与前面的文档2不一样,这里不再是extends继承关系
{
   private double a;
   private double b;
   First first ;
 
 public Second (First first)
 {
    this.first = first;
    a = first.getA();
    b  = first.getB();
 }
 
 
 public double getA()
 {
    return a;
 }

public double getB()
 {
    return b;
 }

}

其他文档程序不变,调试结果如下:

 

     

答案也是我想要的30、40.

  

  虽然这两种方法都可以达到我要的结果,但是使用extends可以节省重复输入代码,所以,如何使用继承关系达到我想要的结果,目前我没有办法解决。

P.S.

  比较有继承和无继承变量SecondMain时很容易就可以理解继承和无继承的区别:

  (再次把截图附在附上:如下)

     

           继承关系SecondMain变量截图                   无继承关系的SecondMain变量截图

时间: 2024-08-05 11:00:14

[Java问题] 继承方法调用问题的相关文章

深入理解Java虚拟机笔记---方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作.在Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法的调用过程变得相对复杂,需要在类加载期间甚至到运行期间才能确定目标方法的直接引用.

java虚拟机之方法调用(上)

前言 我们都知道,面象对象的几大特性:封装,继承,多态. 其实在面试过程中也是经常被问到这个问题的.那么问题来了,java虚拟机是如何实现多态的? 其实在java虚拟机中,说到多态的实现,就不得不说说方法调用了. 方法调用概念 方法调用并不等于方法执行,方法调用阶段唯一的任务是确定被调用方法的版本(其实就是调用哪一个方法).我们都知道,Class文件的编译过程中不包含c语言编译中的连接步骤,一切方法调用在Class文件里面都是符号引用,并不是java运行时的入口地址(这里也侧面印证了上一篇文章里

JAVA类的方法调用

一.类的分类: 1.普通类 2.抽象类(含有抽象方法的类) 3.静态类(不需要实例化,就可以使用的类) 二.方法的分类: 1.私有方法(只有类的内部才可以访问的方法) 2.保护方法(只有类的内部和该类的子类可以访问的方法) 3.共有方法(无论内部或外部均可访问的方法) 4.静态方法(可以不实例话对象,通过类名.方法就可以调用的方法) 5.抽象方法(只有方法的签名而没有实现的方法) 三.方法的调用: 1.普通类:实例化一个该类的对象,然后通过对像访问.例如: class A { public vo

Java RMI远程方法调用

参考: 利用java-RMI进行大文件传输 RMI远程方法调用的简单方法和实例 RMI是类似RPC的一种远程方法调用协议,比RPC类型的WebService更简单,也可以跨进程访问 先来创建一个model或者javaBean,注意,该类必须实现序列化Serializable  public class Person implements Serializable {     private int id;     private String name;     private int age;

只有在方法调用的时候才涉及到值传递的概念!

Java中进行方法调用的时候传递参数时,遵循值传递的原则:1)基本数据类型,传递的是数据的拷贝2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身 楼主的问题涉及到的内容太多,首先理解以下概念 形参:方法声明时的参数变量,用于接收调用方法时传过来的实参如:void f(int i){} 或 void f(String s){}实参:方法调用时实际传过去的内容,用于给形参赋值如:f(1) 或 f("abc") 变量按不同的数据类型分为2类:1)基本数据类型变量:4类8种基本类

java继承-子类调用父类的方法中包含子类重写的方法

# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } class Parent { protected boolean test() { throw new RuntimeException(); } protected void testParent() { if

Java学习笔记之RMI远程方法调用

RMI 应用通常有两个分开的程序组成,一个服务端程序和一个客户端程序.一个典型的服务端程序创建一些远程对象,使得对这些远程对象的引用可以被访问,等待客户端调用这些远程对象提供的方法.一个典型的客户端程序获取远程引用,指向一个或者多个服务端上的远程对象,然后调用这些远程对象所提供的方法.通常我们称这为分布式对象应用程序. 3.1 RMI的工作方式 分布式对象应用程序需要做的事情: l 查找(定位)远程对象. 应用程序可以使用各种不同的机制取得远程对象的引用.比如应用程序可以通过 RMI 提供的简单

Java 8 默认方法和多继承深入解析

以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implements)多个接口,但是接口中只有抽象方法,方法体是空的,没有具体的方法实现,不会有方法冲突的问题. 这些都是久远的说法了,自从今年Java 8发布后, 接口中也可以定义方法了(default method). 之所以打破以前的设计在接口中增加具体的方法, 是为了既有的成千上万的Java类库的类增加新的功能, 且不必对这些类重新进行设计. 比

RMI - Java远程方法调用

一.入门篇 Java RMI指的是远程方法调用(Remote Method Invocation). 它是一种机制, 能够让不同操作系统之间程序实现方法调用. 比如: 一台电脑上的Java程序可以通过RMI调用另一台电脑上的方法(EJB底层就是使用RMI). 二.RMI和webservice RMI是在TCP协议上传递可序列化的Java对象, 只能用在Java虚拟机上, 客户端和服务端必须都是Java. webservice是在http协议上传递xml文件, 它与语言和平台无关, 可以在异构系统