1,面向对象的三大特性:封装、继承、多态
封装:通过访问控制符来操作那些暴露那些隐藏,按权限递增列出。private(当前类访问权限)、default(包访问权限)、protected(子类访问权限)、public(公共访问权限)
继承:Java是单继承的,关键字extends。作用是让子类对父类功能进行扩展,能获取父类的成员变量和方法。也是一种规范吧
- 1,注意不过子类不能获取父类的构造器
- 2,尽量隐藏父类内部的数据
- 3,不要让子类可以随意访问、修改父类的方法。
- 4,尽量不要在父类构造器中调用将要被子类重写的方法
- 5,如果要调用父类的方法和属性,直接用super.方法名或者变量名
多态:一个是编译时类型,一个是运行时的类型。编译类型由声明的类型决定,运行类型由实际赋值的类型决定。如果编译时类型和运行时类型不一致,就可能出现多态
- 上转型:把一个子类对象直接赋给一个父类对象引用变量,无须进行类型转换,因为系统自动完成的。证实了子类是一个特殊的子类。
2,数组是引用数据类型,定义数组时不能指定数组的长度
3,重写和重载:
重写是发生在继承的父子类之间的,子类有和父类相同的方法(包括方法名,返回值,参数个数和类型)
重载发生在同一个类中,方法的方法名相同,返回值、参数不同
重写父类方法时,访问的权限只能更大或者相等
方法重载时,尽量不要包含可变形参,可读性降低了。
4,强制类型转换
基本类型,只能在数值类型之间进行,数值类型不能与布尔类型之间进行转换。
- 基本类型包含数值型和布尔类型。数值类型包括byte、short、int、long、char、float、double,布尔类型包括turn和false
引用类型,有继承关系的两个类型之间进行
- 引用类型包括类、接口、数组
- 空类型既是null类型,空引用(null)只能转换成引用类型。
5,补码计算规则
- 正数的补码和原码相同;负数的补码是其反码加1。补充,记得补码的最高位是符号位,0表示是正数,1表示是负数。
6,除零异常
一般发生除0异常是整数才会有的。浮点数除0和整数除0.0,都就不会异常
Java提供了三个特殊的浮点数值,正无穷大、负无穷大和非数(NaN)。
正浮点数除以0就会得到正无穷大;负浮点数除以0就会得到负无穷大;0.0除以0.0或者负数开方都得到一个非数(NaN)。
所有正无穷大的数值是相等的,所有的负无穷大的数值也是相等的。非数都是不相等的。
7,float a=3.4;//这样是会出现错误的,因为3.4默认是double类型的。如果要将一个的double类型的数转换成float类型就要进行强制类型转换。
8,int c=++a + 3;//运算顺序是a先自增再进行算术运算
9,左移(<<)、右移(>>)
左移n位就相当乘以2的n次方,如5 << 3,就是5*(2的3次方)= 40;负数也一样算,只不过在前面加一个负号;
右移n位就相当除以2的n次方,这都是对于正数而言的,如果是负数就要按原始方法来
10,静态导入,减少程序中代码的编写。
- 格式:import static package.subpackage…ClassName.*;
- 如:
import static java.lang.System.*;
import static java.lang.Math.*;
类里面就可以直接用了,out.println(sqrt(256));
- 如:
11,super(和this)不能出现在static修饰的方法中
12,instanceof运算符,前一个操作数通常是引用类型的变量,后一个操作数通常是一个类。这两个参数通常用有继承关系,要不就会引起异常编译无法通过。
- 主要应用用来判断一个对象的类型是否能成功,提高代码健壮性
13,初始化块的的执行在构造器之前就执行了,而静态初始化块又比普通初始化执行要早。静态代码块和静态成员是按代码的排列顺序来执行的
14,静态成员不能访问非静态成员,包括实例变量和实例方法
15,如果在静态方法里面,用this引用调用某成员,无法指向适合的对象。所以,static修饰的方法中不能使用this引用。
16,静态成员不能直接访问非静态成员。如:静态方法不能直接调用非静态方法。
17,类代码里没有定义构造器,系统将为它提供一个默认无参的构造器。如果有定义,系统就不会默认提供了。
18,如果希望通知垃圾回收机制某个对象,就要把这个对象引用变量赋值为null,如:Person p = new Person(); p = null;
19,初始化块的的执行在构造器之前就执行了,而静态初始化块又比普通初始化执行要早。静态代码块和静态成员是按代码的排列顺序来执行的
20,自动装箱拆箱过程,Integer缓存一个长度为256的数组,保存的值在-128到127。
- 如:
Integer int1 = new Integer(6);
Integer int2 = Integer.valueof(6);
int1 =int2;//这样就是直接从缓存中取Integer对象。
21,常量池专门用于在编译时就被确定下来并被保存在已编译.class文件中的一些数据。
- 发现这几种情况的在编译时期不能被确定下来。
- String s1 = “s111”;
String s2 = “s222”;
String s3 = s1 + s2; - 因为s1 s2是普通的变量,在编译时期无法确定下来,所以s3的值编译器无法在编译时期就确定下来。如果s1 s2用final修饰这样执行“宏替换”,在编译时就能被确定下来。
- 宏替换:使用final修饰,指定初始值,并且该值在编译时期就能被确定下来了。
String s4 = s1 + String.paraseString(“123”);//这样包含了方法也不能在编译时确定下来
- String s1 = “s111”;
22,final修饰属于不可变类型。如果修饰对象是引用类型时,不能改变其对象,却能改变对象的属性。
- 例如:final修饰指定的某人,就不能再改边指向其他人,但却能改变修饰人的一些属性(年龄,姓名等)
- final Person p = new Person();
- p = null;//不能再改变对象
- p.setAge(23);//这样是可以的,通过set方法改变
23,两个btye类型的数进行算术运算时,这两个数会被提升为 int 类型。
- byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
//因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错
24,运算类型自动提升。
short s1= 1; s1 = s1 + 1; 该段代码有错,short类型在进行运算时会自动提升为int类型,也就是说s1+1的运算结果是int类型。
short s1= 1; s1 += 1; 该段代码没错,+=操作符会自动对右边的表达式结果强转匹配左边的数据类型,所以没错
25,栈常用于保存方法帧和局部变量,而对象总是在堆上分配
26,final修饰的方法不能被重写,完全可以被重载
27,abstract不能用于修饰成员变量,不能修饰局部变量,不能修饰构造器。
28,static和abstract并不是绝对互斥的,虽然不能用时修饰某个方法,但它们可以同时修饰内部类
29,接口定义的变量只能是常量,如:int i = 20;//系统编译时,自动添加public static final修饰
30,接口是多继承的(多实现的),类属于单继承的
31,接口的注意用途:
定义变量,也可用于进行强制类型转换
调用接口定义的常量
被其他类实现,就是规范,或者回调,为系统提供更好的可扩展性和可维护性