面向对象进阶(一)
1 继承
- 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
- 此处的多个类称为子类(派生类),单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父
类” - 子类继承了父类,就继承了父类的方法和属性
- 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
- 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
- 子类不能直接访问父类中私有的(private)的成员变量和方法。
- Java只支持单继承和多层继承,不允许多重继承
- 类继承语法规则:
class Subclass extends SuperClass{ }
2 重写
在子类中可以根据需要对从父类中继承来的方法进行改造, 也称为方法的重置、覆盖override/overwrite。在程序执行时,子类的方法将覆盖父类的方法。
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、 参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限,子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常
3 修饰符
Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,用来限定对象对该类
成员的访问权限。
- 对于class的权限修饰只可以用public和default(缺省)。
- public类可以在任意地方被访问。
- default类只可以被同一个包内部的类访问。
4 super关键字
super用于引用当前对象的父类(超类)的成员变量和方法。super关键字在子类中使用,用于访问从父类继承而来的方法和属性。
5 多态
多态性,是面向对象中最重要的概念, 在Java中的体现:对象的多态性:父类的引用指向子类的对象。
- Java引用变量有两个类型: 编译时类型和运行时类型。
编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定。 - 简称: 编译时, 看左边;运行时, 看右边。
若编译时类型和运行时类型不一致, 就出现了对象的多态性。多态情况下, “看左边” : 看的是父类的引用(父类中不具备子类特有的方法);“看右边” : 看的是子类的对象(实际运行的是子类重写父类的方法)。
示例:
class Animal {
void makeSound() {
System.out.println("动物叫");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("狗叫");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("猫喵");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // 输出:狗叫
animal2.makeSound(); // 输出:猫喵
}
}
在上面的示例中,定义了Animal
类和两个子类Dog
和Cat
。在Main
类的main
方法中,我们创建了Dog和Cat的对象
,然后通过Animal类型的引用变量animal1和animal2来引用这两个对象
。通过编译时多态,编译器将根据引用变量的类型来确定调用哪个方法,在运行时,根据对象的实际类型来执行具体的方法。这就是运行时多态的体现。在运行时多态中,方法的调用取决于对象的实际类型,而不是引用变量的类型。
6 Object类
- ==:比较内存地址
- equals:比较内容,但是
默认比较内存地址
,String因为重写了equels,所以String比较内容,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
- 重写equals
@Override
public boolean equals(Object obj) {
return this.age == ((Bean) obj).age;
}
- toString():打印时,会打印toString()方法
- 重写toString()方法,来自定义打印信息
@Override
public String toString() {
return "Bean{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
- getClass:得到方法区中的类信息对象
7 自动装箱和拆箱
- 装箱:基本数据类型转换成包装类
Integer i1 = 100;
int i = 123;
Integer i2 = new Integer(123);
Integer i3 = new Integer("456");
//基本数据类型int->对应的包装类->Integer
//float-> Float
- 拆箱:包装类转换成基本数据类型
Integer i1 = new Integer(123);
int i2 = i1.intValue();//拆箱
Boolean b2 = new Boolean(false);
boolean b3 = b2.booleanValue(); //拆箱