2020-4-30 13:55:30 | 作者:老铁SEO | 0个评论 | 人浏览
抽象类是用来捕捉子类的通用特性的。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。接口是抽象方法的集合。如果一个类实现了某百个接口度,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
java里抽象类到底有什么用?
你明白多态就明白这个问题了,给你举个例子吧:比如有个抽象类叫动物,他有“叫”的动作,继承他的类都是普通类,有猫、狗...各种动物,他们实现叫的方法都不同。现在有个需求:就是实现各种动物“叫”的动作,为了动态实现,就需要把动物做为形参传过去,依照多态的特性“任何父类出现的地方,都可以替换成子类”,我们就可以将真正实现了“叫”这个方法的实现类传过去而执行实现类里的方法了,以下是实例代码:
//动物类
publicabstractclassAnimal(){
publicvoidshout();
}
//实现类:狗
publicclassDogextendsAnimal(){
publicvoidshout(){
System.out.println("汪");
}
}
//实现类:猫
publicclassCatextendsAnimal(){
publicvoidshout(){
System.out.println("瞄");
}
}
//执行类
publicclassOpration(){
//定一个以Animal为参数的方法
publicvoidExecuteTest(Animalanimal){
//只调用“叫”的方法
animal.shout();
}
}
//测试类
publicclassTest(){
//实现main()
publicstaticvoidmain(String[]args){
//实例化
Dogdog=newDog();
Catcat=newCat();
Oprationop=newOpration();
//接下来要用多态了
//这里是狗“叫”的放法
op.ExecuteTest(dog);
//这里是猫“叫”的方法
op.ExecuteTest(cat);
}
}
希望能对你有帮助。
我这没用任何工具,要是有错误,请见谅。
JAVA抽象类可以继承抽象类
您好,提问者:
1、抽象类只是一个特殊的类,但是也具备类的特性。
2、如果这个类中有抽象方法,那么这个类必须定义为抽象类。3、如果这个抽象类继承了别的抽象类,那么可以不覆盖抽象方法。因为:这个抽象类也是抽e79fa5e98193e78988e69d8331333335313838象的,没办法实现方法体。例如一下代码:abstractclassA{
abstractvoidadd();
publicvoiddelete(){}
}
abstractclassBextendsA{
//继承了抽象A类,因为也是抽象的,可以不写抽象方法,当然也可以重写抽象方法(切记抽象方法是没有方法体的)
//abstractvoidadd();//也是没有问题的
abstractvoidgetXX();
}
publicclassextendsB{
//必须实现抽象方法
//继承了B,也就继承了A,AB方法都有,所以必须重写这两个抽象类的抽象方法
publicvoidadd(){}
publicvoiddelete(){}
publicvoidgetXX(){}
}
JAVA抽象类的this一个问题
你老师瞎掰。。。。
谁说抽象类里面不能用this关键字?小伙子啊,你老师把你给害了。。。追问这个是老师说的“在抽象类中可以包含静态变量和静态方法,在此类中还可以使用抽象类名调用静态变量,在抽象类中不可以使用this关键字,原因是由于该类为抽象类,既然是抽象类就不可以获取该类的实例对象.”
求大神指点
追答我这样给你说吧:
抽象类和接口在使用上类似,都是不能直接实例化的类,但可以实例化抽象类的非抽象子类。
抽象类的非抽象子类实例化后,实际上也是抽象类的实例,所以抽象类里面的this实际代表的也是抽象类自己,当然也是实例它的子类对象。
也就是说,抽象类虽然不能直接实例化,但是我们通过实例化它的非抽象子类就可以说是实例化了抽象类。我给你举一个例子:
publicabstractclassPar{};
publicclassSubextendsPar{};
上面定义了一个父类抽象类Par,和抽象类的子类Sub,
我可以这样来解释我说的是不是正确的:
Subinstance1=newSub();//没有问题,自己实例化赋值给自己
Parinstance2=newSub();//没有问题,实例化子类赋值给父类对象
Objectinstance3=newSub();//同样么有问题,因为Object是任何类的父类,简称超类。
但你要明白的是,抽象类里面的this,在运行时期实质上指向的是子类的内存地址!
再给你补充点:
我上面说的子类抽象类的非抽象子类的实例就相当于抽象类的实例,我证明给你看:
booleanisSuperInstance=instance1instanceofPar;
isSuperInstance结果为true,结果很显然了。