java基础(1)

1.常量

常量是指程序运行期间,内容不可发生改变的量,像10,10.2,“hello”等都是常量

2.变量

变量与常量相反,程序运行期间,可以在一定范围内发生改变的量就是变量,变量的本质其实就是用来存放数据的一小块内存空间

变量的格式:数据类型 变量名 = 数据值

标识符的规则:

  • 只能由字符、下划线_和美元符$组成
  • 不能以数字开头s
  • 不能是java的关键字

常见的标识符命名规则(软性建议):

  • 见名只其意
  • 只使用英语和数字,更不要使用拼音
  • 类:每个单词首字母大写, 如Hello
  • 变量第一个单词完全小写后续更多单词首字母大写(小驼峰式),如ageOfLuyi
  • 方法:与变量规则一样,如show(),getAge()
  • 包:其实就是文件夹,由于对类进行管理,命名建议为全部小写,多级包用点.隔开

变量的注意事项:

  • 创建的多个变量不能重名
  • 变量一定要赋值之后才能使用
  • 变量的作用域问题:变量定义在哪个大括号中,就只能在哪个大括号中使用,超过所属的大括号,就无法使用
  • 可以在一个语句中同时定义类型相同的多个变量

3.数据类型的分类

基本类型

  • 整数类型:byte(占一个字节) short(占2个字节) int(占4个字节) long(占8个字节)
  • 浮点类型:float(占4个字节) double(占8个字节)
  • 字符类型:char(占2个字节)
  • 布尔类型:boolean(占1个字节)

引用类型

  • 字符串
  • 接口
  • 数组
  • Lambda
  • ...

注意事项:

  • 整数类型默认为int类型
  • 浮点数类型默认为double类型
  • 定义一个long型数据,在数值后面要用字母L作为后缀(大小写都可以,推荐使用大写),如5000L
  • 定义一个float型数据,在数值后面要用字母F作为后缀(大小写都可以,推荐使用大写),如3.14F
  • 字符char型数据,是可以包含中文的

4.运算符

运算符:对常量或变量进行操作的符号,叫做运算符,例如“+”
表达式:用运算符将多个常量或变量连起来的式子,叫做表达式,例如“a+b”
常用的运算符:

算数运算符:

1.加号(+) :跟数学中的加法一样,但是+对于字符串来说,并不是相加的意思,而是连接的功能,需要注意优先级问题

String str5 = "abc" + 10 + 20
//结果为:abc1020
String str5 = "abc" + (10 + 20)
//结果为:abc30
2.减号(-)

3.乘号(*)

4.除号(/)这里的除号是整除,只看商,不看余数

5.求余(%):取模运算,取得余数,只看余数,不看商

6.自增运算符(++):在变量的原有基础上加1,可以写在变量前面,也可以写在变量后面

a.单独使用的时候:前++和后++无任何区别

b.如果和其他运算符混合使用时:如果是前++,那么变量马上+1,然后拿着结果进行使用,如果是后++,那么首先使用当前的本来数据,然后再进行+1操作

  • 自减运算符(--):在变量的原有基础上减1
  • 计算中如果有小数参与,那么结果一定是小数

赋值运算符

  • 基本赋值运算符:表示将右侧的数值赋给左边的变量
  • 复合赋值运算符:如 a += 3,a *= 4
  • =左侧不能是常量,右侧既可以是常量也可以是变量

比较运算符:比较运算符的结果一定是一个布尔值,要么为true,要么为false

  • 大于 >:
  • 小于 <:
  • 大于等于 >=
  • 小于等于 <=
  • 不等于 !=
  • 等于 ==

逻辑运算符:

  • 与(&):全为true才为true
  • 或(|):有一个true就是true
  • 异或(^):相同是true,不同是false
  • 非 取反(!):本来true变成false,本来是false变为true
  • 短路使用:如果左侧已经可以判断到最终结果,那么右侧将不再执行
    • 短路与(&&)
    • 短路或(||)

位运算符(了解)

^的特殊使用:两次异或不改变原值

位运算可能会出现的面试题:

A:请实现两个变量的交换:用位异或运算符实现

a = a^b; b = a^b; a = a^b

B:请用最有效率的方式计算出2乘以8的结果

2<<3

5.Scanner键盘输入

使用引用类型的三个步骤:

1.导包:指定需要使用的目标在什么位置,在public class之前写一行代码 import 包路径名

import java.util.Scanner;

2.创建:数据类型 变量名称 = new 数据类型()

Scanner sc = Scanner(System.in);

3.使用:变量名称.方法名();

String str = sc.next()
int num = sc.nextInt()
总代码:

import java.util.Scanner;
public class Sc{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("please input something");
String str = sc.next();
System.out.println(str);
}
}

6.流程

顺序结构:程序自上而下一条线走下来

选择结构(if-else):

1.单if语句

if(布尔表达式){
语句体;
}
//如果布尔表达式为true,则执行语句体,否则,不执行;

2.标准if-else语句

if(布尔表达式){
语句体A;
}else{
语句体B;
}
//如果布尔表达式为true,则执行语句体A,否则,执行语句体B;

3.扩展if-else语句

if(布尔表达式1){
语句体A;
}else if(布尔表达式2){
语句体B;
}
...
else if(布尔表达式N){
语句体N
}else{
语句体N+1
}

例子:求两个数的最大值

import java.util.Scanner;
public class MaxNumber{
public static void main(String[] arg){
Scanner sc = new Scanner(System.in);
System.out.println("please the num1: ");
int num1 = sc.nextInt();
System.out.println("please the num2: ");
int num2 = sc.nextInt();
if(num1 > num2){
System.out.println("the max number is" + num1);
}else{
System.out.println("the max number is" + num2);
}
}
}

选择结构(switch):

格式:

switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n + 1;
break;
}

格式解释说明:

1.switch:说明这是switch语句

2.表达式:可以是byte,short,int,char,不可以是long,JDK5之后可以是枚举,JDK7以后可以是字符串

3.case:后面的值就是要和表达式进行比较的值

4.break:表示程序到这里中断,跳出switch语句

5.default:如果所有情况都不匹配,就执行这里,相当于if语句中的else

执行流程:

1.首先计算表达式的值

2.和每一个case语句进行匹配,如果有匹配的就执行对应的语句体,看到break就结束

3.如果没有匹配到,就执行default的语句n+1

注意事项:

1.case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的

2.default可以省略,但是不建议,因为它的作用就是对不正确的情况给出提示

3.break可以省略,但是结果可能不是我们想要的,会出现case穿透的现象,所以不推荐省略

4.default不一定要在最后,可以是任意位置,但是建议放在最后

5.switch语句结束的条件

  • 遇到break就结束
  • 执行到末尾就结束

示例代码:

import java.util.Scanner;

public class Demo11 {
public static void main(String[] args) {
System.out.println("请输入一个数字(1-7)");
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
String week = null;
switch(day){
case 1:
week = "一";
break;
case 2:
week = "二";
break;
case 3:
week = "三";
break;
case 4:
week = "四";
break;
case 5:
week = "五";
break;
case 6:
week = "六";
break;
case 7:
week = "天";
break;
default:
System.out.println("数据错误!");
}
System.out.println("今天星期" + week);
}
}

循环结构

循环结构的组成部分

  • 初始化语句:这部分内容最先执行,而且仅执行一次;
  • 条件判断:如果成立,则循环继续,如果不成立,则循环中止;
  • 循环体:每次循环都将重复执行循环体的代码内容;
  • 步进语句:每次循环执行后,都会执行一次步进语句;

for 循环:通常用于控制次数的场景

for(初始化语句;条件判断,步进语句){
循环体;
}
例子:求出1-100的偶数和

public class EvenNumber{
public static void main(String[] arg){
int sum = 0;
for(int i = 1; i < 101; i ++){
if(i % 2 == 0){
sum += i;
}
}
System.out.println("the sum is: " + sum);
}
}
whlie循环:

标准模式:
while(条件判断){
循环体;
}
//当条件满足时执行循环体,不满足则跳出循环体

扩展模式:
初始化语句;
while(条件判断){
循环体;
步进语句;
}

例子:求1-100的奇数和

public class OddNumber{
public static void main(String[] arg){
int sum = 0;
int i = 1;
while( i < 101){
if(i % 2 == 1){
sum += i;
}
i ++;
}
System.out.println("the sum is: " + sum);
}
}
for循环与while循环的区别:for循环的步进语句还能接着走,而whlie的步进语句由于continue跳出了循环,导致剩余内容的步进语句也没被跳过

