JAVA
不小心把源文件删了,真是让我头大,这次把笔记保存到C站总不会误删了吧!
继承的特点.
-
①子类可以继承父类的属性和行为,但是
子类不能继承父类的构造器
。②Java是 单继承模式: - -个类只能继承-个直接父类。
③Java不支持多继承、但是支持多层继承。
④Java中 所有的类都是Object类的子类。
-
子类是否可以继承父类的构造器?
不可以的,子类有自己的构造器,父类构造器用于初始化父类对象。 -
子类是否可以继承父类的私有成员?
可以的,只是不能直接访问。
在下面的代码中查看,直接调用父类私有方法是会报错的
package com.kty.InheritedFeatures;
public class Main {
public static void main(String[] args) {
BBB bbb = new BBB();
bbb.Aaa();
// bbb.PAa(); 报错
System.out.println(BBB.fx);
}
}
class AAA{
public void Aaa(){
System.out.println("Aaa Function");
}
private void PAa(){
System.out.println("Private PAa");
}
public static String fx="sasasa";
}
class BBB extends AAA{
}
但是从内存的运行机制来看:子类可以继承父类的私有成员团变量或方法,只是他无法被显式的调用使用而已
-
子类是否可以继承父类的静态成员?
有争议的知识点。
子类可以直接使用父类的静态成员(共享)
但个人认为:子类不能继承父类的静态成员。(共享并非继承) -
为什么不支持多继承?
-
0bject特点:
Java中所有类,要么直接继承了Object ,要么默认继承了Object ,要么间接继承了Object, Object是祖宗类。
如下所示:
public class a{} 这是我们一般写类的写法,Object默认继承
public class a extends Object{} 这是不一般写法,也叫直接继承
public class b extends a{} 这是间接继承Object,a默认继承
继承后:成员变量、成员方法的访问特点
在子类方法中访问成员(成员变量、成员方法)满足:就近原则
●先子类 局部范围找
●然后子类成员范围找
●然后父类成员范围找, 如果父类范围还没有找到则报错。
package com. itheima.d8_ extends_ field_ method;
public cLass Test {
pubLic static void main(String[] args) {
//目标:理解维承后成员的访问特点:就近原则。
Dog d = new Dog();
d.run(); //子类的
d. lookDoor(); //子类的
}
}
class Animal{
pubLic void run(){
System. out. println("动物可以跑~~");
}
}
cLass Dog extends Animal{
pubLic void LookDoor(){
System. out. println("狗可以看门~~");
}
pubLic void run(){
System . out . println("狗跑的贼快w.."); 会使父类的run方法不再生效
}
- 有些时候,即使我们在子类中定义了与父类相同的成员变量但我们仍想访问父类的成员变量时,只需要加个this关键字
- 那么遇到: father => son => son =>这种情况我们仍想访问最高父级的成员变量时怎么办捏?【不知道耶】
this.父类变量名
super.父类变量名
示例:
package com.kty.InheritedFeatures;
public class Main {
public static void main(String[] args) {
a5 a5 = new a5();
a5.run();
}
}
class a1{
String name = "a1";
}
class a2 extends a1{
String name = "a2";
}
class a3 extends a2{
String name = "a3";
}
class a4 extends a3{
String name = "a4";
}
class a5 extends a4{
String name = "a5";
public void run(){
String name = "a5.a5";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
运行结果:
a5.a5
a5
a4
通过演示可以发现super不支持跨类调用,即最高类是直系父类
方法重写
-
什么是方法重写?
在继承体系中, 子类出现了和父类中- -模一-样的方法声明,我们就称子类这个方法是重写的方法。 -
方法重写的应用场景
当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。 -
案例演示:
旧手机的功能只能是基本的打电话,发信息
新手机的功能需要能够:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。
package com.extendsfunc.override;
public class Main {
public static void main(String[] args) {
phone_new phone = new phone_new();
phone.call();
phone.msg();
}
}
class phone_old{
public void call(){
System.out.println("Basic call");
}
public void msg(){
System.out.println("Basic Msg");
}
}
class phone_new extends phone_old{
@Override
public void call() {
super.call();
System.out.println("Video call extension");
System.out.println("Music call extension");
}
@Override
public void msg() {
super.msg();
System.out.println("MMS service extension");
}
}
/*.......................运行结果......................*/
Basic call
Video call extension
Music call extension
Basic Msg
MMS service extension
-
@Override重写注解
@Override是放在重写后的方法上,作为重写是否正确的校验注解。
加上该注解后如果重写错误,编译阶段会出现错误提示。
建议重写方法都加@Override注解,代码安全,优雅!
-
方法重写注意事项和要求
* 重写方法的名称、 形参列表必须与被重写方法的名称和参数列表-致。
私有方法不能被重写 。[最重要的一点]
* 子类重写父类方法时, 访问权限必须大于或者等于父类(暂时了解:缺省< protected < public)
* 子类不能重写父类的静态方法,如果重写会报错的。