版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/imilano/article/details/79392140
1. 基本程序设计结构
- java区分大小写
- 命名规则:类名大写字母开头,每个单词第一个字母大写。
- main方法必定是public
- 数据类型:8中基本类型。
整形
数据类型 | 字节数 |
---|---|
int | 4字节 |
short | 2字节 |
long | 8字节 |
byte | 1字节 |
- 长整型有后缀L;二进制0b(0B)
浮点型
- 二进制的浮点型无法准确计算
- NaN(不是一个数字)
数据类型 | 字节数 |
---|---|
float | 4字节 |
double | 8字节 |
* char类型
码点:与一个编码表中的某个字符对应的代码值
变量
关键字final表示之歌变量只能被赋值一次。
static final:类常量,在一个类的多个方法中使用。
null表示变量没有设置任何值。
检测字符串是否想相等使用equals方法。
==检测的是两个字符串是否放在同一个位置上。如果虚拟机始终将相同的字符串共享,就可以使用==来检测是否相等。// 检测空串 if(lenth(a) == 0); //或者 if(a.equals("")); //检测null串 if(str == null); //检测既不是空串也不是null串 if(str != null && str.length() != 0); ``` 遍历字符串并查看码点: ```java int[] codePoints=str.codePoints().toArray(); String str=new String(codePoints,0,codePoints.length()); ``` * 大数值运算 ```java // BigInteger和BigDecimal实现处理任意长度数字序列的数值 BigInterger b = BigInteger.valueOf(100); BigInteger nb = b.muliply(b.add()BigInteger.valueOf(50)); ``` * 数组拷贝 ```java int[] arr=new int[]{2,4,6}; int[] newArray = Arrays.copyOf(arr,arr.length());
java中的对象都是在堆中构造的,构造器总是伴随着new操作一起调用。
Java程序设计语言总是按值调用:方法不能修改一个基本数据类型的参数,但是可以通过对象的引用修改对象的状态。
2. 对象与类
- 类设计技巧
- 一定要保证数据私有你。
- 一定要对数据初始化。
- 不要在鳄梨中使用过多的基本类型。
- 不是所有的域都需要独立的域访问器和域修改器。
- 将职责过多的类进行分解。
- 类名和方法名要足够能体现自己的职责。
- 优先使用不可变的类,避免线程不安全问题。
3. 继承
- 使用super关键字调用构造器的语句必须是子类构造器的第一条语句。
- 如果子类的额构造器没有显式的盗用超类的构造器,则将自动的嗲用超类默认的构造器。。
- 多态和动态绑定。
- 方法的名字和参数列表称为方法的签名。
方法调用步骤(以x.f(arg)为例):
- 编译器查看对象的声明类型和方法名。编译器会一一列举所有X类中名为f的方法和其超类中访问属性为public且名为f的方法。至此,编译器已经获得所有可能被调用的候选方法。
- 接下来,编译器查看调用方法时提供的参数类型。如果所有名为f的方法中存在一个与提供的参数类型完全匹配的方法,则选择这个方法,这个过程称为重载解析。
*上述过称为动态绑定。
*如果是private 方法、static方法、final方法或者构造器,那么编译器可以准确的知道应该调用哪个方法,这种调用方式称为静态绑定。 - 当程序运行并采用动态绑定方法时,虚拟机一定调用与x所引用对象的世纪类型最合适的那个类的方法。
每次调用时都要进行搜索,开销过大,因此虚拟机预先为每个类创建了一个方法表,其中列出了素有方法的签名和实际调用的方法。在真正方法调用时,虚拟机查找这个表就可以了。
阻止继承:final类和final方法:
- final类:不允许扩展的类称为final类。final类中所有的方法自动变成final方法,但是类中的域并没有变为final域。
final方法:阻止继承,防止子类复写。
强制类型转换
- 只能在继承层次内进行类型转换。
在进行类型转换前,使用instanceOf方法检测合法性。
抽象类
- 祖先类更加通用,定义抽象类并不是为了实例化,而是提供一个公用的实例接口,只是将他作为派生其他类的基类。
- 包含一个或多个抽象方法的类必须被定义为抽象类。
- 抽象类可以包含具体数据和实现方法。
- 抽象类不能实例化。
final类中的所有方法都自动变为final方法。抽象类中的方法不一定全是抽象方法。
Object类:所有类的超类
- equals方法,可重写。
- hashcode方法,可重写。
- hashcode定义在Object类中。
- 字符串的散列码是由内容导出的。
- 每个对象默认有一个散列码,其值为对象的存储地址。
- hashcode与equals的定义必须一致:同true同false。
toString方法
- 数组的toString使用Arrays.toString来获取数组字符串表示。
可变参数方法
- 形式:
public void demo(int a,Object...args)
- 上式的Object…args实际上是一个Object数组。
- 枚举类
枚举类比较值时,永远不需要调用equals方法,直接用==即可。
*toString的逆方法是静态方法valueOf反射
*
*
*
*继承的设计技巧
- 将公共操作和域放在超类。
- 不要使用受保护的域。
- 使用继承实现“is a”关系
- 除非所有继承的方法都有意义,否则不要使用继承。
- 在覆盖方法时,不要改变预期的行为。
*使用多态,而非类型信息。
*不要过多的使用反射。
4. 接口、lambda和内部类
接口要点
- 接口中的所有方法自动属于public。
- 接口中的域被自动设为public static final
- 接口不能含有实例域和静态方法。可以将接口看成没有实例域的抽象类。
- 接口可以包含常量。
- 接口不是类,不能用new运算符实例化一个接口。
- 接口变量必须引用实现了接口的类对象。
- 用instanceOf检查一个对象是否实现了某个特定的接口。
- 静态方法可以通过类名调用,也可以通过类的实例对象调用。静态方法只能访问类的静态属性,不能访问非静态属性。若要访问非静态属性,可以通过类对象访问。
可以为接口提供一个默认实现(以default修饰符标识)。
接口冲突:一个类扩展了一个超类同时实现了一个接口。方法冲突时:
- 超类优先。优先考虑超类的方法。
- 接口冲突。接口具有相同的方法时,编译器会报错,自己选择一个实现。