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