java这道基础题为什么是这样的结果 谁能给讲讲?
厉害,一石激起千层浪,向你学习,够仔细的,看图!反编译后的class文件:注意看对比后的数据类型前后一致的哦!
原码图
明白图:
你看,int,float是不是都无法接受啊?唯有double可以接受,因为java默认小数类型就是double类型!
应了那句话,当你想比对两个数字的时候,首先要做的就是,统一数据类型!
So:现在可以肯定的说,确实是类型提升的原因!
还是20和30。函数是把n1 和n2的值穿给形参,交换的结果在swap函数内部。n1,n2本身没有改变
这道题很好,也相当基础而且很绕人。
1,首先先说一下父类与子类方法覆写(overrider)相关的概念,覆写在java中主要是通过方法表来完成,java中每个类型(Class)中都存在一个方法表,其中存放java类型的实例方法(public/protected),static方法属于静态方法,和类型相关,不属于javad实例方法。private和default属于私有方法,private/default修饰的方法不进入类型的方法表。
2,接下来说一下<clinit>和<init>方法,其中<clinit>称为类初始化方法,<init>称为对象实例化方法,该问题就与<init>方法息息相关。
<clinit>方法:
Java在进行对象创建时首先进行类型加载,如果Class类型存在父类型,则需要先加载父类完成以后再加载子类型。并且对static变量进行初始化操作,对static变量或者static代码块初始化的逻辑就封装在<clinit>方法中。
Java类型初始化过程中对static变量的初始化操作依赖与对static变量的赋值语句的前后关系,static语句块与static变量声明存在位置关系,java编译器与static变量的赋值位置有关。
<init>方法:
Java对象在进行实例化时,首先会进行父类的实例化操作,然后再进行子类的实例化操作。该部分操作封装在<init>方法中,并且子类的<init>方法中会首先对父类<init>方法的调用。
Java对象实例化过程中对实例域的初始化赋值操作全部在<init>方法中进行,<init>方法显式的调用父类的<init>方法,实例域的声明语句以及实例初始化语句块存在位置关系,<init>方法以构造方法作为结束。
--------------------------------------------------------------------------------------------------------------------
接下来回到这道题上来,启动java虚拟机:
第一步:加载应用用到的类,加载顺序为Base-->Dervied,这里涉及到<clinit>方法的调用,但是当前类型中没有static域或者是static{},所以<clinit>方法不再讨论。
第二步:对象实例化操作,首先我们new Dervied();,这样就触发对Dervied.<init>的调用,但是根据以上知识(“并且子类的<init>方法中会首先对父类<init>方法的调用”)我们可以知道,Dervied.<init>首先会调用到Base.<init>方法,所以现在我们调用的方法是Base.<init>,Base.<init>方法中,首先是对name域(父类Base)进行初始化,然后调用tellName()方法,因为子类以及覆写了tellName()方法,所以tellName方法实际调用为Dervied.tellName()方法,tellName方法要打印name域(子类Dervied)的值,但是当前Dervied对象中的name域还没有被初始化,所以打印出来的值为null。printName()方法执行与tellName()方法一致。
第三步:Base.<init>方法返回到Dervied.<init>方法中,紧接着对name域(子类Dervied)进行初始化操作,然后调用子类Dervied的tellName方法和printName方法,name域(子类Dervied)已经初始化完成,所以能正确打印出来。
--------------------------------------------------------------------------------------------------------------------
当前图片为父类<init>()方法的执行!其中name域(Dervied类)未初始化;
当前图片为子类<init>()方法的执行!其中name域(Dervied类)已初始化;
PS:另外当前问题也涉及到java对象的内存布局,其中Dervied对象还有两个name域,其中一个是从父类继承过来的,一个是自己类型私有的。
创建子类对象时,若未显式调用父类构造函数,系统隐式调用super()方法,这时候new Drived(),会跳转到Base();然后初始化name属性为base,接着调用tellName()方法,此时调用的对象(this)为Drived对象!所以又直接跳转到Drived类执行tellName方法,此时Drived类的name属性尚未赋值,所以输出Dervied tell name: null接下来同理输出Dervied print name: null,然后执行Drived类的构造方法,初始化name属性为drived,所以输出Dervied tell name: dervied和Dervied print name: dervied。
关键在于弄清楚调用方法的对象是谁!
new Drived()会跳转到Base(),但是此时this为Drived对象!
public Base() {
tellName();//相当于this.tellName()
printName();//相当于this.tellName()
}
public Dervied() {
tellName();//相当于this.tellName()
printName();//相当于this.tellName()
}
执行main方法时,执行Derived类的实例化方法也就是无参构造器方法。因为Derived继承与Base,所以在执行构造器是隐藏执行父类的无参构造器,执行Base类无参构造器中的tellName和printName方法,因为这两个方法被Derived重写了,所以执行Derived类中的tellName和printName方法,但此时name属性还没被初始化,所以输出的是null,下面两行输出的就是Derived类本身的方法,此时name属性被初始化,所以得到了你的答案
问题出在构造函数的地方,对于java中的extends,每个子类构造方法的第一条语句都是隐含的调用super,而且如果父类没有这种形式的构造函数就会报错。
你可以如下修改进行调试
public Dervied() {
tellName();
System.out.println("a");
printName();
}
public Base() {
tellName();
System.out.pritnln("b");
printName();
}
运行的结果将会是
Dervied tell name: null
b
Dervied print name: null
Dervied tell name: dervied
a
Dervied print name: dervied
Dervied extends Base 继承
Dervied复写两个方法 所以印出来的都一样!!
Dervied.class
Base.class
两个方法是一样的所以内容被复写了!!!
这样你知道了吗???
计算机二级Java题都是从哪里来的
有题库的。根据《全国计算机等级考试二级Java语言程序设计考试大纲(2018年版) 》,计算机二级ava考试主要考Java 语言的特点和实现机制、Java 体系结构、Java 语言中面向对象的特性、Java 语言的基本数据类型和运算、Java 语言的基本语句。Java 编程基本技术、编写用户界面程序基础、编写小应用程序(Applet)基础...
AVA的3个小问题
第1.P90TR是侦察兵用枪.也就是冲锋枪.难道你侦察兵还想跟人对枪?侦查就是利用移动速度进行突袭.只要能掌握好时机.和有良好的意识.近距离一阵乱扫即OK.所以加瞄准镜也没用.又不蹲点.第2.HK416是把水枪.老鸟们都知道.子弹打出去是飘的.而且爆头率低.3个字.垃圾枪.第3.SV98.威力比DSR大.射...
AVA武器问题
以tpg-1为例,稍微的移动就会造成准确的急速下降,这也正是tpg-1需要静走射击的原因 以sr25为例,按照《教你在ava里如何改枪》中的改法,移动中准确丧失是2格,这样的sr25就很适合晃动中射击 以m24为例,原装的准确丧失是2格,这也就是很多人觉得m24移动中也很容易headshot的原因 以vss为例,改...
这题Va.Vb为什么等于2而不是等于3呀
把棱锥三个面展开平铺在一个平面上(相当于沿着VA这个棱剪开),A点变成2个,A和A',在VB,VC上的两个点EF依次连接即AE、EF、FA'就是三角形的3个边。最小值就是AA‘的直线。 VA=VA’=2√3 , ∠AVA'=40×3 = 120° 所以,1\/2 AA' = 2√3 × √3 \/ 2 ∴ AA‘ = 6 最小...
AVA枪法问题
继续被虐···勇往直前!一路杀过去到按包点。或者一路杀到土匪家!久了···相信你因该能找回感觉
AVA兵种问题
步兵来说,作为《战地之王》中使用最广的兵种,做为团队中坚力量,其特性决定了其在游戏中地位也相对比另外两个兵种要重,并非因为步兵的选用玩家多地位就重。而是因为武器的特性使然,突击步枪远、近、中距离皆可适用。这些更是为步兵打下了良好的基础。Sniper(狙击手)特点:在超远距离中的攻击非常...
AVA的问题
可以,魔兽世界的要求比AVA高点
AVA的问题,关于新出的几把枪,高手快来……
狙击,连狙:SR25(在跳越状态还能保持命中率,移动连狙首选!),99SR(高射速,残疾人终结者),AWM(…不解释,BT枪…),FRF2(胜在轻快的手感),DSR1(多样化的改装,唯一能单开镜的狙,是除抽奖狙,AWM以外开镜最快的枪,却点是沉重不稳重TPG、AWM虽然沉但是稳),SV98(基础狙,...
关于AVA逃脱战的问题
第一关很简单的。要怕死的话,最好站在,飞机的两边,有铁丝网做防护,呵呵。 打逃脱,主要是配合。加油 对于你补充的问题,你的同伴,下的也太快了吧。要4人集合后,一起下,太急的话,当然要死。刷怪的问题,可能和系统有关系。原来我和同学玩的时候,他机器不好,我们明显感觉刷怪速度加快。。
茆山兆威: main方法里的 创建一个 str引用变量 指向了常量池的一块内存 hello 然后调用方法,s(String str)表示在栈区的创建一个引用变量str ,str指向一块内存 "你好" 两者互不影响,所以输出不变
杂多县15312128466: java中,这道题的输出结果是什么?为什么? - ?
茆山兆威: 输出为 FatherClass Create//初始化fc,调用FatherClass构造函数输出 ChildClass Create//初始化cc,调用ChildClass 构造函数输出 然后,在同一个包下面,公共类可以不需要引入
杂多县15312128466: 这个java题为什么是这个答案? - ?
茆山兆威: 因为注释的是个全局方法,它覆盖了class A中的method方法.// void method(long f)System.out.println("long:"+f); // } 所以在调...
杂多县15312128466: 谁能帮我解释一下这道java基础题,为什么最后输出的是Tom - ?
茆山兆威: 12345678910 构造函数 public Test(Stringname) { name=name; }里面的内容name=name;属于自己传递给自己,形参传递给形参 没有影响到外部的name变量,如果要引用外部的name就是 this.name=name; 所以输出的任然是Tom,并不是Jack
杂多县15312128466: 这个java编程题为什么会等于11?想不明白,求人给注释下.. - ?
茆山兆威: 最后i=i+1;走完时i=10,之后i++就是11了for里面三个参数:循环初始赋值循环条件循环后的操作需要经过第三个参数后再进入循环
杂多县15312128466: JAVA题 这题为什么前面是TRUE后面是FALSE~~求指教~ - ?
茆山兆威: 首先它们一个是基本数据类型一个是引用数据类型.“==”比较的是对象指向的数据地址.其次,先有Integer y = x;而之后x++;所以此时x=401,对于基本数据类型来说就相当于开辟了一个内存为401的空间来进行存储;sb1 == sb2这两个对象其实比较的是其指向的内存地址是否一样.如果你把它改为sb1.equals(sb2) 那么就是false,这是引用类型的特点,这时它们在内存的地址因为StringBuilder sb2 = sb1;所以其指向保持了一致,所以你用“==”来比较时就会是true,而如果用equals来比较内容时就成了false了
杂多县15312128466: java中这道题是这样的:随机输入一个姓名,然后拆分出名和姓再分别输出? 谢谢指导 - ?
茆山兆威: 代码如下:import java.util.Scanner; public class Welcome { /** * @param args */ public static void main(String[] args) { Scanner sin = new Scanner(System.in); System.out.println("请输入姓名:"); String s = sin.next(); char ch[]= s.toCharArray(); System.out.print("您的姓为:"+ch[0]+"\n您的名为:"+ch[1]); } } LZ平时多练点吧,这个其实还是挺简单的.满意请采纳,谢谢!
杂多县15312128466: java基础题,要说明原因啊 - ?
茆山兆威: C和E错的,其他都正确.true/false 是boolean 类型 不能和int 类型转换(隐式、显式都不行).1 byte = 8 bit.也就是支持8位二进制数,其中一个是符号位,计算机中采用补码来表示,所以支持-128 ~ 127.其他都是正确的,只要在对应的二进制表示范围即可.
杂多县15312128466: 这道Java题是什么意思~ - ?
茆山兆威: 定义了四个数组,第一个是一维的,后面那三个是二维的,问如果每一个数组都被初始化了,哪一种会出现编译的错误..已经很明显了啊,二维和一维的肯定不能相互赋值啊..选A...
杂多县15312128466: JAVA这题为什么是1、5 - ?
茆山兆威: 你这个题目,不管是JAVA还是C或者C++啥的,都一样.1、先说i.“i++” 后i=2;"--i"后i=1;这个毫无疑问.2、再说j.j=i++*2+3*--i,我们一步步来拆分.①、j=i++,是先赋值,在++,也就是j先等于1,i再++等于2.②、j=第①步结果*2,也就是j=2.③、先计算3*--i ,--i代表先减一,再计算.i在第①步已经是2了,先减一等于1,再乘三=3;④、第②步+第③步,即2+3 = 5;