how2j.cn


工具版本兼容问题
在类中声明一个方法,这个方法没有实现体,是一个“空”方法

这样的方法就叫抽象方法,使用修饰符“abstract"

当一个类有抽象方法的时候,该类必须被声明为抽象类


本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



14分32秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



步骤 1 : 抽象类   
步骤 2 : 抽象类可以没有抽象方法   
步骤 3 : 抽象类和接口的区别   
步骤 4 : 练习-抽象类   
步骤 5 : 答案-抽象类   

为Hero增加一个抽象方法 attack,并且把Hero声明为abstract的。
APHero,ADHero,ADAPHero是Hero的子类,继承了Hero的属性和方法。
但是各自的攻击手段是不一样的,所以继承Hero类后,这些子类就必须提供不一样的attack方法实现。
package charactor; public abstract class Hero { String name; float hp; float armor; int moveSpeed; public static void main(String[] args) { } // 抽象方法attack // Hero的子类会被要求实现attack方法 public abstract void attack(); }
package charactor; public class ADHero extends Hero implements AD { public void physicAttack() { System.out.println("进行物理攻击"); } @Override public void attack() { physicAttack(); } }
package charactor; public class APHero extends Hero implements AP { @Override public void magicAttack() { System.out.println("进行魔法攻击"); } @Override public void attack() { magicAttack(); } }
package charactor; public class ADAPHero extends Hero implements AD, AP { @Override public void attack() { System.out.println("既可以进行物理攻击,也可以进行魔法攻击"); } public void magicAttack() { System.out.println("进行魔法攻击"); } public void physicAttack() { System.out.println("进行物理攻击"); } }
步骤 2 :

抽象类可以没有抽象方法

edit
Hero类可以在不提供抽象方法的前提下,声明为抽象类
一旦一个类被声明为抽象类,就不能够被直接实例化
package charactor; public abstract class Hero { String name; float hp; float armor; int moveSpeed; public static void main(String[] args) { //虽然没有抽象方法,但是一旦被声明为了抽象类,就不能够直接被实例化 Hero h= new Hero(); } }
package charactor;
  
public abstract class Hero {
    String name; 
         
    float hp; 
         
    float armor; 
         
    int moveSpeed; 
      
    public static void main(String[] args) {
    	//虽然没有抽象方法,但是一旦被声明为了抽象类,就不能够直接被实例化
        Hero h= new Hero();
    }
         
}
步骤 3 :

抽象类和接口的区别

edit
区别1:
子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
区别2:
抽象类可以定义
public,protected,package,private
静态和非静态属性
final和非final属性
但是接口中声明的属性,只能是
public
静态
final的
即便没有显式的声明

注:
抽象类和接口都可以有实体方法。 接口中的实体方法,叫做默认方法
package charactor; public interface AP { public static final int resistPhysic = 100; //resistMagic即便没有显式的声明为 public static final //但依然默认为public static final int resistMagic = 0; public void magicAttack(); }
package charactor;
 
public interface AP {
 
	public static final int resistPhysic = 100;
	
	//resistMagic即便没有显式的声明为 public static final
	//但依然默认为public static final
	int resistMagic = 0; 
	
    public void magicAttack();
}
步骤 4 :

练习-抽象类

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
有的物品使用之后就消失了,比如血瓶

有的物品使用了之后还会继续存在,比如武器

为Item类设计一个抽象方法

public abstract boolean disposable()


不同的子类,实现disposable后,会返回不同的值。
比如LifePotion就会返回true,因为是会消失了。
而Weapon,Armor 就会返回false,因为是不会消失了
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

1分25秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package property; public abstract class Item { String name; int price; public abstract boolean disposable(); }
package property; public class Armor extends Item{ int ac; //护甲等级 @Override public boolean disposable() { return false; } }
package property; public class LifePotion extends Item { public void effect(){ System.out.println("血瓶使用后,可以回血"); } public boolean disposable() { // TODO Auto-generated method stub return true; } }
package property; public class MagicPotion extends Item{ public void effect(){ System.out.println("蓝瓶使用后,可以回魔法"); } @Override public boolean disposable() { // TODO Auto-generated method stub return true; } }
package property; public class Weapon extends Item { @Override public boolean disposable() { // TODO Auto-generated method stub return false; } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2023-12-29 接口里面属性为什么默认是static和final的?如果是final方法,那么实现类如何实现该方法的方法体呢?
javanoobbbb

接口里面属性为什么默认是static和final的?如果是final方法,那么实现类如何实现该方法的方法体呢?







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2023-07-03 抽象类可以定义 public,protected,package,private 静态和非静态属性 final和非final属性是什么意思?其中的package怎么理解?
Karris

抽象类可以定义package属性吗?怎么理解这个package?




1 个答案

luxl5
答案时间:2023-10-10
在Java中,抽象类可以定义所有访问级别的属性,包括public, protected, package-private (默认), private。访问级别是用来控制属性和方法的可访问性。下面是对这些访问级别的详细解释: public: 这是最开放的访问级别。如果一个属性或方法是public的,那么它可以从任何地方被访问,包括不同的包和类。 protected: 当属性和方法被声明为protected时,它们可以在同一个包中的任何类中被访问,也可以在其他包中的子类中被访问。 package-private (默认): 如果没有指定访问级别(即没有使用public, protected或private关键字),那么属性和方法默认的访问级别就是package-private。这意味着它们只能在同一个包中的类中被访问。 private: 当属性和方法被声明为private时,它们只能在声明它们的类中被访问,即使是在同一个包中的其他类也无法访问。 对于final和非final属性,final关键字表示一旦赋值后,该属性就不能被改变。非final属性则可以随时被修改。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2022-08-24 什么时候使用抽象类。什么时候使用接口呢
2022-07-30 抽象方法还是子类重写父类方法
2022-07-13 为什么抽象类不能被实例化?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 31 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 基础-接口与继承-抽象类 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图