Java语言:

  JDK(Java Development Kit)开发工具包,提供Java的开发环境和运行环境 --> 适合于开发

  JRE(Java Runtime Environment)Java运行时环境,包含Java虚拟机(JVM) --> 适合于运行

  Java代码在JDK下编译,会生成.class文件,再使用JVM运行.class文件(字节码文件)

Java基础语法:

  • (1) 命名规范:

    • 1. 类和接口:用若干名词或词组组成,首字母均大写。如 JHelloWorld。
    • 2. 方法名:动词或名词词组组成,首字母小写,其余单词首字母大写。如 setAge()。
    • 3. 常量名:全部使用大写,并用下划线分隔单词。如 HIGH_NAME。
    • 4. 变量名:名词或词组,首字母小写,其余大写,如 authorName。
    • 标识符:首字母必须是字母、下划线或者美元符号,可以由字母,数字,下划线与美元符号组成,不能有空格。
  • (2) 基本数据类型:
    • 1. 布尔型:    boolean          (1字节)
    • 2. 字符型:    char               (2字节)
    • 3. 整型:     byte, short, int, long     (1字节,2字节,4字节,8字节)
    • 4. 浮点型     float, double        (4字节,8字节)
    • 数据类型强弱关系: byte < char(short) < int < long < float < double
    • 弱类型可以自动转换为强类型,但是强类型不能隐式转换成弱类型,只能使用强制转换。
  • (3) JVM的内存空间:
    • 1. 寄存器 (Registers):最快的保存区域,位于处理器内部,由编译器分配。主要作用是记录当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变当前线程的程序计数器选取下一条字节码指令来工作。任何分支、循环、方法调用、判断、异常处理、线程等待以及恢复线程、递归等都是通过这个计数器来完成。为了多线程的实现,每条线程都会有独立的程序计数器来记录当前指令的行号,以使得线程等待结束后能恢复到正确的位置执行。这块内存也被称为"线程私有"的内存。如果调用的方法是native的,则寄存器不存储任何信息。
    • 2. 栈 (Stack):JVM的栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的是当前线程中局部基本类型的变量(八种)、部分的返回结果以及Stack Frame,非基本类型的对象(引用类型)在JVM栈上只存放一个指向堆内存的地址,因此Java中的基本类型变量采用值传递,而引用类型对象采用引用传递。由于栈是线程私有的,因此内存分配上非常高效,且当线程运行完毕后,这些内存也就被自动回收了。当栈请求深度大于允许的深度时,会抛出StackOverflowError的错误,可以通过-Xss来指定站的大小。而如果内存不足时,会抛出OutOfMemoryError错误。
    • 3. 堆 (Heap):用来存储对象实例以及数组值,所有通过new创建的对象内存都在这里分配。堆中的对象内存需要等待GC(垃圾回收机制)进行回收,堆内存在32位操作系统上最大为2G,在64位操作系统上则没有限制,其大小通过-Xms(启动最小堆内存,默认物理内存的1/64,小于1G)和-Xmx(启动最大堆内存,默认物理内存的1/4)来控制。默认当空余堆内存小于40%时,JVM会增大堆的大小到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio来指定这个比例。当空余堆内存大于70%时,JVM会将堆内存的大小往-Xms指定的大小调整,可通过-XX:MaxHeapFreeRatio=来指定这个比例,但对于运行系统而言,为了避免频繁的改变堆内存的大小,通常都会将-Xms和-Xmx的值设置成一样。当堆中需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
    • 4. 方法区域(MethodArea):在Java虚拟机规范中,方法区被描述为堆的一个逻辑部分,但一般与堆区分开。存放了加载的类信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,可见方法区域的重要性。同样,方法区域也是全局共享的,它在虚拟机启动时在一定的条件下也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小。
    • 5. 运行时常量池(RuntimeConstant Pool):是方法区的一部分。类似C中的符号表,存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。类或接口的常量池在该类的class文件被java虚拟机成功装载时分配。
    • 6. 本地方法堆栈(NativeMethod Stacks):与上述栈的作用非常相似,上述的栈主要为虚拟机执行Java方法(字节码文件)服务,而本地方法堆栈则是为Native方法服务。本地方法堆栈也会抛出StackOverflowError和OutOfMemoryError错误。
    • 例如有这么一段代码:
public class A {
public static void main(String[]args){
String a="a";
String b="b";
String ab="ab";
System.out.println((a+b)==ab);   // false
System.out.println(("a"+"b")==ab);   // true final String afinal="a";
String result=afinal+"b";
System.out.println(result==ab);   // true String plus=a+"b";
System.out.println(plus==ab);   // false
System.out.println(plus.intern()==ab); // true
}
}
    • 分析下上面代码执行的结果,可通过javap –verbose A来辅助理解分析。

      • (a+b)==ab
    • a+b是两个变量相加,需要到运行时才能确定其值,到运行时后JVM会为两者相加后产生一个新的对象,因此a+b==ab的结果为false。
      • ("a"+"b")==ab
    • "a"+”b”是常量,在编译时JVM已经将其变为"ab"字符串了,而ab="ab"也是常量,这两者在常量池即为同一地址,因此("a"+"b")==ab为true。
      • result==ab
    • result=afinal+"b",afinal是个final的变量, result在编译时也已经被转变为了"ab",和"ab"在常量池中同样为同一地址,因此result==ab为true。
      • plus=ab
    • plus和a+b的情况是相同的,因此plus==ab为false。这里的不同点在于调用了plus.intern()方法,这个方法的作用是获取plus指向的常量池地址,因此plus.intern()==ab为true。
      • plus.intern()==ab
    • 这里注意一点,通常的JVM垃圾回收指的是堆内存和代码区域的回收,其他区域的回收都由JVM简单的按生命周期来进行管理。
  • (4) 变量分配机制:若变量为基本数据类型,则会在栈中开辟相应大小的空间,用于存放该数据;若变量为引用类型数据,则会在栈内存中生成相应的引用值(地址),即对象的实际地址的编制,再在堆内存中生成该对象的相应空间和数据。
    • 如:
