小编Him*_*wal的帖子

需要Java代码段输出说明

我的代码是:

class Foo {
  public int a=3;
  public void addFive() {
    a+=5;
    System.out.print("f ");
  }
}

class Bar extends Foo {
  public int a=8;
  public void addFive() {
    this.a += 5;
    System.out.print("b ");
  }
}

public class TestClass {
  public static void main(String[]args) {
    Foo f = new Bar();
    f.addFive();
    System.out.println(f.a);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

b 3
Run Code Online (Sandbox Code Playgroud)

请解释一下,为什么这个问题的输出是"b 3"而不是"b 13",因为该方法被覆盖了?

java polymorphism inheritance

17
推荐指数
3
解决办法
5032
查看次数

Java中32位和64位系统的对象大小差异

我遇到了一个面试问题:

class Test {
    int a ; 
    int b;
    char c;
}
Run Code Online (Sandbox Code Playgroud)

这个类的内存对象将采用多少以及实现时的原因:

a)32位计算机

b)64位计算机

我的答案是:

For 32-bit: 4+4+2+8 = 18 bytes
For 64-bit: 4+4+2+16 = 26 bytes
Run Code Online (Sandbox Code Playgroud)

由于分配了一些额外的内存,在32位系统中是8个字节,在64位系统中是16个字节,除了正常的对象大小.

你能否对这个陈述作出一些解释.

PS:我也想分享一个我从其他来源得到的答案(不能依赖,想要验证):

在32位pc对象占用比其数据成员定义的实际obj大小多8个字节.....并且在64位pc对象占用比其数据成员定义的实际对象大小多16个字节....现在问题出现了为什么会发生...其背后的原因据我所知是:::在32位pc中,前8个字节由JVM保留用于引用类定义,对齐,超类和子类的空间等.对于64位,它为这些保留16个字节.有一个公式用于计算对象在创建时需要多少堆空间,并计算为.......Shallow Heap Size = [对类定义的引用] +超类字段的空间+实例字段的空间+ [alignment]

你如何计算对象"本身"需要多少内存?显然有一个公式:

Shallow Heap Size = [对类定义的引用] +超类字段的空间+实例字段的空间+ [alignment]

似乎没有太大帮助,是吗?让我们尝试使用以下示例代码应用公式:

class X {
  int a;
  byte b;
  java.lang.Integer c = new java.lang.Integer();
}
class Y extends X {
  java.util.List d;
  java.util.Date e;
}
Run Code Online (Sandbox Code Playgroud)

现在,我们努力回答的问题是 - Y的实例需要多少浅堆大小?假设我们使用的是32位x86架构,让我们开始计算它:

作为一个起点 - Y是X的子类,因此它的大小包括来自超类的"东西".因此,在计算Y的大小之前,我们考虑计算X的浅尺寸.

跳到X上的计算,前8个字节用于引用其类定义.此引用始终存在于所有Java对象中,并由JVM用于定义以下状态的内存布局.它还有三个实例变量 - 一个int,一个Integer和一个byte.这些实例变量需要堆如下:

它应该是一个字节.内存中有1个字节.我们的32位架构中的int需要4个字节.对Integer的引用也需要4个字节.注意,在计算保留堆时,我们还应该考虑包含在Integer对象中的原语的大小,但是由于我们在这里计算浅堆,我们在计算中只使用4个字节的引用大小.那么 …

java memory jvm memory-management object

8
推荐指数
3
解决办法
5754
查看次数

在Java中查找大数的阶乘

我尝试使用for-loop和double数据类型以典型方式找到大数的阶乘,例如8785856.

但结果显示无穷大,可能是因为它超出了极限.

所以请指导我找到一个非常大的阶乘的方法.

我的代码:

