2019暑假Java学习笔记(一)
0704,0705
基础语法(上)
JVM:Java虚拟机
JDK:Java开发工具包
JRE:Java运行环境
HelloWorld
新建源文件HelloWorld.java,并键入下面的内容。
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
在命令行切换到源代码目录,先用
javac HelloWorld.java
进行编译,
然后用
java HelloWorld
运行。
变量
变量都需要命名,叫做“变量名”。
变量需要声明(declare)才能使用。
可以在程序的任何位置声明变量。
1.声明变量的语法格式
数据类型 变量名称
int a = 1;
2.输出变量a的语句是
System.out.println(a);
常量
常量的值是不能被修改的。
在变量的前面添加关键字final即可声明一个常量。
在Java编码规范中,要求变量名必须大写。
1.声明常量的语法格式
final 数据类型 常量名 = 值
final double PI = 3.14
常量也可以先声明,再进行赋值,但只能赋值一次,比如:
final int FINAL_VARIABLE;
FINAL_VARIABLE = 100;
2.输出常量PI的语句是
System.out.println(PI);
数据类型
Java中共有八种基本数据类型,详见下表。
数据类型 | 默认值 | 存储格式 | 数据范围 | 包装类型 |
---|---|---|---|---|
short | 0 | 2个字节 | -32,768到32,767 | Short |
int | 0 | 4个字节 | -2,147,483,648到2,147,483,647 | Integer |
byte | 0 | 1个字节 | -128到127 | Byte |
char | 空 | 2个字节 | Unicode的字符范围:'\u0000'(即为0)到'\uffff'(即为65,535) | Character |
long | 0L或0l | 8个字节 | -9,223,372,036,854,775,808到9,223,372,036,854,775,807 | Long |
float | 0.0F或0.0f | 4个字节 | 32位IEEEE-754单精度范围 | Float |
double | 0.0或0.0D(d) | 8个字节 | 64位IEEE-754双精度范围 | Double |
boolean | false | 1位 | true或false | Boolean |
整数
byte、short、int、long四种基本数据类型表示整数,注意long类型,使用long修饰的变量需要在数值后面加上L或者l,比如
long num = 1L;
,一般使用大写L避免与1混淆。
浮点数
float和double类型表示浮点数,注意float类型的数值后面需要加上F或者f,否则会当成DOuble类型处理。double类型的数值可以加上D或者d,也可以不加。
char类型
char a = 'a';
char可以和整数类型互相转换,比如
char a = 97;
也可以用十六进制表示
char a = '\u0061';
boolean类型
boolean类型(布尔类型)用于表示真值true或者假值false,Java中布尔值不能和整数类型或者其它类型互相转换。
String
Java中使用String类来定义一个字符串,字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。
1.String对象的初始化格式
String s0 = "abc";
或者
String s1 = new String("abc");
两种方法其实有很大的区别。前者会在栈中穿件一个对象引用变量s0,然后查看栈中是否存在"abc",如果没有,则将"abc"存放进栈,并令引用变量s0指向他;如果已经有"abc",则直接令s0指向它。
而后者是Java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象。
前者可能是一个陷阱,可能没有创建新的对象。
下述代码展示了二者的不同。
其中"=="比较的是两个对象在内存中存储的地址是否一样。
计算字符串长度
length()方法
public int length(){
}
调用方法:字符串标识符.length();返回一个int类型的整数(字符串中字符数,中文字符也是一个字符)。例如:
String s1 = "JoJo";
String s2 = "和Dio的奇妙冒险";
int len1 = s1.length();
int len2 = s2.length();
则变量len1的值是4,变量len2的值是9。
顺便提一下,如果想知道一个整型数组的长度,那么数组名.length即可,也就是去掉length后面的小括号。
字符串比较
equals()方法,该方法的作用是判断两个字符串对象的内容是否相同,相同则返回true,不同则返回false。
equals()方法比较是从第一个字符开始,一个字符一个字符一次比较。
如果想忽略大小写关系,则使用equalsIgnoreCase()方法即可,用法与equals相同。
String s1="JoJo";
String s2="JOJO";
System.out.println("用equals()比较,结果为"+s1.equals(s2));
System.out.println("用equalsIgnoreCase()比较,结果为"+s1.equalsIgnoreCase(s2));
结果为:
用equals()比较,结果为false
用equalsIgnoreCase()比较,结果为false
字符串连接
字符串连接有两种方法:
1.使用+
String s = "JoJo"+"的奇妙冒险";
使用+进行连接,不仅可以连接字符串,也可以连接其他类型。但是要求连接时至少有一个参与连接的内容是字符串类型。
2.使用String类的concat()方法
String s0 = new String("JoJo");
String s1 = new String("的奇妙冒险");
String s2 = s0.concat(s1);
charAt()方法
charAt()方法的作用是按照索引值(规定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),获得字符串中的指定字符。
String s = "abc";
char c = s.charAt(1);
则c的值是'b'。
字符串常用提取方法
方法 | 返回值 | 功能描述 |
---|---|---|
indexOf(int ch) | int | 搜索字符ch第一次出现的索引 |
indexOf(String value) | int | 搜索字符串value第一次出现的索引 |
lastIndexOf(int ch) | int | 搜索字符ch最后一次出现的索引 |
lastIndexOf(String value) | int | 搜索字符串value最后一次出现的索引 |
substring(int index) | String | 提取从位置索引开始到结束的字符串 |
substring(int beginindex,int endindex) | String | 提取beginindex和endindex之间的字符串部分 |
trim() | String | 返回一个前后不含任何空格的调用字符串的副本 |
说明:子字符串包含beginindex的字符,但不包含endindex的字符。
练习:字符串处理
要求:
- 从控制台输入一行字符串
- 去除字符串中的所有空格
- 打印去除空格后的字符串
提示:
java.util.Scanner可以获取控制台输入。
我的代码:
import java.util.Scanner;
public class StringUtil{
public static void main(String[] args){
Scanner in =new Scanner(System.in);
String a=in.nextLine();
int i;
for(i=0;i<a.length();i++){
if(a.charAt(i)!=' '){
System.out.print(a.charAt(i));
}
}
}
}
注意,一定要有第一句import java.util.Scanner
,不然无法使用Scanner获取控制台输入。
练习:对比字符串
要求
- 从控制台输入字符串a和字符串b
- 比较字符串a和字符串b是否长度、内容等完全一致
- 如果完全一致,输出相同,如果不一致,输出不同。
- 禁止使用equals方法
我的代码:
import java.util.Scanner;
public class ContrastString{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.nextLine();
String b = in.nextLine();
int flag = 1;
int i;
if(a.length()!=b.length()) flag=0;
for(i=0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)) flag=0;
}
if(flag==1) System.out.println("相同");
else System.out.println("不同");
}
}
上面这个有Bug,如果第一个字符串的长度比第二个长,就会报下面的错误。
java ContrastString [15:25:55]
nihaoma
nihal
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at ContrastString.main(ContrastString.java:11)
那么学习了exit用法后,修改程序,下面这个就去除了Bug。
import java.util.Scanner;
public class ContrastString{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.nextLine();
String b = in.nextLine();
int flag = 1;
int i;
if(a.length()!=b.length()){
System.out.println("不同");
System.exit(0);
}
for(i=0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)){
System.out.println("不同");
System.exit(0);
}
}
System.out.println("相同");
}
}
运算符
运算符是一种符号,它是连接一个以上的操作符,实现某种功能的运算。
算数运算符
用于数学表达式。
"+","-","*","/","%","++","--"很简单,不列表说明了。前5个为双目运算符,后2个为单目运算符。
注意,若int a = 5
,则a++
=5,++a
=6。
而且即使把a++
放在System.out.println里,虽然这时输出的a的值没有变,但其实之后a的值就变了。
int a = 5;
System.out.println(a++);
System.out.println(++a);
输出结果为:
5
7
可见,a++
确实改变了a的值。
位运算符
位运算符应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算时先转换为二进制,再按位运算。
下面的表格中,变量a的值为60,变量b的值为13:
位运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
& | 按位与 | 如果相对应位都是1,则结果为1,否则为0 | (a&b),得到12,即0000 1100 |
| | 按位或 | 如果相对应位都是0,则结果为0,否则为1 | (a|b),得到61,即0011 1101 |
^ | 按位异或 | 如果相对应位值相同,则结果为0,否则为1 | (a^b)得到49,即0011 0001 |
~ | 按位补 | 翻转操作数的每一位,即0变成1,1变成0 | (~a)得到-61,即1100 0011 |
<< | 按位左移 | 左操作数按位左移右操作数指定的位数 | a<<2得到240,即1111 0000 |
>> | 按位右移 | 左操作数按位右移右操作数指定的位数 | a>>2得到15即1111 |
<<< | 按位右移补零(无符号右移) | 左操作数指定的值按右操作数指定的位数右移,移动得到的空位以零补充 | a>>>2得到15即0000 1111 |
逻辑运算符
逻辑运算符是通过运算符将操作数或等式进行逻辑判断的语句。
"&&","||","!","^",只有最后一个异或有点难,不列表了。除了"!"都为双目运算符。
异或的用法:如果两个操作数逻辑相同,则结果为假,否则为真。
关系运算符
关系运算符生成一个boolean结果,它们计算的是操作数的值之间的关系。如果关系是真实的,结果为true,否则,结果为false。
"==","!=",">","<",">=","<="都很简单,不再列表。除了这些二元运算符,Java还有唯一的一个三目运算符?:
语法格式:布尔表达式?表达式1:表达式2
(相当于一种简单if else的代替)
- "=="和"!="适用于所有的基本数据类型,其他关系运算符不适用于boolean,因为boolean值只有true和false,比较没有任何意义。
- "=="和"!="也适用于所有对象,可以比较对象的引用是否相同。
引用:Java中一切都是对象,但操作的标识符实际是对象的一个引用。
运算符的优先级
###(整数的输入)
```java
Scanner in = new Scanner(System.in);
int x1 = in.nextInt();
int x2 = in.nextInt();
```
别忘了开头加上`import java.util.Scanner;`哦。
***
***
##关键字和语句
###关键字
Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。
目前共50个关键字,其中,"const"和"goto"这两个关键字在Java语言中并没有具体含义。
***
***
##方法
Java中的方法可以看成一个功能的集合,是为了解决特定问题的代码组合。
1.方法的定义语法:
```
访问修饰符 返回值类型 方法名(参数列表){
方法体
}
```
例如:
```java
public void functionName(Object arg){
}
在上面的语法说明中:
1.**访问修饰符:**代表方法允许被访问的权限范围,可以是public、protected、private或者省略(default),其中public表示该方法可以被其他任何代码调用。
2.**返回值类型:**方法返回值的类型,如果方法不返回任何返回值,则返回值类型指定为void(代表无类型);如果方法具有返回值,则需要制定返回值的类型,并且在方法体中使用return语句返回值。
Java的方法与C的函数很相似,不同的是,方法与对象有关,而函数与对象无关。方法的参数传递通常是隐式的,他可以直接操作类内部的数据。方法依赖于某个特定的对象,我们可以说“调用对象X的Y方法”,而不能说“调用Y方法”。
3.**方法名:**是方法的名字,必须使用合法的标识符。
>Java标识符由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java*关键字*不能当作Java标识符。
1.类和接口名。每个字的首字母大写,含有大小写。例如:MyClass,HelloWorld,Time等。
2.方法名。首字母小写,其余的首字母大写,含大小写,尽量少用下划线。例如,myName,setTime等驼峰式命名。
3.常量名。基本数据类型的常量名使用全部大写字母,字与字之间用下划线分隔。对象常量可大小混写。例如:SIZE_NAME。
4.变量名。可大小写混写,首字符小写,字间分隔符用字的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。
4.**参数列表:**是传递给方法的参数列表,参数可以有多个,多个参数间以逗号隔开,每个参数由参数类型和参数名组成,以空格隔开。当方法被调用时,传递值给参数。这个值称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
5.**方法体:**方法体包含具体的语句,定义该方法的功能。
根据方法是否带参,是否带返回值,可将方法分为四类:
* 无参无返回值方法
* 无参带返回值方法
* 带参无返回值方法
* 带参带返回值方法
当方法定义好之后,需要调用才可以生效,我们可以通过main方法(main方法是Java程序的入口,所以需要用它来调用)来调用它。示例:
```java
public class MethoDemo{
public static void main(String[] args){
method();
}
public static void method(){
System.out.println("方法被调用");
}
}
参考
Java编程基础(实验楼)
Java中String初始化的两种方式
to be continued
总有一天,我会用高亮的代码段让这里焕然一新!这是我的宣言!
2019暑假Java学习笔记(一)的更多相关文章
- 2019暑假Java学习笔记(二)
目录 基础语法(下) 流程控制 if语句 switch语句 while语句和do-while语句 for语句 break关键字 continue关键字 数组 一维数组 二维数组 用户输入操作 练习题: ...
- 2019暑假Java学习笔记(三)
目录 面向对象 对象 构造方法 引用与对象实例 static final 封装 this 继承 super 方法重载与重写 多态 抽象类 接口 内部类 成员内部类 静态内部类 局部内部类 匿名内部类 ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
- Flask 基础总结回顾
1.Flask Request # from flask import request request.form # 获取FormData中的数据 request.args # 获取URL中的数据 r ...
- jq1.6版本前后,attr()和prop()的区别,来自慕课网的回答
jQuery 1.6之前 ,.attr()方法在取某些 attribute 的值时,会返回 property 的值,这就导致了结果的不一致.从 jQuery 1.6 开始, .prop()方法 方法返 ...
- Android Scroller详解
在学习使用Scroller之前,需要明白scrollTo().scrollBy()方法. 一.View的scrollTo().scrollBy() scrollTo.scrollBy方法是View中的 ...
- Android为TV端助力之热修复原理
通过源码我们知道Android加载类是通过ClassLoad类里面的findClass先去查找的,如下图所示 通过看源码我们知道,ClassLoad是一个抽象类,它本身并没有实现findclass() ...
- IDEA配置自己的注释
File-->Setting-->Live Templates,点击+,选择2.Template Group... 创建Group,我的命名为MyAnnotation,然后选中MyAnnt ...
- 大数据集群环境 zookeeper集群环境安装
大数据集群环境 zookeeper集群环境准备 zookeeper集群安装脚本,如果安装需要保持zookeeper保持相同目录,并且有可执行权限,需要准备如下 编写脚本: vi zkInstall.s ...
- 关于python模块总结
名词解释 模块(module):在python中,一个.py文件就是一个模块 包(package):为了避免模块名冲突,Python又引入了按目录来组织模块的方法.当目录下存在__init__.py, ...
- python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准
python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...
- 大数据JavaWeb之java基础巩固----Junit&反射&注解
最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...
- Codeforces Round #560 (Div. 3) Microtransactions
Codeforces Round #560 (Div. 3) F2. Microtransactions (hard version) 题意: 现在有一个人他每天早上获得1块钱,现在有\(n\)种商品 ...