索引:
java基础语法;
基本数据类型和运算符;
JVM虚拟机的功能和结构;
java中的控制语句:选择,循环和转向;
递归的使用;
接收用户键盘输入,以及对象的创建;
实例和静态的区别以及关系;
构造方法以及变量类型;
静态代码块和实例代码块;
this关键字;
封装;
继承;
多态
super关键字;
一.java的基础语法:
1.标识符:
java中可以自己命名的都是标识符
一个合法的标识符只能由数字,字母,下划线,美元符号组成,且不能以数字开头
标识符需遵守驼峰命名规范,也就是以字母大小写来区分一句话由几个单词组成
关键字:
关键字是java提前定义好了,且带有特殊意义的单词,不能当做标识符,且严格遵循大小写
如:
public static void class byte short int long float double
boolean char true false if while for private protected .......等等都是关键字
2.字面量:
字面量在java中用于表示数据,字面量的种类有很多,如
整数型:1, 2, 3
浮点型:1.2, 1.3
布尔型:true, false(表示真或假)
字符型:'a', 'b'(在' '里面放一个字符或数字表示)
字符串型:"a", "ab"(在" "里面放一个或多个字符或数字表示)
3.其他书写规范:
类名,接口名:首字母大写,后面每个单词首字母大写
变量名,方法名:首字母小写,后面每个单词首字母大写
常量名:全部大写
4.转义字符"\":
"\n"表示换行
"\t"表示制表符,在打印输出时会变成制表符
\"表示普通"
\'表示普通'
\\表示普通\
等...
二.基本数据类型和运算符:
1.声明一个变量:
int a = 1;//字面量类型 标识符 赋值运算符 字面量;
声明变量时的位置决定了变量的类型,变量类型分为成员变量和局部变量
成员变量:在类中方法外声明的变量称为成员变量,可在整个类中使用
局部变量:在{ }(除类的{ }) 范围内声明的变量叫做局部变量,只能在{ }范围内使用
注意:局部变量和成员变量的取名可以相同,当发生重名变量时,java会采取就近原则
2.各类运算符的使用:
赋值运算符:
=: 将=右边的值赋给左边变量
+=: a += b等同于a = a + b;(其他同类型赋值运算符同理)
注意:a = b + 1;假如b是一个char类型,加上一个整数型的1,那么结果会变成int类型
而使用b += 1;结果还是char类型,所以,+=是不会改变数据类型的
算数运算符:
+(加),-(减),*(乘),/(除),%(相除取余数)
++,--: 自加一和自减一
注意:
int a = 1;
System.out.println(a++);//输出1
System.out.println(a);//输出2
//在++放在变量后时,会先执行java语句后再自加一(--同理)
//但如果++放在变量前,则会先自加一,再执行,如:
a = 1;
System.out.println(++a);//输出2
比较运算符:
顾名思义,但需要注意的是==是判断是否相等,!=表示判断是否不相等
比较运算符的结果必定是布尔类型,也就是true和false
100 != 200//结果为true
100 >= 200//结果为false
逻辑运算符:
逻辑运算符的两边必须放上布尔类型表达式
&& :短路与,当两边都为true时,则整体为true,否则为false
||: 短路或,当两边存在至少一个true时,则整体为true,否则为false
& , | :逻辑与和逻辑或,用法和上述相同,但更耗费内存,通常不使用(区别在于短路与和短路或,在只判断左边就能得出结果的情况下,不执行右边的表达式,而逻辑与和逻辑或会继续执行右边表达式)
^: 当两边都为true,或都为false时为true,否则为false
三目运算符:
布尔表达式 java语句 : java语句;
当布尔表达式为true时,则执行左边语句,否则执行右边
3.基本数据类型的一些特点
数据类型 | byte(字节型) | short(短整型) | int(整型) | long(长整型) | float(单精度) | double(双精度) | boolean(布尔型) | char(字符型) |
占用字节 | 1 | 2 | 4 | 8 | 4 | 8 | 1 | 2 |
取值范围 | -128~127 | -32768~32767 | -2147483648~2147483647 | -2的63次方~2的63次方-1 | -32768~32767 | -2的63次方~2的63次方-1 | true,false | 0~65535 |
缺省默认值 | 0 | 0 | 0 | 0L | 0.0f | 0.0 | false | '\u0000' |
注意:因为浮点型包含小数,所以实际上浮点型能表示的数比整数型要多的多
还有short和char的容量虽然一样,但char能表示更大的数
4.类型转换
小转大(如short转int,自动类型转换,不会损失精度)
short a = 1;
int b = a;//自动类型转换
大转小(如long转int,强制类型转换,如果值大于目标类型的取值范围,则会损失精度)
long a = 1L;
int b = (int)a;//强制类型转换,需要强制类型转换符
三.JVM虚拟机的功能和结构:
如上.
四.java中的控制语句:选择,循环和转向:
1.选择语句:
if的几种用法
1)if(布尔表达式){ }
如果if内的布尔表达式为true,则执行if里的java语句
2)if(布尔表达式){ }
else if(布尔表达式){ }
如果未通过第一层if判断,则继续往下进行判断,可以重复嵌套
3)if(布尔表达式){ }
else { }
布尔表达式为true,则执行if中java语句,为false,则执行else语句
这种用法的优点是,必定执行其中一个java语句
switch语句
switch(值){
case 值1:
java语句;
java语句;
break;
case 值2:
java语句;
java语句;
break;
default:
java语句;
}
以上是一个完整的switch语句:
其中:break;语句不是必须的,default分支也不是必须的
switch支持int类型和String类型
执行原理:switch的值会与值1比较是否相等,遇到break停止执行
相等则执行,不相等则继续与值2比较,如果没有遇到break则会发生case穿透现象
如果所有分支都不执行,则执行default分支
可以一条代码写多个case,叫做case合并
case也可以取多个值
2.循环语句
break;//终止循环
continue;//终止此次循环
以上代码属于转向语句,可用于循环语句中
for循环
1)语法:
for(初始化表达式;布尔表达式;更新表达式){
循环体;
}
执行顺序:
先执行初始化表达式,再判断布尔表达式是否为true,如为true,则执行循环体,再执行更新表达式,再进行布尔判断,直到布尔表达式为false则终止
2)for循环嵌套,以及终止指定循环
a:for(初始化表达式;布尔表达式;更新表达式){
b:for(初始化表达式;布尔表达式;更新表达式){
break a;//用这种方式可以在内循环中终止外循环,但并不常用
}
}
while循环和do....while循环
语法:
while(布尔表达式){
循环体;
}
执行顺序:
布尔表达式为true时,则执行循环体,直到布尔表达式为false时停止
do{
循环体;
}while(布尔表达式);
执行顺序:
和while相反,do..while先执行循环体,再对布尔表达式进行判断
3.转向语句
五.递归的使用:
递归的就是return时调用自己
原理就是return时创建一个和自己一样的方法(需要压栈)将参数传入进行计算,依次类推直到满足条件
就会从最后一个方法逐个返回目标值到第一个方法,此时弹栈
递归非常耗费内存,如果递归没有结束条件,很容易引起栈内存溢出
六.接收用户键盘输入,以及对象的创建:
接收用户键盘输出使用的是java.util包下的Scanner方法
java.util.Scanner s = new java.util.Scanner(System.in);
//将用户输入的数据的内存地址保存在s中,这属于创建对象
可以借用Scanner中的方法将键盘输入的数据转化为指定类型
如:
next();//转化为字符串,并删除空格
nextLine();//转化为字符串
nextInt();//转化为int类型
创建对象
在本类中想要使用其他类中的实例方法时就需要用到创建对象
创建对象语法如上图
class a = new class();//假设class是一个其他类
new class();就是一个对象的内存地址,该内存地址被赋值给a
此时该对象会在jvm的堆内存中开辟空间,保存在堆内存中
而作为对象内存地址的a保存在栈内存中,该内存地址指向堆内存中的对应对象
此时a可代替class的类名使用
a属于引用数据类型
七.实例和静态的区别以及关系:
该部分内容如上图所示
八.构造方法以及变量类型:
1.构造方法:
构造方法的语法结构是:
{修饰符列表} 构造方法名 (形式参数列表){
构造方法体;
一般在构造方法体中给属性赋值,完成属性的初始化.
}
构造方法在创建对象时调用
构造方法分为无参构造和有参构造(一个类中无参必须要写,不写形式参数列表就是无参构造)
class a = new class(实际参数列表);
创建对象时会调用形式参数列表和实际参数列表相同的构造方法,这里涉及到方法重载机制
2.方法重载机制overload
当有多个功能类似的方法时可以给他们取一样的方法名,会自动匹配相应的方法
什么情况下会发生方法的重载?
1 在同一个类当中
2 方法名相同
3 参数列表不同(包括:参数个数不同,参数的类型不同,参数的顺序不同)
与返回值类型和修饰符无关
九.静态代码块和实例代码块:
静态代码块在类加载时执行,静态代码块并不常用,主要用于记录类加载的日志,即类加载的时间信息
实例代码块在创建对象时执行
十.this关键字:
this表示内存地址指向自身的引用,一般用于同名变量的区分
this(实际参数列表)表示调用自身类中的构造方法
只能出现在构造方法的第一排
注意:this属于实例相关,不能在静态方法中使用
十一.封装:
封装需要用到private关键字
private和public一样都属于修饰符列表,private表示私有的
既能修饰变量也能修饰方法
被private修饰的方法无法被继承,且只能在本类中使用,没有办法在其他类中使用被private修饰的方法
同样,被private修饰的变量也只能在本类中使用,但可以通过set和get方法进行写入和修改,如上图.
十二.继承:
继承就是使用extends关键字
class a extend b{
}
表示a类继承b类除构造方法以外所有内容,详细解说如上图
子类中的一个方法如果和父类中的一个方法除了访问权限(访问权限可以更高,也可以不变,但不能变低)完全相同时(图中红字部分),就会覆盖掉父类的方法(称为方法的覆盖或者说方法的重写)
十三.多态:
1.多态的定义:
多态表示多种形态
编译时一种形态
运行时另一种形态
向下转型和向上转型
1)向上转型
父类 a = new 子类();//前提是子类必须重写父类的一个方法
父类对象指向子类引用,属于向上转型
编译时编译器会绑定父类当中的指定方法(静态绑定)
运行时实际上参与的是子类中的指定方法(动态绑定)
向下转型
向下转型用于父类调用子类独有方法时
需要使用强转符号将父类强转成子类
父类 a = new 子类();
子类 b = (子类)a;
3.instanceof关键字
但需要注意的是如果有多个子类
在不知道想要强转的变量是否指向指定子类时
所以需要使用instanceof关键字对其进行判断以保证程序运行正常,使用方法见上图
十四.super关键字:
super和this类似
super表示指向父类对象的引用
super()表示调用父类的构造方法
只能出现在构造方法的第一排,即使不写也会默认存在
详细请见上图