MyDate date;  
date = new MyDate(8,8,2008)
    • 首先在栈内存中分配了一个32位的对象空间(没有实例化,不能被使用),然后实例化了一个对象,此时生成了对象的哈希码(地址),并将这个值赋值给date。这样,栈内存中就有了相应的哈希码,而堆内存中也生成了相应的空间。 
  • (5) 输入参数的方式:
    • 1. 使用main方法的String[] args参数,可以在编译时加入。
    • 2. main方法内定义参数常量。
    • 3. 使用JOptionalPane类弹框输入。(界面输入)
    • 4. 使用输入流进行输入。(System.in.read()方法或BufferedReader对象)。
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader buf = new BufferedReader(in);
//String s = buf.readLine(); --> 读一行
while(!"".equals(s)){
  ...;
  s = buf.readLine();
}
    • 5. 使用Scanner类输入。
Scanner s = new Scanner(System.in);
String str = s.nextLine();
  • (6) 形参与实参:基本数据类型使用值传递;若为引用类型,则是地址传递,即建立了同一空间的引用。
  • (7) this指针:解决了方法内部形参与成员之间命名冲突的同名隐藏问题,并可以调用内部的构造函数。
  • (8) static关键字:
    • 1. 类方法:

      • 1) 类方法只能访问方法体内的局部变量、参数和静态变量。
      • 2) 不能出现this和super,因为不存在唯一的对象。
      • 3) 若想使用非静态方法,一定要生成局部的类对象,再对象.方法来调用。
    • 2. static初始化块:无法人为调用,只在其所在的类被载入JVM内存时才会自动执行一次(仅执行一次)。
    • 3. 非static初始化块:在对象创建时,构造方法执行之前会调用一次(视对象的声明而定)。
    • 4. 静态导入:只导入程序包中的static变量和方法。
import static 包名.类名.静态属性|静态方法|*
  • (9) final关键字:

    • 1. 用final修饰的类时,表示最终类,即不能被继承的类。
    • 2. 用final修饰的方法时,表示该方法不能被其所在的类的子类覆盖。
    • 3. final修饰方法的参数时,表示该方法不希望被传进来的参数在方法内被改变。

Java基础 —— 概述的更多相关文章

  1. java基础概述

    写代码: 1,明确需求. 2,分析思路. 3,确定步骤. 4,代码实现. Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用 ...

  2. Java基础——概述

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. java基础总结——概述

      一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web ...

  4. 黑马程序员——【Java基础】——Java概述

    ---------- android培训.java培训.期待与您交流! ---------- 一.Java语言概述及三大技术架构 1.Java语言概述 Java是SUN公司于1995年推出的一种面向I ...

  5. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

  6. Java基础(Java概述、环境变量、注释、关键字、标识符、常量)

    第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...

  7. java基础(1):java概述、jdk的安装、环境变量的配置、helloworld案例

    1. Java开发环境搭建 1.1 java概述 众所周知Java是一门编程语言,编程语言就是用来编写软件的.那么使用Java到底能用来编写什么软件呢?你所熟知的很多软件都可以用Java来编写,例如: ...

  8. Java基础系列7——集合系列(1)框架概述

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...

  9. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

随机推荐

  1. 《大道至简-Team》

    已经学习了<大道至简>两章,我们了解了编程的本质和“懒人”造就了方法.书中没有提供给我们编程的技巧,捷径,而是从别的方面为我们讲解了编程的精义.第三章就为我们引入了“团队”这个概念. 我们 ...

  2. MongoDB 学习笔记(一)基础篇

    1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱 ...

  3. 一、Oracle分析函数入门

    分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同 ...

  4. 简单理解Hibernate三种状态的概念及互相转化

    本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...

  5. pl/sql programming 03 语言基础

    PL/SQL 块结构 最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命 ...

  6. CodeForces ZeptoLab Code Rush 2015

    拖了好久的题解,想想还是补一下吧. A. King of Thieves 直接枚举起点和5个点之间的间距,进行判断即可. #include <bits/stdc++.h> using na ...

  7. IOS学习-报错误 Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

    环境:XCODE:5.0.2  IOS7模拟器 界面:使用storyboard 拖拽 简单应用:一个CoreData的CRUD用例. 界面如下图(一个UITableViewController 列表 ...

  8. PHP基础 CGI,FastCGI,PHP-CGI与PHP-FPM

    CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...

  9. boost多边形交集、并集

    交集:http://www.boost.org/doc/libs/1_56_0/libs/geometry/doc/html/geometry/reference/algorithms/interse ...

  10. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...