JavaSE 1.0 版本

Posted Al_tair

tags:

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

JavaSE

JavaSE

大家好,我是小笙,经过几个月的总结学习,我完成了javaSE1.0版本的笔记总结,我分享出来,希望对大家了解java基础,我在这里推荐java视频:韩顺平老师的java基础视频以及Java 全栈知识体系文档,受益匪浅!我们一起加油!


Java概述

Java诞生

Java(英式发音[ˈʤɑːvə],美式发音[ˈʤɑvə])是一种广泛使用的计算机编程语言.

  1. 嵌入式系统的发展,c/c++在不同平台上的开发需要不同的编译器,然而创建编译器"费时费力"

  2. 开发者研究开发一种可移植,跨平台的计算机语言

  3. 1991 Oak的出现 ~~> 1995 更名为Java

开发Java语言的初衷

Java之所以被开发,是要达到以下五个目的:

​ 初衷 <==> 语言特点

  • 应当使用面向对象程序设计方法学 <==> 面向对象
  • 应当允许同一程序在不同的计算机平台执行 <==> 平台无关性
  • 应当包括内建的对计算机网络的支持 <==> 分布式
  • 应当被设计成安全地执行远端代码 <==> 安全性
  • 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。 <==> 简单性,健壮性,高性能

java语言有哪些特点?

面向对象的三大基本特征和五大基本原则

1. 面向对象

Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。

2. 平台无关性

平台无关性的具体表现在Java 是“一次编写,到处运行“的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。

3. 简单性

Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。

4. 编译与解释并存

Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。

Java即是编译型的,也是解释型语言,总的来说Java更接近解释型语言(补充:解释型语言:javascript,php,Java 编译型语言:c/c++)

解释型语言和编译型语言的区别:

解释性语言,编译后的代码,不能直接被机器执行,需要解释器来执行 ; 编译性语言,编译后的代码,可以直接被机器执行,c/c++

5. 多线程

Java 语言是多线程的,这也是 Java 语言的一大特性,Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。

6. 分布式

Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。

7. 健壮性

Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。

8. 高性能

Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。

9. 安全性

Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。

Java虚拟机(JVM)

JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据 内存 寄存器。

JDK JRE JVM 关系(重点)

编译与解释

在dos窗口运行 如 helloJava.java 的文件

// 编译 java
javac helloJava.java
// 解释 helloJava.class
java helloJava // 这里只需要类名,切记非 java helloJava.class

源文件中代码注意事项 细是真的细!!!

  • 一个源文件中最多只能有一个被public修饰的类,而非public修饰的类可以有无数个
  • 如果一个源文件中有被public修饰的类,则该类的名字必须和文件名相同 // 区别文件(有后缀) and 文件夹 (没有后缀,只是用来存放文件的一种组织形式)
  • 主方法main(程序入口)可以放在非public修饰的类 (源文件中所有类都可以不被public修饰)
  • 一个源文件中含有多个类,通过编译会生成对应个数的字节码文件(字节码文件的名字 <==> 类名)
  • 如果一个源文件中的类与类之间没有存在联系(如下代码)可以在每一个类中放置程序入口main函数,由于最后生成不同的字节码文件,我们只需要通过java.exe工具将各个字节码放入到JVM虚拟机中进行解释执行(因为不存在同时放入两个字节码,所以不会存在程序入口冲突问题)

class java
	public static void main(String[] args)
		System.out.println("helloworld~");
	


class person
	public static void main(String[] args)
		System.out.println("person~");
	


class animal
	public static void main(String[] args)
		System.out.println("animal~");
	


// 运行结果
C:\\Users\\Ushop\\Desktop\\mess\\textJava>java java
helloworld~

C:\\Users\\Ushop\\Desktop\\mess\\textJava>java person
person~

C:\\Users\\Ushop\\Desktop\\mess\\textJava>java animal
animal~

转义字符

概述:\\ 开头 表示接下这个字符是转义字符 比如:\\n 中的n不在是字母n的含义

