Java基础SE.02.Java基础语法
1.Java标识符,关键字,保留字,注释
1.标识符
要求:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3V0nOyI-1602930250513)(/image-20200923191839184.png)]
规范:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xB3Dd5Nk-1602930250516)(/image-20200923191907479.png)]
2.关键字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i8M9dPcf-1602930250518)(/image-20200923191934136.png)]
3.保留字(goto,const)
4.注释
单行注释://
多行注释:/* /(多行注释不可以嵌套使用)
文档注释:/*
文档注释(是可以被解析的,Java特有的)
@author shkstart
*/
javadot -d mydoc(文档名字) -author -version HelloWorld.java(java文件的名字)
2.Java变量及数据类型
1.数据类型的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwuYLnU1-1602930250521)(/image-20200923194251861.png)]
引用数据类型还包括:枚举(enum)、注释(Annotation)、null…等
1.整数类型:byte,short,int,long
①byte:1字节 = 8bit, 范围-128 -127
②short:2字节
③int:4字节
④long:8字节,long型常量须后加‘l’或‘L’
⑤通常定义整型变量使用int
2.浮点类型:float,double
①单精度float:4字节,尾数可以精确到7位,float常量须后加‘f’或‘F’
②双精度double:8字节,尾数是float的两倍
③通常定义浮点型变量使用double型
3.字符型char
①char:1字符 = 2字节
②定义char型变量,通常使用一对’’,内部只能写一个字符
③表示方式:1.声明一个字符 2.转义字符 3.直接使用Unicode值来表示字符型常量‘\u+代表字符的值’
④\n换行符 \t制表符
4.布尔型:boolean
①boolean:一字节
②只能去两个值之一:true,false
③常常在条件判断、循环结构中使用
2.变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3SESlBTO-1602930250524)(/image-20200923195828691.png)]
1.类变量:又称全局变量或静态变量,需要使用static关键字修饰。在定义以后就已经存在并且占用内存空间,可以通过类名来访问,不需要实例化。全局变量存储在内存的方法区中。
2.对象实例级变量:就是成员变量,实例化后才会分配内存空间,才能访问。
3.方法级变量:就是在方法内部定义的变量,即局部变量。
注意:内存管理系统会根据变量的数据类型决定开辟内存空间的大小,这个空间只能储存对应的数据类型。
3.变量的内存解析
1.虚拟机栈(Java Virtual Machine Stacks)
每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。
基本数据类型直接储存在栈中,引用数据类型则保存的是一个指向对象起始的引用指针,指向堆中的值。
2.堆(Java Heap)
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
Java 堆是垃圾收集器管理的主要区域,
3.方法区(Method Area)
方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
根据以上可知:
对局部变量来说,局部变量的数据类型如果是基本数据类型,则局部变量都储存在栈中,随着方法的结束而被清理,所以方法外不能引用方法内的变量。而引用数据类型的局部变量则在栈中保存的是一个地址值,指向堆中的值。
对成员变量来说,成员变量只有在被实例化以后才会占用内存空间,当声明的是基本类型的变量其变量名及其值放在堆内存中的引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中
对全局变量来说,全局变量储存在方法区,他不会随着方法的结束而被垃圾回收。
特殊的:String的值存在方法区的常量池中,如果有两个String类型的值相同时,则他们的地址值相同
4.自动类型提升
当容量小的数据类型变量与容量大的数据类型变量做运算时,结果自动提升为容量大的类型
byte 、char、 short --> int --> long --> float --> double
5.强制类型转换
自动类型提升运算的逆运算,由容量大的数据类型转换为容量小的数据类型
①需要使用强转符:()
②注意点:强制类型转换,可能导致精度损失
3.Java运算符
1.算数运算符:
+,-,*,/,%,++(在前先赋值在运算,在后先运算后赋值),–(),+(字符串连接)
//案例
int num1 = 12;
int num2 = 5;
double result1 = num1 / num2;//2.0
double result2 = (double)num1 / num2;//2.4
double result3 = num1 + (num2 + 0.0);//2.4
//案例 %:取余运算
结果的符号与被模数的符号相同
{
int m1 = -12;
int n1 = 5;
System.out.println(m1 % n1);//-2
}
前++,后++
//案例问题
{
byte b1 = 127;
b1++;
System.out.print(b1);//-128
}
//案例:给一个三位数的整数,打印出他的个位数,十位数,百位数。
{
int num = 123;
int bai = num/100;
int shi = num%100/10;
int ge = num%10;
System.out.println("百位为" + bai);
System.out.println("十位为" + shi);
System.out.println("个位为" + ge);
}
2.赋值运算符:
=,+=,-=,*=,/=,%=
//案例
{
short s1 = 10;
s1 += 10;//不会改变本身的数据类型
}
//如果要实现+2的操作,推荐:num += 2;
//如果要实现+1的操作,推荐:num++;
//案例
{
int m = 10;
int n = 5;
n *= m++;//m = 100;
n += (n++) + (++n);//n = n + (n++5) + (++n7);
}
3.比较运算符(关系运算符):
==,!=,<,>,<=,>=,instanceof(检查是否是类的对象)
比较结果为boolean型
4.逻辑运算符:
&,|,!,&&,||,^(运算优先级:非,与,或)
//案例 区分&,&&
{
boolean b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){
System.out.println("aaa");
}else{
System.out.println("bbb");
}//bbb
System.out.println(num1);//11
boolean b2 = false;
int num2 = 10;
if(b2 && (num2++ > 0)){
System.out.println("aaa");
}else{
System.out.println("bbb");
}//bbb
System.out.println(num2);//10(短路,不给num2+1)
}
//&和&&的区别
//相同点1:& 和 && 的运算结果相同
//相同点2:当符号左边是true时,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边的运算。&&不在执行
//|和||的区别
//相同点1:| 和 || 的运算结果相同
//相同点2:当符号左边是false时,二者都会执行符号右边的运算
//不同点3:当符号左边是true时,|继续执行符号右边的运算。||不再执行
//开发中推荐使用 && 和 ||
5.位运算符:
<<,>>,>>>,&,|,^,~
<<左移,在一定范围内,每向左移一位,数值*2
>>右移,在一定范围内,每向右移一位,数值/2
>>>无符号右移,无论正负最高位都拿0补
&,都为1时为1,0101 & 0001 得 0001
|,有一个为1时为1,0101 | 0001 得 0101
^,不相同时为1,0101 ^ 0001 得 0100
~,取反1变0,0变1,0101 和 1010 互为取反
//案例 交换两个变量的值
{
int num1 = 10;
int num2 = 20;
//方法一:定义临时变量
int one = num1;
num1 = num2;
num2 = one;
//方法二:弊端①可能超出储存范围②只适合于数值运算
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
//方法三:(m^n)n == m
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
}
6.三目运算符(三元运算符)
结构:(条件表达式)?表达式1:表达式2
说明:
如果程序既可以使用三元运算符又可以使用if-else,那选择使用三元运算符
//案例 获取两个数的较大值
{
int m = 12;
int n = 5;
int max = (m > n) ? m : n;//12
}
4.Java流程控制
1.顺序结构
程序从上到下执行
2.分支结构
1.if-else
//案例
{
bolean x = true;
bolean y = false;
short z =40;
if((z++ == 40) && (y = true)){
z++;//42
}
if((x = false) || (++z == 43)){
z++;//44
}
System.out.println(z);
}
//案例
//三个变量进行排序,从小到大输出
import java.util.Scanner;//导包
class IfTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数");
int num1 = scan.nextInt();
System.out.println("请输入第二个数");
int num2 = scan.nextInt();
System.out.println("请输入第三个数");
int num3 = scan.nextInt();
if(num1 < num2){
if(num1 < num3){
if(num2 < num3){
System.out.println(num1+","+num2+","+num3);
}else{
System.out.println(num1+","+num3+","+num2);
}
}else{
System.out.println(num3+","+num1+","+num2);
}
}else{
if(num2 < num3){
if(num1 < num3){
System.out.println(num2+","+num1+","+num3);
}else{
System.out.println(num2+","+num3+","+num1);
}
}else{
System.out.println(num3+","+num2+","+num1);
}
}
}
}
2.switch-case
//案例 输入一个月份和日期,输出他是今年的第几天
{
Scanner scan = new Scanner(System.in);
System.out.println("请输入月份");
int month = scan.nextInt();
System.out.println("请输入日期");
int day = scan.nextInt();
//定义一个变量保存天数
int sumDays = 0;
switch(month){
case 13:
sumDays +=31;
case 12:
sumDays +=30;
case 11:
sumDays +=31;
...
case 2:
sumDays +=31;
case 1:
sumDays +=day;
}
}
3.循环结构
循环结构的四个要素
①初始化条件
②循环条件
③循环体
④迭代条件
for(①;②;④){
③
}
//案例
{
int num = 1;
for(System.ou.print("a");num<=3;System.ou.print("c"),num++){
System.ou.print("b")
}//abcbcbc
}
//案例
//获取最大公约数
{
int min = (m <= n)?m:n;
for(int i = min;i>= 1;i--){
if(m % i ==0&& n % i == 0){
System.out.println(i);
break;//求最大公约数,最小公倍数同理
}
}
}
for(对象类型 变量名称 : 对象名){
}
2.while循环
循环结构的四个要素
①初始化条件
②循环条件
③循环体
④迭代条件
①
while(②){
③;
④;
}
//说明:①不能丢失迭代条件,防止死循环②for循环和while循环可以相互转换
//不同点:①定义的变量,for循环定义在循环体里,外部不可用,while定义在循环体外,外部可用。
do…while
①
do{
②;
③;
}while(④);
① ——> ② ——> ③ ——> ④ ——②③④…
//说明do…while至少会执行一次循环体
//案例 输出数,提取负数和正数的个数,当输入0时停止
import java.util.Scanner;
class ForWhileTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int positiveNumber = 0;//正数的个数
int negativeNumber = 0;//负数的个数
while(true){
int number = scan.nextInt();
if(number > 0){
positiveNumber++;
}else if(number < 0){
negativeNumber++;
}else{
break;
}
}
System.out.println("输入正数的个数" + positiveNumber);
System.out.println("输入负数的个数" + negativeNumber);
}
}
4.break,continue,return关键字
break:结束当前循环
continue:结束当次循环
return:无需判断条件返回一个值
//案例
{
label:for(){
for(int i = 1; i < 10 ;i++){
if(i % 4 == 0){
break;//输出123
continue;//输出1235679
break label;//结束对应标签的循环
continue label;//结束对应标签的当次循环
}
System.out.println(i);
}
}
}
//案例 一个数等他的因子之和,成为“完数”,例6 = 1+2+3,找出1000以内的完数(因子,除去他本身的其他约数)
{
for(i = 1;i < 1000;1++){
int num = 0;
for(j = 1;j <= i/2;j++){
if(i % j == 0){
num += j;
}
}
if(i == num){
System.out.println(i);
}
}
}
作业
//99乘法表
public class List9_9 {
public static void main(String[] args) {
for(int i = 1;i <= 9;i++) {
for(int j = 1;j <= i;j++) {
System.out.print(j + "*" + i + "=" + i*j + " ");
}
System.out.println();
}
}
}
//100以内5的倍数
public class Mulitple_5 {
public static void main(String[] args) {
for(int i = 1;i < 100;i++) {
if(i % 5 ==0) {
System.out.println(i);
}
}
}
}
//输出100以内的质数
public class PrimeNumber_of_100 {
public static void main(String[] args) {
//方法一
for(int i = 2;i < 100;i++) {
for(int j = 2;j <= i;j++) {
if(i % j == 0) {
break;
}else if(j == i-1) {
System.out.println(i);
}
}
}
//方法二
list:for(int i = 2;i < 100;i++) {
for(int j = 2;j < i;j++) {
if(i % j == 0) {
continue list;
}
}
System.out.println(i);
}
}
}
//打印靠左三角形
public class TriangleGraphics {
public static void main(String[] args) {
TriangleGraphics tri = new TriangleGraphics();
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int nums = input.nextInt();
tri.Triangle(nums);
input.close();
}
public void Triangle(int nums) {
for(int i = 1;i <= nums;i++) {
for(int j = 1;j <= i;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
//打印靠右三角形
public class TriangleGraphics2 {
public static void main(String[] args) {
TriangleGraphics2 tri = new TriangleGraphics2();
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int nums = input.nextInt();
tri.Triangle1(nums);
input.close();
}
public void Triangle1(int nums) {
for(int i = nums;i > 0;i--) {
int x = 0;
for(int j = i - 1;j > 0;j--) {
System.out.print(" ");
x++;
}
for(int a = 1;a <= nums - x;a++) {
System.out.print("*");
}
System.out.println();
}
}
}
//打印等腰三角形
public class TriangleGraphics3 {
public static void main(String[] args) {
TriangleGraphics3 tri = new TriangleGraphics3();
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int nums = input.nextInt();
tri.Triangle1(nums);
input.close();
}
public void Triangle1(int nums) {
for(int i = nums;i > 0;i--) {
int x = 0;
for(int j = i - 1;j > 0;j--) {
System.out.print(" ");
x++;
}
for(int a = 1;a <= nums - x;a++) {
System.out.print("*");
System.out.print(" ");
}
System.out.println();
}
}
}
//打印空心等腰三角形
public class TriangleGraphics4 {
public static void main(String[] args) {
TriangleGraphics4 tri = new TriangleGraphics4 ();
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int nums = input.nextInt();
tri.Triangle1(nums);
input.close();
}
public void Triangle1(int nums) {
for(int i = nums;i > 0;i--) {
int x = 0;
for(int j = i - 1;j > 0;j--) {
System.out.print(" ");
x++;
}
for(int a = 1;a <= nums - x;a++) {
if(i >= nums - 1) {
System.out.print("*");
System.out.print(" ");
}else if(i == 1) {
System.out.print("*");
System.out.print(" ");
}else {
if(a == 1 || a == nums - x ) {
System.out.print("*");
System.out.print(" ");
}else {
System.out.print(" ");
System.out.print(" ");
}
}
}
System.out.println();
}
}
}
//日历
public class Calendar {
private int month;
private int year;
private int day = 1;
private int tt;//制表符的个数,判断月份的第一天是星期几
private int addMonth;//输入对应的月份的天数
public Calendar() {
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
//输入日历
public void addCalendar() {
System.out.println("一\t" + "二\t" + "三\t" + "四\t" + "五\t" + "六\t" + "七\t");
int days = 1;
int line = 0;//代表换行的变量
for(int i = 0 - tt;i < addMonth;i++ ) {
if(i < 0) {
System.out.print("\t");
}else {
System.out.print( days++ + "\t");
}
line++;
if(line % 7 == 0) {
System.out.println();
}
}
}
//输入制表符的个数 判断输入的月份是星期几
public void addTt() {
int monthNumber = 0;//保存当年月的天数
int yearNumber = 0;//保存当年距离2000年的天数
//计算输入的日期到2000年1月1日有多少天
for(int i = 2000;i < year;i++) {
if( !(i % 100 == 0) && i % 4 == 0 || i % 400 == 0 ) {
yearNumber += 366;
}else {
yearNumber += 365;
}
}
for(int i = 1;i < month;i++) {
if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
monthNumber += 31;
}else if(i == 2){
if( !(year % 100 == 0) && year % 4 == 0 || year % 400 == 0 ) {
monthNumber += 29;
}else {
monthNumber += 28;
}
}else {
monthNumber += 30;
}
}
if((monthNumber + yearNumber) % 7 < 2) {
tt = (monthNumber + yearNumber) % 7 + 5;
}else {
tt = (monthNumber + yearNumber) % 7 - 2;
}
monthDay();
}
//判断月份的天数
private void monthDay() {
if(month == 1 || month ==3 || month ==5 || month ==7 || month ==8 || month ==10 || month ==12) {
addMonth = 31;
}else if(month == 2) {
if(!(year % 100 == 0) && year % 4 == 0 || year % 400 == 0) {
addMonth = 29;
}else {
addMonth = 28;
}
}else {
addMonth = 30;
}
}
}
//测试类
import java.util.Scanner;
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = new Calendar();
Scanner input = new Scanner(System.in);
System.out.println("请输入年份");
int years = input.nextInt();
System.out.println("请输入月份");
int months = input.nextInt();
//写入年份和月份
cal.setMonth(months);
cal.setYear(years);
cal.addTt();
cal.addCalendar();
}
}
private void monthDay() {
if(month == 1 || month ==3 || month ==5 || month ==7 || month ==8 || month ==10 || month ==12) {
addMonth = 31;
}else if(month == 2) {
if(!(year % 100 == 0) && year % 4 == 0 || year % 400 == 0) {
addMonth = 29;
}else {
addMonth = 28;
}
}else {
addMonth = 30;
}
}
}
//测试类
import java.util.Scanner;
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = new Calendar();
Scanner input = new Scanner(System.in);
System.out.println("请输入年份");
int years = input.nextInt();
System.out.println("请输入月份");
int months = input.nextInt();
//写入年份和月份
cal.setMonth(months);
cal.setYear(years);
cal.addTt();
cal.addCalendar();
}
}