class abc
{
    public static void main (String[]args)
    {
        double fact=1;
        for(int i=1;i<=8785856;i++)
        {
            fact=fact*i;
        }

        System.out.println(fact);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: -

Infinity
Run Code Online (Sandbox Code Playgroud)

我是Java的新手,但他已经学会了一些IO处理的概念.

java largenumber factorial

7
推荐指数
3
解决办法
3万
查看次数

为什么Java中的2个Integer类对象不能相等

我的代码是:

public class Box
{
  public static void main(String[] args)
  {
     Integer z = new Integer(43);
     z++;

     Integer h = new Integer(44);

     System.out.println("z == h -> " + (h == z ));
  }
}
Run Code Online (Sandbox Code Playgroud)

输出: -

z == h -> false
Run Code Online (Sandbox Code Playgroud)

当两个对象的值相等时,为什么输出为false?

有没有其他方法可以使对象相等?

java integer class object increment

6
推荐指数
2
解决办法
4101
查看次数

XSLT - 检查子字符串

我有两个XSLT变量,如下所示:

<xsl:variable name="staticBaseUrl" select="'https://www.hello.com/htapi/PrintApp.asmx/getGames?contentId=id_sudoku&uniqueId="123456"&pageformat=a4'" /> 

<xsl:variable name="dynamicUrl" select="'https://www.hello.com/htapi/PrintApp.asmx/getGames'" /> 
Run Code Online (Sandbox Code Playgroud)

如何检查第二个字符串(dynamicUrl)是否是第一个字符串(staticBaseUrl)的子字符串?

xslt substring

4
推荐指数
1
解决办法
2万
查看次数

算术异常:/ by零仅适用于Java中的整数

为什么在将数字除以零时有如此不同的答案:

我的代码:

class Test {
  public static void main(String[] args){

    int a = (int)(3/0.0F);
    System.out.println(a);

    System.out.println(3/0.0F);

    System.out.println(3/0);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2147483647
Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
Run Code Online (Sandbox Code Playgroud)

每当我将一个数字除以一个整数(byte,short,int,long)时,它就会抛出ArithmeticException,这与使用实数(float,double)完成时不同.为什么?

java floating-point integer casting exception

3
推荐指数
1
解决办法
1379
查看次数

字节类在java中的Generics中不起作用

我的代码是: -

class abc<T> {
    T a, b;
    abc(T p, T q) {
        a = p;
        b = q;
    }
    void disp() {
        System.out.println("\na = " + a);
        System.out.println("b = " + b);
        System.out.println("a/b is of class type : " + a.getClass().getName());
    }
}

class temp {
    public static void main(String...args) {
        abc<Integer> a1;
        a1 = new abc <Integer>(11, 22);
        abc<Byte> a2 = new abc <Byte>(50,5);
        a1.disp();
        a2.disp();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: -

temp.java:23: cannot find symbol
symbol  : constructor abc(int,int) …
Run Code Online (Sandbox Code Playgroud)

java

2
推荐指数
1
解决办法
106
查看次数

在C中使用宏时输出中的一些错误

我的代码是: -

#include<stdio.h>
#include<conio.h>

#define sq(x) x*x*x

  void main()
  {
    printf("Cube is : %d.",sq(6+5));
    getch();
  }
Run Code Online (Sandbox Code Playgroud)

输出是: -

Cube is : 71.
Run Code Online (Sandbox Code Playgroud)

现在请帮我解释为什么输出是71而不是1331 ......

先感谢您.

c

2
推荐指数
2
解决办法
124
查看次数

L值需要C中的错误

我的代码是:

#include<stdio.h>
int main() {
   int a=10, b;
   a >= 5 ? b=100 : b=200;
   printf("%d %d", a, b);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里出现了条件运算符行中的"Lvalue Required".

你能解释一下为什么吗?

顺便说一句,相同的程序完全适用于C++.

c c++ variables conditional-operator lvalue

2
推荐指数
1
解决办法
291
查看次数

在java中占用字符时出现一些逻辑错误

这是我的代码......

class info{
    public static void main (String[]args) throws IOException{
        char gen;

        while(true) {   //problem occurs with this while
            System.out.print("\nENTER YOUR GENDER (M/F) : ");
            gen=(char)System.in.read();

            if(gen=='M' || gen=='F' || gen=='m' || gen=='f'){
                break;
            }
        }

        System.out.println("\nGENDER = "+gen);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出......

ENTER YOUR GENDER (M/F) : h

ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) : m

GENDER = m
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解为什么这么多次要求性别.

java string-comparison

0
推荐指数
1
解决办法
112
查看次数

无法理解在java中使用split

我的代码是: -

class SplitString {
    public static void main(String[] args) {
        Pattern p;
        String test = "a1b2c3";
        String[] token1 = test.split("\\d");
        System.out.println("first case : " + token1.length);

        for (String s : token1)
            System.out.print(s + " ");

        String[] token2 = test.split("\\b");
        System.out.println("\n\nsecond case : " + token2.length);

        for (String s : token2)
            System.out.print(s + " ");

        String[] token3 = test.split("\\a");
        System.out.println("\n\nthird case : " + token3.length);

        for (String s : token3)
            System.out.print(s + " ");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: -

first case …
Run Code Online (Sandbox Code Playgroud)

java

0
推荐指数
1
解决办法
2656
查看次数

错误:在Java中开始结果集之前

我知道这是一个愚蠢的问题,但我仍然需要这样做.这是java应用程序中的基本程序,我想同时使用3个查询来打印表.

(在这种情况下,我没有使用任何主键,所以请帮助我解决这个问题,而不要将我的属性作为主键 - 我知道这不是一个好习惯,但现在我需要完成它.)

我的代码:

    Connection con = null;        
    Statement stat1 = null, stat2 = null, stat3 = null;
    ResultSet rs1, rs2, rs3;
    stat1 = con.createStatement();
    stat2 = con.createStatement();
    stat3 = con.createStatement();

    String str = "\nProduct\tC.P\tS.P.\tStock\tExpenditure\tSales";
    info.setText(str);

    String s1 = "SELECT type, cp, sp, stock FROM ts_items GROUP BY type ORDER BY type";
    String s2 = "SELECT expenditure FROM ts_expenditure GROUP BY type ORDER BY type";
    String s3 = "SELECT sales FROM ts_sales GROUP BY type ORDER BY type";
    rs1 …
Run Code Online (Sandbox Code Playgroud)

java mysql database jdbc resultset

0
推荐指数
1
解决办法
931
查看次数

如何在android中使用double获得精确位的答案

我已经在android上制作了一个计算器应用程序,但每当我做一些这样的乘法:

23.3 x 3.3
Run Code Online (Sandbox Code Playgroud)

我得到的答案是这样的:

76.988999999999
Run Code Online (Sandbox Code Playgroud)

现在请告诉我如何使用此应用程序解决此冲突.答案应该是这样的

76.89
Run Code Online (Sandbox Code Playgroud)

java double android floating-accuracy floating-point-precision

-5
推荐指数
1
解决办法
104
查看次数