Java基础知识(二)
流程控制
用户输入Scanner类
在Java中用scanner类对象来充当输入流,相当于c++里的cin对象。在黑框中你输入的信息都存储在缓存区,等待scnner对象的读取。
这个对象在java.util.Scanner中所以在你的类上方会有个import java.util.Scanner。
Scanner类有这几个成员函数:
- 判断用户是否还有输入:
- hasNext:判断用户是否还有输入,以空格、换行符为结束符。(也就是说读取的是你输入空格之前的内容。你如果输入“有 人喜欢我吗?”并输出那个变量,那么你就会得到“有”,是不是很开心?)。
- hasNextLine:判断用户是否还有输入,以换行符为结束符。(很可惜得不到喜欢的回应了)。
- hasNextInt:判断用户是否还有输入数字。。。等等hasNext之后可以加好多数据类型。
- 上边是判断是否还有输入,而下面直接就是读取缓存区的内容了:
- next:获取缓存区的字符串并返回,还是以空格、换行符为结束符。
- nextLine:获取缓存区的字符串并返回,以换行符为结束符。
- nextInt:获取缓存区的数字并返回。
- 等等。。Float之类的都可以
以上的都是Scanner类的成员函数所以调用时要用对象调用,示例如下:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in); //将系统的输入作为参数
int a = 0;
if(scanner.hasNext){
a = scanner.nextInt();
}
scanner.close() //***切记切记,要不然浪费资源
}
重要!重要!重要!:切记要最后要将scanner对象关闭
结构
Java有三种结构,顺序结构、选择结构、分支结构。
1、顺序结构:
- 最简单的就是顺序结构,就是你一步一步的写就行,只要你不进行各种非正确的骚操作就肯定是对的。
2、选择结构:
- if…else if…else结构:表达式为逻辑值,也就是true/false,代码块你随便写
if(表达式){
代码块;
}
else if(表达式){
代码块;
}
else if(表达式){ //中间写多少else if都可以
代码块;
}
else{
代码块;
}
以上代码当其中任意一种情况执行表达式值为true以下的就不执行了,也就是说以上的代码只执行一个代码块。如果你想连续判断并执行那么你就一直if就行了。**值得注意的是else与最近的if是一体的。
if(表达式){
代码块;
}
if(表达式){
代码块;
}
- 还有一种选择结构就是 switch:
switch(数值){
case 情况1:
代码块;
break;
case 情况2: //你想加几个情况都可以
代码块;
break;
default:
代码块;
}
从上向下看 “数值” 是否与 “情况i” 匹配,如果匹配则执行对应的代码块,若不匹配则执行default的代码块。**值得注意的是看见break了吗?在不加break的时,执行完成功匹配的代码块后下面的代码块会都不用判断的执行,只有加上break才能停止继续执行并跳出switch。
3、循环结构:
- while循环与do while循环:
while(表达式){
代码块;
}
do{
代码块
}while(表达式); //注意这有分号!!!
在while循环中,判断表达式是否为true,若为true则执行代码块,然后再继续判断,直到表达式为false时跳出循环。
在do while中,先执行一次代码块,再判断表达式是否为true,若为true则执行代码块,然后再继续判断,直到表达式为false时跳出循环。也就是说do while循环至少执行一次代码块。
在两者其中还可以插入break、continue关键字,如下:
while(表达式){
代码块;
if(表达式){ //当表达式为true,执行以下的break
break; //当遇到这个关键字直接退出循环,一般与if相结合。要不然直接硬插个break那循就没啥用了
}
}
while(表达式){
代码块;
if(表达式){
continue; //当遇到这个关键字跳出本次循环,也就是执行下一次循环,下面那个111就不输出了
}
System.out.println(111);
}
- for与加强for循环:
for(初始值;表达式;算式){
代码块;
}
例如:
for(int i = 0;i < 12;i++){
System.out.println(i); //功能就是输出每个i的值
}
这个代码的执行顺序时,初始值 --> 判断表达式是否为true --> 代码块 --> 算式 --> 表达式 --> 代码块 --> 算式,这样一直循环,直到表达式为false时结束循环。
加强for循环
for(type i:arrayName){
代码块;
}
快捷键就是直接在数组名后.for就直接出来了
方法
方法就是c++里的函数,不过按照Java里万物皆对象的特点这函数自然就写成成员函数了。
方法怎么写,修饰符+返回值类型+方法名(参数列表) { 代码块 },例如:
public class className{
public static void main(String[] args){
func(12);
}
public static int func(int i){ //加static目的是不在类中创建对象就能直接调用这个方法
System.out.println(i);
return 0;
/*注意:如果你的返回类型不为空,那么你必须在函数体中的最外层返回一个值,就算你前边加了个if在里面 返回都不行!!!*/
}
}
方法的重载:相同的方法名可以执行不同的方法体,要求:参数列表不同、函数名相同,其他都无所谓(返回值类型、修饰符)。Java中的方法重载与c++中是相似的。例如:
public class className{
public static void main(String[] args){
func(12.1); //调用的是形参为double的函数
func(12); //调用的是形参为int的函数
}
public static int func(int i){
i += 1;
return i;
}
public static int func(double i){
i += 1;
return (int)i;
}
}
参数列表不同要求,类型不同、参数数量不同、类型和参数数量都不同,即可重载。
参数还有一种可变参数(就是可以接受多个参数的参数)
- 规则:只能出现在参数列表中的最后一个
public class className{
public static void main(String[] args){
func(1,2,3,4,5);
}
public static void func(int...args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i]);
}
}
}
数组
数组是一组有先后顺序的同一类型的元素的集合。
数组的声明:
type[] name;
type name[];
数组的初始化:两种初始化方法
静态初始化如:
int[] a = {1,2,3,4}
动态初始化如:
int[] a = new int[4];
这样初始化不赋值,得到的是默认初始化的如果是int则全是0,如果是string则全是null
数组的四大基本特点:
- 大小固定
- 类型相同
- 数组类型可为任意
- 数组就是对象,可以用 “.” 调用成员
内存
Java的内存分为栈、堆、方法区
栈:
- 存放基本变量类型,包含其值
- 存放引用对象的变量,存的是地址
堆
- 存放new出来的对象与数组
- 被所有线程共享,不会存放别的对象引用
方法区
- 可以被所有线程共享
- 包含了所有static、class变量