public static void main(String[] args)
    /* 转义字符  俗称:改变意思的字符
			\\t : 一个制表符,起到对齐的功能 类似于tab的作用
			\\\\ : 一个\\   文件路径通常表示是 C:\\\\Users\\\\Ushop\\\\Desktop\\\\mess\\\\textJava
			\\n : 换行符
			\\" : 一个"
			\\' : 一个'
			\\r : 一个回车,将光标移动到该行最前面,可能会引起覆盖的反作用 通常使用手法是: \\r\\n  == \\n
				 例如"罗念笙like dog\\r张洛融 ==> 显示内容:"张洛融"
	*/
    System.out.println("罗念笙\\tlove\\t张洛融");   // 运行结果: 罗念笙	love	张洛融
    System.out.println("\\\\");                    // 运行结果: \\
    System.out.println("罗念笙\\nlove\\n张洛融");   // 运行结果:罗念笙 换行  love  换行 张洛融
    System.out.println("\\"");                    // 运行结果: "
    System.out.println("\\'");                     // 运行结果:'   
    System.out.println("罗念笙 like dog\\r张洛融");  // 运行结果:张洛融

注释

单行注释 && 多行注释

注释的内容 不会被虚拟机JVM解释执行

// 单行注释
/* 
   多
   行
   注
   释
 */

文档注释

注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档

/**
  * 文档注释
  * @author 罗念笙   -- 文档注释中的注解
  * @version 1.0    
  */
public class hello
	public static void main(String[] args)
		System.out.println("helloworld~");
	


/*
	笙式讲解:(下面的两行命令的区别如下图)
	        javadoc  doc文件                生成的网页文件存放的文件目录                  文档注释的java文件
		1.  javadoc   -d       C:\\\\Users\\\\Ushop\\\\Desktop\\\\mess\\\\textJava\\\\javadoc      hello.java
		    javadoc  doc文件                生成的网页文件存放的文件目录            java文件中的文档注释中所用注解(带@)  文档注释的java文件
		2.  javadoc    -d      C:\\\\Users\\\\Ushop\\\\Desktop\\\\mess\\\\textJava\\\\javadoc2   -author -version                  hello.java
		
		我使用的编码类型是GB2312  在dos命令中无出现乱码的问题
		如果你使用的是utf-8,添加  -encoding utf-8  (放在注解的位置前后)  java代码采用的是utf-8字符编码编写的
		添加 -charset utf-8       java doc html文件为utf-8字符编码
		为什么要说明是utf-8,java的编码不都是以utf-8为主的嘛?
		因为我是用的是dos命令窗口,要想显示中文得遵守GBK编码
*/
  1. 未加入注解说明

  2. 加入注解说明

javadoc 标签(文档注解)

javadoc 工具软件识别以下标签:

*标签**描述**示例*
*@author**标识一个类的作者**@author description*
*@deprecated**指名一个过期的类或成员**@deprecated description*
*@docRoot**指明当前文档根目录的路径**Directory Path*
*@exception**标志一个类抛出的异常**@exception exception-name explanation*
*@inheritDoc**从直接父类继承的注释**Inherits a comment from the immediate surperclass.*
*@link**插入一个到另一个主题的链接**@link name text*
*@linkplain**插入一个到另一个主题的链接,但是该链接显示纯文本字体**Inserts an in-line link to another topic.*
*@param**说明一个方法的参数**@param parameter-name explanation*
*@return**说明返回值类型**@return explanation*
*@see**指定一个到另一个主题的链接**@see anchor*
*@serial**说明一个序列化属性**@serial description*
*@serialData**说明通过writeObject( ) 和 writeExternal( )方法写的数据**@serialData description*
*@serialField**说明一个ObjectStreamField组件**@serialField name type description*
*@since**标记当引入一个特定的变化时**@since release*
*@throws**和 @exception标签一样.**The @throws tag has the same meaning as the @exception tag.*
*@value**显示常量的值,该常量必须是static属性。**Displays the value of a constant, which must be a static field.*
*@version**指定类的版本**@version info*

Java开发规范(重点)

DOS命令操作(了解)

  • 讲解相对路径 VS 绝对路径(重要!!!)

  • DOS命令(大小写一样效果)

    1. 更改当前目录

      切换成其他盘(改变根目录)
      cd (chang directory) 盘符号
      例子:切换到E盘 cd: /D e:  或者 e:
      
      切换成当前盘的其他目录
      例子:cd 绝对路径 或者 相对路径
      
      切换到当前的根目录
      例子:cd\\
      
      切换到上一级目录
      例子:cd ..
      
    2. 对文件夹的操作

      创建文件夹(目录)
      例子: md 文件名 (make directory)
      
      删除文件夹(目录)
      例子:rd 文件名 (remove directory)
      
      复制文件到指定文件夹(目录)
      例子: copy 复制的文件名 文件夹所在绝对路径 或者 相对路径
      
      移动文件到指定文件夹(目录)
      例子: move 移动的文件名 文件夹所在绝对路径 或者 相对路径
      
    3. 查看当前文件(目录)

      查看当前目录的文件
      dir (directory)
      例子:
      dir (查看当前目录)  
      dir 绝对路径 或者 相对路径 (查看指定目录下的文件)
      
      以一种树状图的形式展示文件结构
      用tree 代替 dir
      例子:
      tree (查看当前目录的树状图结构)
      tree 绝对路径 或者 相对路径 (查看指定目录的树状图结构)
      
    4. 其他命令

      帮助查看相关命令的使用
      例子:help cd 
      
      清屏
      例子:cls (clean screen)
      
      退出
      例子:exit
      

相关面试题

1、面向对象的特征有哪些方面? 【基础】

  • 封装

    让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量

  • 抽象

    声明方法的存在而不去实现它的类被叫做抽象类

  • 继承

    继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性

  • 多态

    多态就是指一个变量, 一个方法或者一个对象可以有不同的形式.

Java变量

变量 = 变量名 + 值 + 数据类型

数据类型(重点)

java是一种强制类型语言,每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(字节)

细节:字符串本质是类,属于引用数据类型

整数的类型

类型占用存储空间范围
byte 字节1字节-128 ~ 127
short 短整型2字节-2^15 ~ 2^15-1
int 整型4字节-2^31 ~ 2^31-1
long 长整型8字节-2^63 ~ 2^63-1

1字节(byte) = 8 位(bit)

bit 计算机中的最小的存储单位 byte 计算机中基本存储单位

浮点类型

浮点数字 = 符号位 + 指数位 + 尾数位 (尾数位可能丢失,造成精度的损失)

E38 指的是 10^38

类型占用存储空间范围
float (单精度)4字节-3.403E38 ~ 3.403E38-1
double (双精度)8字节-1.798E308 ~ 1.798E308-1

浮点数使用细节

  1. float 后面需要添加f 或 F

    float num1 = 1.0; // 错误、
    double num2 = 1.1; // 正确
    float num3 = 1.2F; // 正确
    double num4 = 1.3f; // 正确
    
  2. 浮点型常量的表示形式

    double num = 1.0; // 十进制数形式 1.0f  .512 == 0.512(小数点必须在可以省略0)
    double num5 = 5.12e2; // 科学计数法 5.12e2 == 512  5.12E-2 == 0.0512
    
  3. 通常情况下我们使用double 精度高

    double num = 1.23456789123f;
    float num1 = 1.23456789123f;
    System.out.println(num);  // 1.23456789123
    System.out.println(num1);  // 1.2345679
    
  4. 比较 小数数字是否相等时要注意:最好不要直接去比较两个浮点数是否 == 最好是两个浮点数的差值绝对值在某个精度范围内来进行比较(如0.000001)

    double num = 8.1 / 3;
    double num1 = 2.7;
    System.out.println(num); // 2.6999999999999997 
    System.out.println(num1); //2.7
    
    if(Math.abs(num - num1) < 0.000001)
        System.out.println("相等");
    
    

字符类型

类型占用存储空间表示
char2字节表示单个字符

使用细节

  1. 字符常量是用单引号(’‘)括起来的单个字符

    char c = 'n';
    
  2. 单引号里面可以放入转义字符(虽然有两个字符,但是它是表示一个字符的 比如 // 表示 / )

    char ch = '//'
    
  3. char 的本质就是一个整数(unicode表) (**注意:字符 --> 数字 unicode 数字 --> 字符 **)

    // unicode 编码
    'a' --  97
    // char 类型字符可以进行加减 但是注意超出范围的问题
    'a' + 10 -- 107
    

字符在计算机里的存储方式

存储:‘a’ ==> 97 ==> 二进制数(11000001) ==> 存储

读取: 二进制(11000001) ==> 97 ==> ‘a’ ==> 读取

字符编码表

补充:ASCII实际上可以表示256个字符,但是只使用了128个

布尔类型

常用于条件判断语句 if - else while

类型占用存储空间表示
boolean1字节true / false

数据类型转换

自动类型转换

精度小的数据类型自动转换为精度大的数据类型

自动类型转换相关的注意细节

  1. 当一个二元运算符连接两个值时,先将两个操作数转换成同一类型的数据进行计算(转换成操作数两边范围最大的数据类型)

    // 伪代码
    if(两个操作数中有一个是double类型数据)
        另一个操作数也会强制转换成double类型数据
    else if(两个操作数中有一个是float类型数据)
        另一个操作数也会强制转换成float类型数据
    ... // 依次下去
    
  2. (byte,short)和 char 之间不会自动转换

    // 注意区分具体值赋值和变量赋值
    // 具体值赋值会先进行范围的判进行赋值
    char c = 10000; 
    short s = 'a';
    byte b = 'b';
    // 变量赋值就是依据自动类型转换或者强制类型转换
    c = (char)s;
    s = (short)c;
    
  3. 注意赋值区别(具体数值赋值和变量赋值)

    // 整数之间的赋值
    byte n = 10; // 具体数值赋值,先进行判断该数值是否在byte范围,如果在编译就不会出错,便会赋值
    int n1 = 10;
    n = n1; // int类型变量无法直接赋值给byte类型(可以进行强制类型转换)
    
    // 小数之间赋值 
    float f = 10.0; // 错误,float中将无法进行比较,本来都是一个估算值,无法进行比较范围,因此10.0是double类型无法自动转型为float
    
  4. byte,char,short 三者进行计算,在计算时首先转换成int类型数据(变量计算都会转换成int类型,不管是否是同类型数据相加减)

  5. boolean 数据类型不参与类型转换

强制类型转换

**概念:**自动类型转换的逆过程,将范围大的数据类型转换成范围小的数据类型,使用时需要在变量或者具体值前面加()

**好处:**根据程序员的意愿进行修改 **坏处:**范围超出了想要转换的数据类型,会导致溢出问题

// 例如 double ==> float
float f = (float)10.0;

强制类型转换的注意细节

  1. 强制符号只针对最近的操作数有效,往往会使用小括号来提升优先级

    int n = (int)10*3.5+12*2.3; // 错误
    int n = (int)(10*3.5+12*2.3); // 正确
    

基本数据类型和String类型的转换

  1. 将基本数据类型+"" ==> String类型

    String s = 10 + "";
    
  2. 通过基本数据类型的包装类调用parseXX方法

    String s = "2"
    Integer.parseInt(s);
    Double.parseDouble(s);
    Float.parseFloat(s);
    Short.parseShort(s);
    Long.parseLong(s);
    Boolean.parseBoolean("true");
    Byte.parseByte(s);
    
    // char 根据索引来判断
    String str = "123456789";
    char c  = str.charAt(0);
    

相关面试题

字符型常量和字符串常量的区别? (来自javaGuide)

  • 形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符

  • 含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)

  • 占内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)

