java--抽象类与接口,继承与多态

1、 Java抽象类 中不能有静态的抽象方法。
  抽象类是不能实例化的,即不能被 分配内存 ;而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被 分配内存 ,而static方法必须被 分配内存 。所以抽象类中不能有静态的抽象方法。
  定义抽象方法的目的是重写此方法,但如果定义成静态方法就不能被重写。
2、接口中不能有静态的抽象方法
  接口中的方法也只能是 public abstract修饰的,不能加上static。接口是不能实例化的,即不能被分配内存,而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:接口不能被分配内存,而static方法必须被分配内存。所以接口中不能有静态的抽象方法。
3、抽象类不一定有抽象方法
  静态static是属于字节码的。
  一个抽象类可以没有抽象方法,使用abstract只是为了不被实例化。
  以上两点可以说明,静态方法只要有字节码存在就可以运行,所以抽象类中可以有静态方法。
4、静态和抽象不能共存在方法上
  因为静态属于字节码,不需要对象就可以运行;而抽象方法没有方法体,运行没有意义,所以不能共存。
分类:  Java

******抽象类接口都可以有静态变量,接口中publicstaticfinal,抽象类都可以。两者都不能有静态抽象方法,抽象类可以有静态方法。接口不能有静态方法。

抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

抽象函数只有声明无方法体,无实现,有大括号就算实现了。必须被继承,类继承抽象方法必须全部实现,也可继续抽象类继承不必实现。
用sbstract修饰的或者有抽象方法的即为抽象类,有抽象方法必须被abstract修饰(不一定有抽象方法),必须被继承,不一定全部被实现。如果父类定义了抽象构造,子类必须显示调用,否则自动调用无参构造。

接口只能有抽象,不可有构造,也没有普通变量,在接口中凡是变量必须是public static final
接口方法也只有声明,没有实现,没有大括号
1)接口不能有构造方法或其他方法,抽象类可以有。
2)接口不能有方法体,抽象类可以有。
3)接口不能有静态方法,抽象类可以有。
4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。
可以用来修饰接口中的方法
public, abstract, default, static
接口可以多继承,类只能单继承,类可以多实现接口。
抽象方法:只有声明没有定义,不一定用abstract。没有括号。有大括号就已经实现。



继承与重载的实际应用:
class A{
public String show(D d){return ("AD");}
public String show(A a){return ("AA");}
}
class B extends A{
public String show(B b){return ("BB");}
public String show(A a){return ("BA");}
}
继承重写重载函数=》参数是对象时,又符合的找符合的,不符合的找父类的。同时有父类和爷爷类,用父类。


继承的初始化特点:
首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super("B")显示的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造
总结:
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数


构造方法的继承:

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
1,父类无任何构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时自动调用父类的默认无参。然后执行子类构造。
2,父类定义了无参构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时首先调用父类的无参。当然可以在子类中super()来显示调用。然后执行子类构造。
3,父类定义了有参和无参,那么子类必须显示调用有参初始化父类变量,否则执行2.
4,父类只定义了有参,这是不会有默认无参,也没有无参,则必须显示调用有参初始化父类变量,否则执行2,报错。

构造原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,父类没有定义构造,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:
[cpp] view plain copy



super,this问题。
0,显示调用父类有参构造,否则调用无参构造,没有则编译错误
1,this用于本类形参实参名相同时,用于指代实参,或成员方法,然可省略。
2,super可以在子类调用父类的成员或者方法
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
3,构造时,this(),this(a),super(无参),super(a);
4,构造函数中默认的第一条语句是super(),super()与this()不能同时出现在一个构造函数里,因为都必须是第一条语句
5,都不能在static中,是指对象的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值