1.Unicode,Ascill和UTF-8,ANSI 的区别
- Unicode,Ascill 是一种映射关系,记录了字符与数字相互的映射关系
- UTF-8 是一种编码方式,依赖Unicode的映射关系的编码方式。
- ANSI使用多个字节来代表一个字符的各种汉字延伸编码方式(国家不同)
详解:unicode、utf-8、ansi、gbk、gb2312编码详解-腾讯云开发者社区-腾讯云
ANSI详解:ANSI是什么编码? - malecrab - 博客园 (cnblogs.com)
2.表达式类型的自动提升
public class Test {
public static void main(String[] args) {
short a = 2;
// a = a + 2; 报错: Required type: short
// Provided:int
char c = 97;
// c = c + 2; //错误:c + 2 提升到int类型,不能直接赋值给char型
c += 2; //正确:这里Java会自动帮助您进行类型转换,因此不会报错
System.out.println(c); //打印出字符c,这里c会自动转化为char类型
}
}
3.逻辑运算符&与&&,|和 || 的区别 (page68)
&不会短路,作用与&&一致
|不会短路,作用与 || 一致
4.Java中方法
由函数发展而来,但是与函数又有显著不同
1)方法的属性:不能独立,必须依附于类或者实例对象
- 方法不能独立定义,只能在类体里定义
- 从逻辑意义上看,方法要么属于该类本身,要么属于该类的一个对象。
- 永远不能独立执行方法,执行方法必须使用类或者对象作为调用者。
2)方法的传参机制:值传递
基本数据类型:进行值传递。
eg:在main方法中调用A类的a方法(参数 int ),虚拟机运行main到到达a方法时,在A堆区里面传入参数进行运行方法。可是运行结束并不影响实参(在main方法中参入的变量)。
引用数据类型:进行值传递
同样的,引用变量储存的是在堆区的地址,传入方法是在堆区的地址,如果在方法中对引用变量中对应堆区的变量进行改值后,在原方法中的变量的对象也更改了值。
如果这里在方法中,传入引用数据类型参数,形参对应的值就是堆区的地址,这里如果对形参进行重新赋值,则不会改变原实参方法中的变量。
eg:
package Test;
public class Test {
public static void main(String[] args) {
Student student =new Student();
student.name = "hahaha";
student.id = 1;
A a = new A();
a.freeStudent(student);
System.out.println(student.id);
System.out.println(student.name);
a.changeStudent(student);
System.out.println(student.id);
System.out.println(student.name);
}
}
class A{
public void freeStudent(Student student){
student = null;
}
public void changeStudent(Student student){
student.id = 2;
student.name ="xixixixi";
}
}
class Student{
int id;
String name;
}
运行结果:
1
hahaha
2
xixixixi
所以发现第一个freeStudent并没有进行成功改变student的值,在第二个changeStudent中改变了student的值。(值传递)
形参个数可变的方法:在定义方法时在最后一个形参类型后面增加(...)表明该形参可以接受多个参数值,多个参数值被当作数组传入。
3)方法重载
允许在同一个类中定义多个同名方法,只要形参列表不同。
确实一个方法三要素:
调用者,(类或者对象)
方法名,(方法的标识)
形参列表,(与实参匹配)
5.隐藏与封装
访问控制符:private,protect,public
访问权限(当我们不写访问控制符时,默认为default。)
private (类中) < default(包中) < protect (包和其他包中子类) < public
6.类的继承(单继承)
实现继承的类被称为子类,被继承的类称为父类(基类,超类)利用extends关键字
父类包含的范围比子类大。
Object子类
子类重写父类的方法
当子类覆盖了父类的方法后,子类的对象无法访问父类中被覆盖的方法,但在子类方法中可以调用父类中被覆盖的方法。(父类中private修饰的方法不能重写)
super限定(限定该对象调用它从父类继承得到的实例变量和方法)
调用父类被覆盖的实例方法
实例变量:先在方法中找是否存在,如果不存在,再在类中找,如果还是不存在,再在父类中找
(如果子类中没有包含与父类同名的变量名,则无需显式使用super。)
调用父类构造器
在子类构造:显式调用,隐式调用父类构造器
java.lang.Object类构造器被默认执行
7多态
引用变量在编译阶段只能调用其编译时类型所具有的方法,运行时执行运行时所具有的方法。
这个在编译时看左边,执行时看右边。(方法)
编译看左边,执行看左边。(变量)
编译看父类是否存在这个方法,执行时先看子类是否存在这个方法。(如果有就执行子类中的方法)
在上图中,如果t实例不能执行print2,因为父类中没有这个方法。可以强转一下,就可以执行
比如:((Test)t).print2();
8.强制类型转换
基础类型之间的转化(在数值间),布尔与数值不能转换
引用数据类型:只能在具有继承关系的两个类型之间————-如果试图把父类对象强制转化为子类类型,这个对象必须实际是子类实例才行(编译时类型为父类,运行时为子类)否则会引发ClassCastException异常。
9.instanceof运算符
insanceof:判断前一个对象是否是后面一个类的实例,
如果是返回true,否则返回false。
10.使用继承注意点
子类不能随意更改父类的信息。如果要想子类重写父类的方法,则使用修饰符protect
11.组合设计
组合设计模式通常指的是将一个类的实例作为另一个类的成员变量,以实现类之间的组合关系。这种设计模式可以更好地解耦和管理类之间的关系。
12.初始化块(第四个成员,前面有:成员变量,方法,构造器)
初始化块的模板
[修饰符] {
//初始化块的可执行代码
...}
//初始化块的修饰符只能是static,使用static的被称为静态初始化块
//进行创建Java对象时,系统先调用该类里面的定义的初始化块,如果有两块初始化块,则先执行前面的初始化块//普通初始化块,声明实例变量指定的默认值都可以认为是对象的初始化代码。所以它们的执行顺序与代码的排序顺序相同
这个的运行结果:2
说明后面赋值语句后执行。
在Java创建一个对象时,系统先为该对象的所有实例变量分配内存,接着程序对这些实例变量执行初始化,其初始化顺序是:先执行初始化块或声明变量时指定的初始值,再执行构造器里面的指定初始值。(会先执行父类的初始化块Object)
在使用Javac编译后,初始化块会消失,初始化代码会被还原到所有到每个构造器中(位于最前面)
静态初始化块是再创建对象之前,他在类初始化时执行。
在系统第一次创建一个A类对象时,因为系统中还不存在A类,则需要加载并初始化A类,一旦A类初始化成功则A类在虚拟机中将一直存在,第二次创建A类对象时,无需对类再次初始化。