how2j.cn


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

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

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


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



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



步骤 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 Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
有的物品使用之后就消失了,比如血瓶

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

为Item类设计一个抽象方法

public abstract boolean disposable()


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

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


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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-04-17 交作业
殤灬沉淪地獄



交作业
package charactor;

public class Demo10 {
    public static void main(String[] args) {
        ltem2 xueping = new LifePotion();
        xueping.disposable();
        ltem2 wuqi = new WeaponArmor();
        wuqi.disposable();
    }
}
abstract class ltem2{
    public abstract boolean disposable();
}
class LifePotion extends ltem2{
    public  boolean disposable (){
        System.out.println("血瓶消失了");
        return true;
    }
}
class WeaponArmor extends ltem2{
    public boolean disposable(){
        System.out.println("武器没有消失");
        return false;
    }
}

							





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





2019-04-15 交作业
苏远夏



思考 熟悉了解 抽象类中可以有实体方法,单实体类中一定没有抽象方法 子类继承一个抽象父类 必须实现父类中的抽象方法 除非这个子类也是抽象类,这个规则和多态 接口中定义想类似
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 这是运行时多态
		lifePotion lp = new lifePotion();
		System.out.println(lp.disposable());// output:true

		Weapon weapon = new Weapon();
		System.out.println(weapon.disposable());// output:false

		Armor armor = new Armor();
		System.out.println(armor.disposable());
	}

}

							





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





2019-04-11 交作业,抽象类,接口简述
2019-03-25 交作业
2019-03-05 交作业!
2018-10-10 反思:抽象类写法的细节
2018-08-29 按在地上摩擦~
2018-08-28 作业!
2018-08-27 交个作业
2018-06-11 作业
2018-05-28 什么是显式声明 什么是实体方法
2018-05-09 交作业
2018-03-12 抽象类存在的必要性?
2018-01-27 我的理解
2018-01-11 也不知道是否合适这样写
2018-01-08 抽象类子类不能用主方法吗
2017-11-22 构造方法算抽象类方法么??
2017-05-29 子类可以做成抽象类吗?
2017-05-23 接口和继承
2017-04-03 关于抽象类的实例化问题
2017-03-23 抽象类的子类的主函数写法
2017-02-17 用final修饰的变量不是不能被修改的吗
2016-07-23 抽象类可以被定义为FINAL吗?之后如何使用呢
2016-07-12 不能直接实体化是什么意思?间接是如何的
2016-06-19 接口中可以有实体方法吗???不是只有抽象方法!!!
2016-06-03 我还理解不了它有什么用
2016-05-12 但是接中声明的属性,只能是public,静态和final的




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

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

上传截图