Java类、接口、枚举Q&A
2021-08-25 15:30:42 51 举报
AI智能生成
Java类、接口、枚举
作者其他创作
大纲/内容
Java中的继承体系
子类 静态代码块/成员属性--->
父类 对象属性/代码块初始化-->
父类 对象构造方法-->
子类 对象属性/代码块初始化-->
子类 对象构造方法
- Java中使用extends关键字来表示类继承关系。
- Java中使用implement关键字来表示接口实现关系。
- Java的类继承体系是单继承,接口继承体系是多实现。
- Java也可使用内部类的方式来实现类的多继承特性。
- Java中的继承初始化顺序为:(先父后子, 静态最前,同等级看定义顺序)
子类 静态代码块/成员属性--->
父类 对象属性/代码块初始化-->
父类 对象构造方法-->
子类 对象属性/代码块初始化-->
子类 对象构造方法
方法覆写
- Java允许子类对父类方法进行重写,当调用方法时会优先调用子类的方法。 --只有方法有效,成员变量不可以
- 如果仅是方法名相同,那么此类操作称为重载,而不是覆写。
- 只有当方法名、参数类型及个数都与父类继承的方法相同时,才能进行覆写。
- 对于覆写的方法,我们一般使用@Override注解标注,有助于静态检查。
隐藏(hide)
一个域、静态方法或成员类型可以分别隐藏(hide)在其超类中可访问到的具有相同名字(对方法而言就是相同的方法签名)的所有域、静态方法或成员类型。
即:子类定义的静态成员或者方法,会被父类的同名的静态成员或者方法隐藏。
即:子类定义的静态成员或者方法,会被父类的同名的静态成员或者方法隐藏。
遮蔽(shadow)
一个变量、方法或类型可以分别遮蔽(shadow)在一个闭合的文本范围内的具有相同名字的所有变量、方法或类型。如果一个实体被遮蔽了,那么你用它的简单名是无法引用到它的;根据实体的不同,有时你根本就无法引用到它:
即:在一个方法内,如果定义了一个变量与外部全局变量同名, 优先使用方法内的局部变量
即:在一个方法内,如果定义了一个变量与外部全局变量同名, 优先使用方法内的局部变量
遮掩(obscure)
一个变量可以遮掩具有相同名字的一个类型,只要它们都在同一个范围内:如果这个名字被用于变量与类型都被许可的范围,那么它将引用到变量上。
即:变量名称与类型同名,优先代表变量
即:变量名称与类型同名,优先代表变量
类型
抽象类 Abstract Class
- 抽象类里面可以没有抽象方法。
- 抽象类既可以对方法进行声明也可以对方法进行实现,还能定义final方法。
- 如果一个类里面有抽象方法,那么这个类一定是抽象类。
- 抽象类中的方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private。
- 抽象类中抽象方法必须被子类全部实现,如果子类不能全部实现,那么子类必须也是抽象类。
- 不能直接被实例化。
接口 Interface
- Interface可以使用反射的代理方法,但Abstract Class无法实现反射代理。
- Interface可以继承接口,甚至可以继承多个接口;但是类只能继承一个类。
- Interface里面的方法只能声明,不能有具体的实现。(但在Java 8中引入了default关键字,此关键字标注接口方法后,允许接口进行默认实现)
- 接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。
- 不能直接被实例化。
枚举 enum
不可以被继承
enum标识符本身被编译器处理过,自身就继承自java.lang.Enum类,而java不支持多重继承。但支持实现接口
enum标识符本身被编译器处理过,自身就继承自java.lang.Enum类,而java不支持多重继承。但支持实现接口
enum里的枚举的默认修饰符默认是static final
使用时可以直接通过枚举类名.出来(static特性)。而且不可以修改(final特性)
使用时可以直接通过枚举类名.出来(static特性)。而且不可以修改(final特性)
关键字
final关键字
- final 修饰类, 则该类不允许被继承。
- final 修饰方法,则该方法不允许被覆写。
- final 修饰属性,则该类的该属性不会进行隐式的初始化,构造方法中必须唯一赋值。
- final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
this关键字
- 在类中作为关键字,可以引用成员变量、方法、以及对当前对象的引用。
- 作为构造方法,只能在构造方法中通过this来调用其他构造方法且要放在首行,普通方法中不能使用。
- 不能通过this递归调用构造方法。
super关键字
- 如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。
- 如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
- 如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。
Q&A总结
Q: 各修饰符所代表的可见性?
public: 可被所有使用
protect: 只能被自己和子类使用,或者同一个包路径
private: 只能自己使用,儿子都不行
不加修饰符即default权限: 包访问权限,和他在同一包内的类都可以访问他,包外的则都不能访问
public: 可被所有使用
protect: 只能被自己和子类使用,或者同一个包路径
private: 只能自己使用,儿子都不行
不加修饰符即default权限: 包访问权限,和他在同一包内的类都可以访问他,包外的则都不能访问
Q: 外部类可以用private或者protect修饰吗?
A: 不能,只能用public或者包访问权限。 内部类可以。
A: 不能,只能用public或者包访问权限。 内部类可以。
Q: 解释下final的作用
A: 如果是基本类型,则指值不能被改变。 如果是对象,指对象的引用不可改变,但是引用处的内容可改变。
A: 如果是基本类型,则指值不能被改变。 如果是对象,指对象的引用不可改变,但是引用处的内容可改变。
Q:final局部变量可以作为非final的参数传入吗?会编译报错吗?
public static void main(String[] args){
final A a = new A();
changeA(a);
}
public void changeA(A a) {
// change A...
}
A:可以作为非final的参数传入,不会编译报错。
public static void main(String[] args){
final A a = new A();
changeA(a);
}
public void changeA(A a) {
// change A...
}
A:可以作为非final的参数传入,不会编译报错。
Q: 重载和重写的区别?
A: 重载是方法名相同,参数不同。
重写是方法参数等都一致的情况下重写父类的方法。
A: 重载是方法名相同,参数不同。
重写是方法参数等都一致的情况下重写父类的方法。
Q:返回值不同,影响重载吗?
A:不影响, 返回值不作为是否重载的依据。因为这样会导致方法调用时产生歧义
A:不影响, 返回值不作为是否重载的依据。因为这样会导致方法调用时产生歧义
Q: 如果子类重载了父类中的方法, 那么子类中还能调用父类中的同名方法吗?
A: 可以, 通过super关键字
A: 可以, 通过super关键字
Q: 怎样能避免子类在重写父类的方法,不小心弄成了重载?
(即你想重写父类的f(int), 却不小心写成了f(int,int),导致调用f(int)时还是调用了父类的f ,怎么能避免这种失误?)
A: 加个@Override关键字即可
(即你想重写父类的f(int), 却不小心写成了f(int,int),导致调用f(int)时还是调用了父类的f ,怎么能避免这种失误?)
A: 加个@Override关键字即可
Q:父类的成员变量能被重写/覆盖嘛?
A:父类的成员变量不具有多态性
A:父类的成员变量不具有多态性
Q:Parent one = new Son(); one.hello(); 其中hello()为子类重写后的方法。这里调用的是?
A:子类的hello()方法
A:子类的hello()方法
Q:Parent one = new Son(); one.hello(); 其中hello()为子类和父类都有的static方法。这里调用的是?
A:父类的hello()方法
A:父类的hello()方法
Q: A中有1个内部类C, A的子类B中也有1个内部类C, B中的C会覆盖A中的C吗?
A: 不会, 因为使用时是通过B.C或者A.C去调用的,存在命名空间的关系。
A: 不会, 因为使用时是通过B.C或者A.C去调用的,存在命名空间的关系。
Q:可以在内部类中定义静态成员吗?
A: 不可以。 除非在class B前面加static变为静态类
A: 不可以。 除非在class B前面加static变为静态类
Q: 接口中如果要定义成员变量,那成员的默认修饰符是什么?
A: public static final
A: public static final
Q: 接口中各方法的默认修饰符是什么?
A: public abstract
A: public abstract
0 条评论
下一页