java的代码是汇编语言吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的代码是汇编语言吗?相关的知识,希望对你有一定的参考价值。

汇编是除了机器语言外的最底层的语言,java是面向对象的语言,是属于最高级的语言之一了,与汇编语言差的太多。完全不是同一个东西,连相似的地方都几乎没有。
至于java的底层是用什么实现的就不好说了,估计java 的底层应该也是使用的与汇编相似的语言写的,那么多复杂的类应该会有一种比较高效的机制来处理。
参考技术A Java 源代码经过编译后会变成 .class 文件,里面保存的是字节码(bytecode),这些字节码对于 JVM 相当于汇编对于普通 CPU ,但字节码并不是汇编。 参考技术B 不, 但编译过的java 代码 可以算是半个汇编语言 参考技术C 是的!

java语言中成员方法可以初始化成员变量吗?

如题,我在这个代码中产生 了困惑,
private float credit;



。(中间省略代码)


public void setCredit(float credit)
this.credit=credit;

我并没有在构造方法中对“credit”进行初始化,只是在main函数中直接调用了setCredit(参数)这个成员方法,请问这是成员方法对成员变量的初始化吗?

不能

一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1) 先按照静态成员变量的定义顺序在类内部声明成员变量。
2) 再按照原java类中对成员变量的初始化顺序进行初始化。
一个java类和编译后的class对应的转换如下:
源文件:

public class Person
  public static String name="张三";
  public static int age;
  static
age=20;
    System.out.println("初始化age");
  
  public static String address;
  static
    address="北京市";
    age=34;
  
  public static void main(String[] args)
System.out.println(name);
System.out.println(age);
System.out.println(address);



当java源代码转换成一个class文件后,其转换成类似下面的代码:

public class Person
  public static String name;
  public static int age;
  public static String address;
  static
    name="张三";
    age=20;
    System.out.println("初始化age");
    address="北京市";
    age=34;
  
  public static void main(String[] args)
System.out.println(name);
System.out.println(age);
System.out.println(address);



初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。

二、对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:

1 public class Person
2   
3     name="李四";
4     age=56;
5     System.out.println("初始化age");
6     address="上海";
7   
8   public String name="张三";
9   public int age=29;
10   public String address="北京市";
11   public Person()
12     name="赵六";
13     age=23;
14     address="上海市";
15   
16

编译器转换成class文件后,会转换成类似下面的代码:

1 public class Person
2   public String name;
3   public int age;
4   public String address;
5   public Person()
6     name="李四";
7     age=56;
8     System.out.println("初始化age");
9     address="上海";
10     name="张三";
11     age=29;
12     address="北京市";
13     name="赵六";
14     age=23;
15     address="上海市";
16   
17

可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
参考技术A 不是,那是赋值,初始化工作应该在构造函数里完成,为了程序安全都应该进行初始化,但我个人不是很理解程序安全是啥,我的理解是初始化是用来防止成员变量还没有赋值就被拿来运算等错误调用 参考技术B 错误
java里面成员变量,凡是基本数据类型,int float, double之类的只要你定义了,默认都为0;
boolean类型默认为false,对象类型默认为null,

这个是在构造方法里面完成的初始化。初始化只有在虚拟机load这个class的时候完成,也就是只要你完成了new xxxx这个操作就完成了,后面的都是改变值

main里面调用setCredit(paramter)是重新赋值了已经。追问

public Student(String name,int id,String speciality)
this.name=name;
this.id=id;
this.speciality=speciality;

这是我的构造方法,并没有credit的初始化,为什么呢?

追答

credit这里构造的时候已经自动赋值0了,这个是JVM完成的,

本回答被提问者采纳

以上是关于java的代码是汇编语言吗?的主要内容,如果未能解决你的问题,请参考以下文章

用java语言开发的软件并进行销售,算侵权吗?为啥?

pycharm能编译java语言吗

go语言完虐java,为什么学go语言你真的清楚吗?

JAVA能写游戏吗?

关于JAVA语言,和C语言有啥联系吗?

java语言中成员方法可以初始化成员变量吗?