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命名规范;的主要内容,如果未能解决你的问题,请参考以下文章