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学习笔记(一)的更多相关文章

  1. 2019暑假Java学习笔记(二)

    目录 基础语法(下) 流程控制 if语句 switch语句 while语句和do-while语句 for语句 break关键字 continue关键字 数组 一维数组 二维数组 用户输入操作 练习题: ...

  2. 2019暑假Java学习笔记(三)

    目录 面向对象 对象 构造方法 引用与对象实例 static final 封装 this 继承 super 方法重载与重写 多态 抽象类 接口 内部类 成员内部类 静态内部类 局部内部类 匿名内部类 ...

  3. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  6. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  7. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  8. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  9. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

随机推荐

  1. Flask 基础总结回顾

    1.Flask Request # from flask import request request.form # 获取FormData中的数据 request.args # 获取URL中的数据 r ...

  2. jq1.6版本前后,attr()和prop()的区别,来自慕课网的回答

    jQuery 1.6之前 ,.attr()方法在取某些 attribute 的值时,会返回 property 的值,这就导致了结果的不一致.从 jQuery 1.6 开始, .prop()方法 方法返 ...

  3. Android Scroller详解

    在学习使用Scroller之前,需要明白scrollTo().scrollBy()方法. 一.View的scrollTo().scrollBy() scrollTo.scrollBy方法是View中的 ...

  4. Android为TV端助力之热修复原理

    通过源码我们知道Android加载类是通过ClassLoad类里面的findClass先去查找的,如下图所示 通过看源码我们知道,ClassLoad是一个抽象类,它本身并没有实现findclass() ...

  5. IDEA配置自己的注释

    File-->Setting-->Live Templates,点击+,选择2.Template Group... 创建Group,我的命名为MyAnnotation,然后选中MyAnnt ...

  6. 大数据集群环境 zookeeper集群环境安装

    大数据集群环境 zookeeper集群环境准备 zookeeper集群安装脚本,如果安装需要保持zookeeper保持相同目录,并且有可执行权限,需要准备如下 编写脚本: vi zkInstall.s ...

  7. 关于python模块总结

    名词解释 模块(module):在python中,一个.py文件就是一个模块 包(package):为了避免模块名冲突,Python又引入了按目录来组织模块的方法.当目录下存在__init__.py, ...

  8. python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准

    python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...

  9. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  10. Codeforces Round #560 (Div. 3) Microtransactions

    Codeforces Round #560 (Div. 3) F2. Microtransactions (hard version) 题意: 现在有一个人他每天早上获得1块钱,现在有\(n\)种商品 ...