类型转换
1.拓宽基本类型转换
2.窄化基本类型转换
一元数字提升
将byte、short、char类型的一元数字自动提升为int类型(拓宽)
-
数组的索引、创建数组时的数组长度
-
一元运算符+
-
一元运算符-
-
按位取反(-)
-
位移(<<、>>、>>>)
-
二元数字提升
提升一个或两个数字(拓宽)
-
如任意一个数字是double类型,那么另一个就会被转换为double类型
-
float--转换为float
-
long转换为long
-
否则,两个数字都被转换为int类型
下列情况会执行二元数字提升
乘除取余、加法减法、比较、判等、位运算、三目
方法重载
栈帧
随方法的调用而创建,方法结束销毁,存储了方法的局部变量信息
递归调用
递归调用不终止将会一直消耗栈空间,最终导致内存溢出
必须要有一个明确的结束递归的条件,边界条件、递归基
变量
*在Java当中 没有所谓的无符号数字
-
当赋值的字面值大于这个变量能够保存的最大值时,程序会编译报错
byte--字节类型
short--短整型
long--长整型
浮点型
“0”,这个和浮点数的存储是有关系的
精度:float 小数点后6位
double 会存在一定的精度误差,浮点数是个近似值,并不是精确值
-
运行一个程序时,调用了才能运行
Unicode字符集:支持更多国家的语言(英文、希腊文)
4、字符串类型
C语言没有字符串类型
逻辑控制
顺序结构:按照代码结构一行一行执行
选择结构
if(布尔表达式){
//语句1
}else{
//语句2
}
1、运算符。 >>> 无符号右移 右移补0
2、逻辑控制-》if语句
break:让循环提前结束
continue:跳过这次循环,立即进入下一次循环
方法
方法重载
方法重写与重载的区别:
重载:
1、方法名称必须一样
2、方法的参数不一样{数据类型、个数、顺序}
3、返回值没有要求
递归
1、每次递归的时候,这个方法只执行了一部分,就去执行另一部分了
2、归的时候,会把当前方法剩余部分执行完毕
3、递的次数和归的次数是一样的
二叉树-》天生就是用递归来实现的
数组的初始化
数组的初始化主要分布为动态初始化和静态初始化
1、动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];
2、静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式:
T[] 数组名称 ={data1,data2,data3, ... ,};
int[] array1 ={0,1,2,3,4,5,6,7,8,9};
double[] array2 =new dounle[]{1.0,2.0,3.0,4.0,5.0};
String[] array3 =new String[]{"hello","JAVA","!!!"};
注意事项
1、静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
2、静态初始化时,{}中数据类型必须与[]前数据类型一致。
3、静态初始化可以简写,省去后面的new T[]。
如果数组中储存元素类型为引用类型,默认值为null
数组的使用
数组在内存中是一段连续空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。
for each 增强for循环
// 数组当中数据的类型定义的变量 : 数组名
for (int x : array1){
System.out.print(x+" ");
}
System.out.println();
*JAVA当中有 一个工具,可以专门用来操作数组,这个工具叫做Arrays.
//把数组转变为字符串,然后返回
String ret =Arrays.toString(array1);
一个引用不能指向多个对象
数组排序(冒泡排序)
给定一个是古族,让数组升序(降序)排序
假设排升序:
1、将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾。
2、依次从上述过程,直到数组中所有的元素都排列好
数组指针:指向数组的指针
指针数组:存放指针的数组
数组指针数组:存放数组指针的数组
类和对象
注意事项
1、一般一个文件当中只定义一个类
2、main方法所在的类一般要使用public修饰注意:Eclipse默认会在public修饰的类中找main方法
3、public修饰的类必须要和文件名相同
4、不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改
当成员变量没有初始化的时候,默认值就是对应的初始值。
引用类型-》null
this引用
this引用指向当时对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
只不过所有的操作对用户都是透明的,即用户不需要来传递,编译自动完成。
this引用的特性
1、this的引用类型:对应类型的引用,即哪个对象调用就是哪个对象的引用类型。
2、this只能在“成员方法”中使用。(静态成员方法不能使用)
3、在“成员方法”中,this只能引用当前对象,不能引用其他对象。
4、this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
对象的构造及其初始化
构造方法:名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。(没有返回值,类名和方法名一样)
当构造方法调用完成滞后,对象才实际上产生了。
特性:
1、名字必须与类名相同
2、没有返回值类型,设置为void也不行
3、创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。
4、构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
this(...)必须是构造方法中第一条语句
不能形成环
初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。
封装(套壳屏蔽细节)
面向对象程序三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
访问限制符
JAVA中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
JAVA中提供了四种访问限定符:
static成员
Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量)
static修饰的成员变量,称为静态成员变量(不属于某个具体的对象,是所有对象所共享的)
【静态成员变量的特性】
1、不属于某个具体的对象,是类的属性,所有对象共享的,不存在某个对象的空间中
2、既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3、类变量存储在方法区当中
4、生命周期伴随类的一生
static成员变量初始化
注意:静态成员变量一般不会放在构造方法初始化,构造方法中初始化的是与对象相关的实例属性。
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
内部类
实例内部类、静态内部类、局部内部类
在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类。
可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。
一个类对应一个字节码文件
【注意事项】
1、局部内部只能在所定义的方法内部使用
2、不能被public、static等修饰符修饰
3、编译器也有自己独立的字节码文件,命名格式:外部类名$数字内部类名字.class
4、几乎不会使用
继承和多态
继承:就是对共性的抽取,从而达到对代码的复用【重复使用】
私有的成员 可以被继承 但是不能访问
【注意】
1、子类会将父类中的成员变量或者成员方法继承到子类中了
2、子类继承父类之后,必须要新添自己特有的成员,体现出与基类的不同,否则就没有必要继承了
抽象类和接口
抽象类 使用abstract修饰类
抽象类当中 可以包含普通类所能包含的成员
抽象类和普通类不一样的是,抽象类当中可以包含抽象方法
抽象方法是用abstract修饰的,这个方法没有具体实现
不能实例化抽象类 new
抽象类存在的最大意义就是被继承
如果一个普通类继承了一个抽象类 此时必须重写抽象类当中的方法
如果一个抽象类A 继承了一个抽象类B,此时A当中不需要重写B中的抽象方法,但是如果A再被普通类继承,就需要重写。
抽象方法不能是私有的。也就是要满足重写的规则。
抽象方法不能被final和static修饰,因为抽象方法要被子类重写
抽象类当中 可以有构造方法。为了方便子类能够调用,来初始化抽象类当中的成员。
String字符串
String ret = str.toUpperCase();//转成大写
String ret2 = str2.toLowerCase();//转成小写