输出结果:
父类中的tell方法
我重写了tell方法
父类中的tell方法
方法重载(Overloading)
方法重写(Override)
定义 方法名称相同,参数的类型或个数不同 方法名称、参数类型、返回值类型全部相同
权限要求 对权限没有要求 被重写的方法不能拥有比父类更加严格的权限
范围 发生在一个类中 发生在继承中
2.3 抽象类与接口
final能申明类、方法和属性,使用final申明的类不能被继承,使用final申明的方法不能被重写,使用final申明的变量变成常量(定义时要赋值),常量是不可以修改的。
抽象类:包含一个抽象方法的类就是抽象类。
定义:
abstract class ClassName{
属性
方法
抽象方法
}
(1)抽象方法:申明而未实现的方法,抽象方法必须使用abstract关键字申明,只有方法名和参数,没有方法体。
(2)抽象类被子类继承,子类(若不是抽象类)必须重写抽象类中的所有抽象方法。
(3)抽象类不能实例化,要通过其子类进行实例化。
public class AbstractClassDemo1 {
public static void main(String[] args) {
StuClass stuClass=new StuClass();
stuClass.tell();
stuClass.say();
}
}
abstract class AbsClass{
int age;
public void tell(){
System.out.println("父类中的tell方法");
}
public abstract void say();
}
class StuClass extends AbsClass{
@Override
public void say() {
System.out.println("子类实现父类抽象类中的say抽象方法");
}
}
接口可以理解为一种特殊的类(没有构造方法),里面全部是由全局常量和公共的抽象方法组成,接口的实现必须通过子类,使用关键字implements,而且子类可以多实现接口。一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口。接口定义如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 全局常量;
[public] [abstract] 抽象方法;
}
样例:
public abstract class InterfaceDemo1 {
public static void main(String[] args) {
InterfaceClass interfaceClass=new InterfaceClass();
interfaceClass.print(1.0f);
}
}
class InterfaceClass implements CalInterface1,CalInterface2{
@Override
public void print(float r) {
System.out.println("半径为"+r+"的圆面积:"+getArea(r)+",周长:"+getCircumference(r));
}
@Override
public float getArea(float r) {
float area=PI*r*r;
return area;
}
@Override
public float getCircumference(float r) {
float circumference=2*PI*r;
return circumference;
}
}
//定义接口CalInterface1
interface CalInterface1
{
float PI=3.14159f;//PI默认为public static final类型
float getArea(float r);//方法getArea()默认为public abstract类型,注意抽象方法没有方法体
public abstract float getCircumference(float r);//计算面积
}
//定义接口CalInterface2
interface CalInterface2
{
void print(float r);//打印输出结果
}
//定义接口CalInterface3,继承接口CalInterface1和CalInterface2
interface CalInterface3 extends CalInterface1,CalInterface2{
}
输出结果:
半径为1.0的圆面积:3.14159,周长:6.28318