引言
在Java中,继承是类与类之间的一种关系,分为父类和子类两种。这里和接口区分一下:一个类只能继承一个父类,而不能继承多个——即单继承关系;而一个类却可以实现多个接口。如下示例:
1 | 如:public class 子类 extends 父类{} |
子类继承了父类的所有内容,但是对于不同访问修饰父类修饰的属性方法,子类所调用的权限也不相同。对于public关键词修饰的属性和方法,子类同一个项目下都可以继承和调用。protected关键词修饰的属性和方法,可以在同包下和子类继承关系下继承和调用。对于缺省关键词的方法和属性,只能在同包下继承的调用,但是对于private修饰符修饰的属性和方法,只能自己该类使用。
子类继承父类的方法后,还可以根据需要重写其该方法。重写方法的名称必须与父类相同,访问修饰符可以和父类相同也可以比父类权限更大、返回值类型可以和父类相同也可以是父的子类,这样可以丰富扩展子类继承父类的方法。
对于继承父类的子类方法,在初始化方法时可以使用父类容器来初始化子类
OOP
继承
继承的内容
- 子类继承到父类的哪些东西?
所有
- 子类以及子类对象可以调用到继承的哪些属性和方法?
要看 父类的属性、方法的具体==访问修饰符==:
| 访问修饰符 | 访问范围 |
|---|---|
| public | 项目里 |
| private | 类里 |
| protected | 包下,不同包的子类 |
| 缺省 | 同包下 |
那么对于子类来说,
同包下:
只有private不能调用
不同包下:
public,protected 可以调用
==protected== 受保护的,子类不能访问父类的私有字段。不过有时候希望限制父类中的某个方法只允许子类访问,或者希望子类的方法访问超类的某个字段。
方法重写:
注解格式:除方法体之外与父类一致
访问修饰符:
子类中重写的方法,与父类权限一致或者大于(因为子类继承,希望它有更强的扩展性,所以权限理应更大)
返回值类型:
与父类方法的返回值类型类/子类
参数:
参数类型 不能修改
对于子类而言:子类及子类对象可以优先调用重写之后的
重载:
方法名相同,参数不一致(子类 父类也可以实现重载,并不会归为一种类型)
自动转型:
强制转型:int i = (int)1.2;
A a = new B();
A 是 B 的 父类——> 祖先
向上转型 之后 还会优先调用重写的方法吗?
会
子类对像 向上 -> 父类类型 ——>向下转回子类类型 【可以】
父类对象 –> 向下转型 子类类型 (==对象 无中生有== 子类可能有一些特别的属性方法 父类没有)【不可以】
==注意==:子类向上转型后,只能调用父类有的方法,并且是调的子类覆盖重写的,而不能调用子类独立的方法;子类独有的方法在父类中根本没有定义,所以父类无法找到子类独有的方法。
任务:一个类实例化的加载过程:
顺序:
1 | 1.加载静态成员/代码块: |
1 | 2.加载非静态成员/普通代码块,初始化构造方法:(实例块在创建对象时才会被加载。而静态成员在不创建对象时可以加载) |
问题:静态代码块只加载一次,静态方法先于静态代码块?
这里要看情况,我这里样例是 由于声明成员变量时调用到了静态方法 所以静态方法优先于静态代码块 但实际上这两者本没有优先区别
1 | class Base{ |
输出结果:
几个面试常见问题:
- 请解释hashCode()和equals()方法有什么联系?
1
2
3
4
5Java对象的eqauls方法和hashCode方法是这样规定的:
➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。
➁如果两个对象的hashCode相同,它们并不一定相同。 - 若对一个类不重写,它的equals()方法是如何比较的?
1
地址
- 请说明Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
1
2
3Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。
与此相对,方法覆盖是说子类重新定义了父类的方法。
方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。 - 请判断,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,该说法是否正确,为什么?
1
2
3
4
5
6不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降
(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降) - 请判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?==Java是值传递== 就算传的是对象 也是传的对象地址
1
2
3是值传递。Java 编程语言只有值传递参数。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。
对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
https://www.zhihu.com/question/31203609/answer/164430457接口
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。
与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要==实现接口里面所有的方法和属性==,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。






