JAVA笔记---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;

Posted 猿头猿脑的王狗蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA笔记---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;相关的知识,希望对你有一定的参考价值。

Java命名规范:

1.包:全部字母小写;

2.类+接口:所有单词的首字母大写;

3.变量+方法:第一个单词的首字母小写,其余单词首字母大写;

3.常量名:所有字母均大写,且用下划线” _ “连接多个单词;

JVM内存:

1.栈内存:为所有方法运行时分配内存,为局部变量分配内存;

2.堆内存:为对象级别的类,实例变量分配内存;

3.方法区内存:为”.class“字节码,静态变量,静态方法分配内存;

注意:对于栈内存:先分配内存(压栈)的栈底元素后释放内存(弹栈);

                                 后压栈的栈顶元素先弹栈;

内存图:

变量:

1.变量分为成员变量和局部变量;

2.成员变量定义在类内,方法外;成员变量又分为实例变量和静态变量;成员变量在整个类里都可以使用;实例变量储存在堆内存中,静态变量储存在方法区内存中;成员变量都有默认初始化值,所以即使没有初始化,也不会报错;成员变量可以被访问权限修饰符修饰;

3.局部变量定义在方法内;局部变量只能在定义它的方法里用;局部变量储存在栈内存当中,运行阶段结束,占用空间会自动释放;局部变量必须初始化,否则报错;局部变量不能被访问权限修饰符修饰;

强制类型转换:

1.概念:计算机会在运算俩个不同数据类型的数据时,会先把范围小的数据类型转换为数据大的数据类型,再进行运算;一个数据类型赋值给另一个数据类型的变量也是同理,计算机会先把范围小的数据类型转换为范围大的数据类型,再进行赋值;

2.1那么范围大的数据类型赋值给范围小的数据类型呢?正常情况下,编译器都会报错来提醒咱们的,那如果咱就是想要这个效果呢?那么就需要手动进行强制数据类型转换了:

格式1: int a =0;a= (int) 11.3 ; //这样11.3就会变成11,然后再赋值给 a ;格式2:int a = 0 ;  a+=11.3 ; //同样效果;

注意:short,byte,char之间进行运算不会互相转换,最终都会转换为 int 类型;

转义字符” / “:

1. \\n    换行;System.out.print("\\n") ; 等价于 System.out,println ; 

2. \\r     制表符;使输出的一堆数据间有间隔,更整齐;

3. \\\\     输出“ \\ ” ;    \\\'    输出 “ ‘ ”  ;\\"      输出  " " " ; 

方法重载条件:

1.同一个类中;

2.方法名相同;

3.参数列表不同:参数个数不同/参数类型不同/参数顺序不同;

  注意:“不同”针对的对象都是数据类型,而非变量名,eg: public void tool(int a, int b) { }  和 public void tool(int b, int a) { }  就不能构成方法重载;

随笔:

1.给 long 类型的变量赋值时,需要在数值后加” l “,eg:long num=100l;

  给 float 类型的变量赋值时,需要在数值后加” f “,eg:float num=100f;

2.浮点数类型的数据在内存中存放的都是由误差的数据,所以不要比较俩个浮点数是否相等;

3.如何使用输入方法:

  import java.util.* ; //在源文件的最上方,类外,导包

  Scanner s=new Scanner(System.in);  //创建对象,一个方法里创建一次即可

  int a=s.nextInt( );  //整数 类型输入

  double b=s.nextDouble( );  //浮点数 类型输入

  String   c=s.nextLine( );    //字符串 类型输入


博主能力有限,文章若有错误或不当之处,请狠狠打脸博主         (~ ̄(OO) ̄)ブ

JVM笔记2-Java虚拟机内存管理简介

java虚拟机内存管理图如下图所示:

1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成:

  1.方法区:

        1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据。

        2.垃圾回收器也会光顾这个区域,例如常量池。

        3.HotSpot中用方法区来实现永久代。这样的做的好处就是,垃圾回收器可以像管理java堆一样管理这部分内存,省去了为方法区编写内存管理的工作,注意的是这

        仅仅限于HotSpot中,其他的虚拟机并没有永久代这个概念,虚拟机规范中,永久代不等于方法区,而且没有进行详细的规范说明。用方法区实现永久代并不是一个很好的途径

        HotSpot在JDK1.7中进行的改进。

 

  2.java堆:

        1.存储对象实例,可以人作为所有对象的实例存储在这里,涉及编译优化和虚拟机优化的时候有些对象实例并不存储在这里。

        2.垃圾收集器管理的主要区域。

        3.长时间存活的对象实例会被放入老年代去,不长期存活的会在新生代中。

        4.当对空间申请完后会抛出OutOfMemory的内存溢出异常。

  

2.线程独占区,是每一个线程都有自己独立的虚拟机栈,本地方法栈,程序计数器。

  1.虚拟机栈:存储方法运行时所需的数据,成为栈帧。

    1.虚拟机栈描述的是java方法执行的动态内存模型。

    2.栈帧:每个方法的执行都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态连接,方法出口等。

    3.局部变量表:

      1.存放编译期可知的各种变量类型,引用类型,returnAddress类型。

      2.局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,方法运行期间不会改变局部变量表的大小。

    4.大小:虚拟机栈的空间是有限的。举个例子。如下面代码:

      

      如果运行将这段代码就会爆出如下的错误:

      

      原因也很简单,因为递归无限调用,每一个方法对应一个栈帧,虚拟机栈中放满了栈帧,因此,就会爆出了StackOverflowError,即栈溢出异常。

      假如虚拟机栈很大,又会出现什么问题呢?显然抛出OutOfMemory异常,因为如果虚拟机栈很大的话,每一个方法对应一个栈帧,疯狂申请内存。这样内存迟早会用完,因此会出现

      内存溢出的异常。因此虚拟机栈有一定的大小。

 

  2.本地方法栈:为JVM所调用到的native即本地方法服务。与虚拟机栈相似。栈帧,局部变量表,大小都接近一样。唯一不同的是:

      1.虚拟机栈为虚拟机执行java方法服务。

      2.本地方法栈为虚拟机执行native服务。

 

  3.程序计数器:记录当前线程所执行到的字节码的行号。

    1.程序计数器是一块较小的内存空间,它可以看作是当前线程所执行行的字节码的行号指示器。

    2.程序计数器处于线程独占区,这也很好理解,如果所有的线程都共用一个程序计数器,那么程序将会乱套。

    3.如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是 native方法,这个计数器的值为undefined

    4.此区域是唯一 一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。这也很好理解我们在程序中并没有对计数器的操作,计数器是虚拟机中实现的,与我们开发者无关。

以上是关于JAVA笔记---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;的主要内容,如果未能解决你的问题,请参考以下文章

java内存区域——深入理解JVM读书笔记

Java笔记(Java中的5个内存空间数组的定义格式方法重载)

从jvm角度看懂类初始化方法重载重写

Java连载29-方法执行内存分析方法重载

一次 JVM 调优的笔记

深入理解 Java 虚拟机之学习笔记