文章目录
- 一、java基础
- 二、面向对象基础
- 1.封装
- 2.继承
- 细节分析
- super关键字
- 重写和重载的比较:
- 3.多态
- 对象的多态:
- instanceOf :
- 动态绑定机制
- 多态数组
- 多态参数
- Object类
- equals方法
- hashCode方法
- toString方法
- finalize方法
- 总结
一、java基础
1.自动类型转化:(精度小的可以自动转到精度高的)
char->int->long->float->double
byte->short->int->long->float->double
2.基本类型转String:直接+
String转基本类型:通过基本类型的包装类调用:int num1 =Integer.parseInt(s);
3.运算符:短路与&&,一个为FALSE,不判断另外的。逻辑与则相反。其他类推。
4.数组:动态初始化int [] arr=new int[5]
5.JVM内存分配机制:
栈: 一般存放基本数据类型(局部变量)
堆: 存放对象(Cat cat , 数组等)
方法区:常量池(常量,比如字符串), 类加载信息
6.对象创建流程分析:
(1)加载Person类信息,只会加载一次
(2)在堆中分配空间(地址)
(3)完成对象初始化(默认初始化,显示初始化,构造器的初始化)
(4)对象在堆中的地址返回给p
7.访问修饰符:
二、面向对象基础
1.封装
(1)将属性私有化(2)提供公有化set和get方法
//我们可以将 set 方法写在构造器中,这样仍然可以验证
public Person(String name, int age, double salary) {
setName(name);
setAge(age);
setSalary(salary);
}
2.继承
语法:class 子类 extends 父类{}
细节分析
(1)子类必须调用父类的构造器, 完成父类的初始化
(2)当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作
(3)super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
(4)super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
(5)子类最多只能继承一个父类(单继承机制)
(6)查找属性的时候先从子类开始。如果子类没有,迭代向上找父类
super关键字
用于访问父类的属性、方法(private不行)、构造器
不限于父类,遵循就近原则。
super和this的比较:
重写和重载的比较:
3.多态
对象的多态:
编译类型看定义时=左边,运行类型看=右边。编译类型在定义对象时确定了,运行类型可以变化
Animal animal = new Dog()
animal = new Cat()
(此类型是向上转型)
向上转型:可以调用父类的所有成员,不能调用子类的特有成员,最终运行效果看子类的具体实现。
Cat cat = (Cat) animal
向下转型:子类类型 引用名 = (子类类型)父类引用。
可以调用子类中的所有成员
注:属性没有重写之说。属性的值看编译类型
方法看运行类型
instanceOf :
比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型
a instanceof B
动态绑定机制
1.当调用对象方法时,该方法会和该对象的运行类型绑定
2.当调用对象属性时,没有动态绑定机制。哪里声明,哪里使用。
P332
多态数组
示例代码
public class Polyarray {
public static void main(String[] args) {
Person[] persons = new Person[3];
persons[0] = new Person("jack",20);
persons[1] = new Student("bob",18,100);
persons[2] = new Teacher("zhang",45,2000);
for (int i = 0; i < persons.length; i++) {
System.out.println(persons[i].say());
if (persons[i] instanceof Student){
((Student) persons[i]).study();
}
if (persons[i] instanceof Teacher){
((Teacher) persons[i]).teach();
}
}
}
}
多态参数
方法定义的形参类型为父类类型,实参类型允许为子类类型
Object类
equals方法
==:既可以判断基本类型,也可以判断引用类型相等(地址)
equals:只能判断引用类型。默认判断的是地址,但是子类往往重写,比如Integer,String(判断的是值,可以看源码)
hashCode方法
两个引用,如果指向的是同一个对象,则哈希值肯定是一样的。
哈希值根据地址号来,但不等价于地址。
toString方法
全类名+@+哈希值的十六进制
直接输出一个对象时,自动调用它的toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
finalize方法
当某个对象没有任何引用时,JVM会认为这个对象为垃圾对象,会用垃圾回收机制来销毁该对象,先调用finalize方法。
总结
由于是复习,因此此前忘了的或者不会的会详细写,已经理解了的会忽略或简写。此章主要针对于java基础和面向对象的初级阶段的复习。