一、权限修饰符
public, 缺省, protected,private
二、this和super关键字
this:表示当前对象
super:表示父类声明的成员
原则:遵循就近原则和追根溯源原则。
三、Object类
java.lang.Object类是所有java类的超类,即所有的Java类直接或间接的继承于此类。
- int hashCode(): 返回对象的哈希值,默认返回的是对象的内存地址转换而来的一个整数,建议子类重写。函数作用:为了提高哈希表性能
- Class getClass(): 返回对象的运行时类型。
- String toString(): 把对象转换为一个字符串,默认此方法返回的是对象的运行时类型名称+@+对象哈希值的十六进制。建议子类都重写该方法,用于返回对象的属性信息。System.out.println()输出对象时,默认会调用对象的toString方法。
- void finalize():垃圾回收期回收对象时会调用对象的此方法,已过时。
四、对象数组
4.1 介绍和内存分析
数组的元素是对象,即引用数据类型。在内存层面,数组存放在jvm的栈中,数组元素存放的是存放在堆中的对象的地址值。
Person[] ps = new Person[3];
ps[0] = new Person("张三", 18);
ps[1] = new Person("李四", 19);
ps[2] = new Person("王五", 20);
for(Person p : ps){
System.out.println(p);
}
4.2 对象数组排序
public class ObjectArrayTest {
public static void main(String[] args) {
Student[] students = new Student[5];
students[0] = new Student("xiaowang",80);
students[1] = new Student("xiaoming",90);
students[2] = new Student("xiaohua",100);
students[3] = new Student("huahua",79.5);
students[4] = new Student("yangyan",60);
//冒泡排序
for (int i = 0; i < students.length - 1; i++) {//第一层:冒泡多少轮
for (int j = 0; j < students.length - 1 - i; j++) {//第二层:每轮比较多少次
if(students[j].getGrade() < students[j+1].getGrade()){
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
//遍历输出
for (int i = 0; i < students.length; i++) {
System.out.println(students[i]);
}
}
}
五、多态
字面理解:事物在不同的条件环境下,呈现不同的状态。在java中,表示一个类在不同的情况下有不同的特性。
常用使用情况:
-
父类 father = new 子类(); //编译时创建的是父类对象
-
子类.方法(); //运行时实际调用的是子类的方法
5.1 多态理解
例子:当父类有多个方法是对同一个类的多个子类进行相同操作时,可以将多个方法抽象到其父类。如果是增加对特定子类的方法,违反了设计中的开闭原则。
开闭原则:对修改关闭,对扩展开放
在代码语法层面,表现为方法中的形参列表类型声明为父类,可以传递其子类对象实例进去。编译时子类可以作为父类进行传递,运行时可以使用子类的特性和方法。
- 提供代码的扩展性
- 降低了类与类之间的耦合度
5.2 多态的应用
- 赋值时的多态应用
public class ObjectArrayTest {
public static void main(String[] args) {
Pet[] pets = new Pet[3];
//多态在赋值上面的应用
pets[0] = new Cat();//猫
pets[1] = new Dog();//狗
pets[2] = new Pet();//宠物
}
}
- 方法返回值时的多态
public class ObjectArrayTest {
public Pet getPet(){
return new Cat();//返回宠物类或其子类都可以
}
}
- 传递参数的多态
public void feed(Pet pet){
pet.eat();
}
feed(new Dog());
feed(new Cat());
feed(new Pet());
5.3 向上转型/向下转型
① 子类类型自动转换为其父类类型
向上转型:父类 father = new 子类();
Animal a = new Cat(); //Cat -> Animal
② 父类类型转换为其子类类型,需要强制转换
向下转型:
Animal a = new Cat();//无法调用子类特有的方法
Cat c = (Cat) a;//向下转型,Animal -> Cat
c.eat();
类转换异常ClassCastException:原先创建的类型不能转换为其他类型,只能强制转换为其子类类型。转换类型前可以使用 instanceof来判断类型是否是需要转换的那个类型。
5.4 虚方法和实方法
虚方法:可以被重写的方法,没有static,final修饰。
实方法:有static,final修饰时,编译运行时都看左边。
查看具体调用哪个方法:
① 静态绑定:查看父类的方法
②动态分配:核实子类是否重写父类的该方法
六、静态static
①静态无法访问非静态的方法和属性。
②非静态可以访问静态的方法和属性
原因:静态的方法和变量先于非静态的方法和变量存入内存。