String 是最基本的数据类型吗?

答:不是,String是一个类属于引用数据类型

float 型float f=3.4是否正确?

答:否,3.4 默认为double类型,如果要赋值给float 需要强制类型转换 或者后面添加f/F

short s1 = 1; s1 = s1 + 1;有什么错?

s1+1运算结果是int 型,需要强制转换类型 或者改变书写方式

三种形式都可以如下

short s1 = 1; 
s1 += 1;
s1++;
s1 = (short)(s1+1);

运算符

运算符是一种特殊的符号,用来表示数据的运算,赋值或者比较等

算术运算符

*代码讲解

//  / 使用
10 / 4; // 2
10.0 / 4 // 2.5 
double d = 10 / 4; // 2.0

// % 使用
// 取模的本质 公式: a % b = a - a / b * b (当 a 是整数)   a % b = a - (int)a / b * b (当 a 是浮点数,但是是近似值)
10 % 3 // 1
-10 % 3 // -1
10 % -3 // 1
-10 % -3 // -1
// 总结得出取模的正负取决于被模数

关系运算符

关系运算符的结果都为boolean类型, true / false

关系运算符组成的表达式我们称为关系表达式

JavaSE基础(十 三 )---<内部类>成员内部类,静态内部类,局部内部类,匿名内部类,内部类的意义

JavaSE学习 外部调用内部类的方法

JavaSE学习 外部调用内部类的方法

JavaSE-内部类

MinGW 5.1.0 似乎不再抑制警告

javase系列内部类-常用API