public class ContinueDemo{
public static void main(String[] arg){
for(int i = 1; i < 10; i ++){
if(i == 4){
continue;
}
System.out.println(i);
}
System.out.println("=====================");
int i = 1;
while(i < 10){
if(i == 4){
continue;
}
System.out.println(i);
i ++;
}
}
}
//输出结果为:
1
2
3
5
6
7
8
9
=====================
1
2
3

1.for循环格式固定,控制次数更方便,而while循环格式更加灵活,不在意循环次数,循环次数确定的使用for较多,次数不确定,使用while较多

2.for循环小括号内定义的变量,循环内可用,循环外不可用,while循环的初始化表达式本来就在外面,仍然可用

3.跳转语句continue的效果不同:

跳转控制语句:

  1. break语句:跳出循环
  2. continue语句:只跳出本次循环,后续还要继续循环

死循环(永真循环):
这两种方法可以实现死循环

while(true){
}
for(; 😉{
}

嵌套循环:

//打印一天中所有可能出现的时:分
public class Clock{
public static void main(String[] arg){
for(int i = 0; i < 24; i ++){
for(int j = 0; j < 60; j ++){
System.out.println(i +":" + j);
}
}
}
}

7.集成开发环境(IDE)

我们这里介绍Eclipse,因为他是完全免费的

Eclipse IDE基本特点:

  • 完全免费
  • 完全开源
  • java语言编写
  • 绿色软件:解压就能用,不用安装
  • 扩展性很强

下载:官网:http://www.eclipse.org
安装:解压就可直接使用
卸载:删除从官网下载的文件夹即可

Eclipse使用的常用快捷键

  • 添加单行注释:Ctrl + / 取消:Ctrl + /
  • 添加多行注释:Ctrl + Shift + / 取消:Ctrl + Shift + /
  • 向上向下复制一行:Ctrl+Alt+向上/向下
  • 向上向下移动一行:Alt+向上/向下
  • 删除当前行:Ctrl+D
  • 格式化:Ctrl+Shift+F
  • 智能提示:Alt+/

8.数组的使用

概述:数组是一种引用类型。变量只可以存放一个数据,数组则可以存放多个类型统一的数据,可以存放基本类型,也可以存放引用类型;

数组的格式:

  • 数据类型[] 数组名称;
  • 数据类型 数组名称[];(不推荐)

数组的初始化:使用之前一定要先初始化

1.动态初始化:指定数组的长度

//创建了一个可以存放三个数据的int类型的数组array1
int array1 = new int[3]
2.静态初始化:指定数组的内容,会自动根据内容推算出数组的长度

/标准格式, 标准格式可以拆分为
int array2[];
array2[] = new int[]{1, 2, 3};
/
int array2[] = new int[]{1, 2, 3};
System.out.println(array1);
/简便格式,不可以拆分为
int array3[];
array3 = {1, 2, 3};
/
int array3[] = {1, 2, 3};

数组的访问:

  • 直接打印array1会得到一个包括地址值,如[I@15db9742
  • 打印array1[0]:会得到数组中索引为0的值,数组的索引也就是数组中元素的编号,编号从0开

数组的默认值:

当你没有给数组赋值的时候,数组会有自己的默认值,不同数据类型的数组会有不同,整数类型的数组的默认值为0,布尔值类型的数组的默认值为false,浮点类型的数组的默认值为0.0

数组获取长度:数组名称.length,当一个数组在内存中被创建了的时候,那么数组的长度旧不能发生改变

数组在堆栈中存放的情况:

二维数组:元素是一维数组的数组

1.格式:

A.数据类型[][] 数组名 = new 数据类型[m][n];

B.数据类型[][] 数组名 = new 数据类型[m][];

C.数据类型[][] 数组名 = new 数据类型[][]{{...},{...}};

D.数据类型[][] 数组名 = {{...},{...}};

9.java内存分配

栈(Stack):主要用来存放局部变量

堆(Heap):凡是new出来的东西,都在堆当中,都有地址,堆当中的数据有默认规则:

如果是整数,默认是0

如果是浮点数,默认为0.0

如果是字符,默认是‘\u0000’(Unicode写法)

如果是布尔值:默认是false

如果是引用类型(包括Striing),默认是null(空常量)

数据使用完毕后,在垃圾回收器空闲的时候回收

方法区(Method Area):

与面向对象的知识点相关,再后面详说

本地方法区(Native Method):

与操作系统相关

寄存器(Register):

与CPU相关,性能极高

10.方法

概述:对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”之中,并且起一个名字,使用代码的时候,直接找到名字调用即可;

方法的格式:

修饰符 返回值类型 方法名称(参数类型 参数名称){
方法体;
return返回值;
}

解释:

  • 修饰符:目前就用public static,后面再详细讲解其他修饰符
  • 返回值类型:方法最终产生的数据是什么类型
  • 方法名称:自定义的名字,规则和变量一样
  • 参数类型:进入方法的数据是什么类型
  • 参数名称:进入方法的数据,对应的变量名称
  • 方法体:需要执行的若干代码
  • return:有两个作用,结束当前方法和带着后面的返回值交给调用处
  • 返回值:方法的最终数据结果

注意事项:

  • 返回值类型必须和返回值对应
  • 如果参数有多个,那么使用逗号隔开
  • 如果不需要参数,那么小括号内可以留空

调用方法的三种方法:

  • 单独调用:格式为 方法名称(参数值),这种调用无法使用方法中的返回值
  • 打印调用:格式为 System.out.println(方法名称(参数值)),调用方法,并把返回值打印出来
  • 赋值调用:格式为 数据类型 变量名称 = 方法名称(参数值),注意变量的数据类型必须和方法的返回值数据类型一致

有返回值的方法的例子:求两个数之和

public class Demo2 {
public static int plus(int num1, int num2){
return (num1 + num2);
}

public static void main(String[] args) {
int sum = plus(3, 4);
System.out.println("the sum is: " + sum);
}

}

关于名称的两个问题:

  • 变量的名称能不能和方法的名称一样?可以
  • 如果有两个方法,每一个方法当中都有一个同名的变量,是否可以?可以,虽然名称相同,但是他们是两个变量

没有返回值的方法格式:没有返回值的时候,只能使用单独调用,不能使用打印调用或赋值调用

修饰符 void 方法名称(参数类型 参数名称){
方法体;
return;//最后一行的return可以省略不写
}

无返回值的方法的例子(遍历数组并打印出来的方法):

public class Demo3 {
public static void arrayMethod(int[] array){
for(int i = 0; i < array.length; i ++){
System.out.println(array[i]);
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array1 = {1, 2, 3};
arrayMethod(array1);
}

}

方法的重载:

1.问题描述:对于类似的多个方法,全都是执行相加的操作,但是因为参数列表不一样,所有要记住很多名字,太麻烦

2.解决方案:使用方法的重载技术,可以达到效果,对于类似功能的多个方法,只要记住一个相同的方法名即可,可以根据参数列表的不同自动适配

3.方法重载(Overload):方法的名称相同,但是参数列表不同(包括参数个数不同,参数类型不同,参数的多类型顺序不同)

重载的例子:

public class Demo4 {
public static void main(String[] args) {
int sum1 = Plus(1, 2);//3
int sum2 = Plus(1, 2, 3);//6
int sum3 = Plus(1, 2, 3, 4);//10
System.out.println(sum1 + " " + sum2 + " " + sum3);
}
public static int Plus(int a, int b){
return a + b;
}
public static int Plus(int a, int b, int c){
return a + b +c;
}
public static int Plus(int a, int b, int c, int d){
return a + b + c +d;
}
}

重载的注意点:

1.无法根据参数的名称进行重载,当两个方法的参数名不同,但是功能完全一样时,不能进行重载

2.无法根据返回值类型的不同进行重载,当两个方法的返回值类型不同时,也不能进行重载

参数传递:

1.概述:在调用方法的时候,向方法内传入一些数据的动作

2.形式参数与实际参数:在定义方法的时候,写在小括号里面的参数就是形式参数,而在调用方法时,真正传入方法里的数据就叫做实际参数

3.参数传递的过程的两项规则:对于基本数据类型(以及String)来说,传递的是值,形式参数的操作不会影响实际参数;而对于引用类型(除String外),传递的是地址,形式参数的操作会影响实际参数

posted @ 2020-07-15 18:13  luyi001  阅读(189)  评论(0)    收藏  举报