how2j.cn


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

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

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

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



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



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

步骤 1 :

抽象类

为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 :

抽象类可以没有抽象方法

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 :

抽象类和接口的区别

区别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 :

练习-抽象类

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

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

为Item类设计一个抽象方法

public abstract boolean disposable()


不同的子类,实现disposable后,会返回不同的值。
比如LifePotion就会返回true,因为是会消失了。
而Weapon,Armor 就会返回false,因为是不会消失了
步骤 5 :

答案-抽象类

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


问答区域    
2018-03-12 抽象类存在的必要性?
一杯坏牛奶
对于步骤1来说,子类直接就重写方法不行了吗,感觉这个抽象类鸡肋了些




1 个答案

11150 答案时间:2018-03-24
抽象类是提取一些公共特征出来,然后子类继承后可以定义自己特有的行为。 而接口是暴露给外面的某种能力,外界只需要根据这些能力调用就行了。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-01-27 我的理解
DennyLin



用继承的抽象方法disposable()返回的布尔值来做
package propety;

public abstract class Item {
	String name;
	int price;
	protected void effect(){
		System.out.println("物品使用后会有效果");
	}
	public abstract boolean disposable();
	public void use(boolean disposable){
		if(disposable){
			System.out.println(this.name+"已经使用,物品消失");
		}
		else
			System.out.println(this.name+"已经使用,物品在装备栏中");
	}

package propety;

public class Armor extends Item {//继承了Item类
	//护甲等级
	int ac;
	@Override
	public boolean disposable() {
		// TODO Auto-generated method stub
		return false;
	}
	public static void main(String[] args){
		Armor clothArmor = new Armor();
		Armor chainArmor = new Armor();
		clothArmor.name="布甲";
		chainArmor.name="锁子甲";
		clothArmor.use(clothArmor.disposable());
                chainArmor.use(chainArmor.disposable());
	}
		
}
//输出 
布甲已经使用,物品在装备栏中
锁子甲已经使用,物品在装备栏中

package propety;

public class MagicPotion extends Item{
	//父类方法在子类里重写,也叫做覆盖override
	protected void effect(){
		System.out.println("蓝瓶使用后,可以回复魔法值");
	}
	@Override
	public boolean disposable() {
		// TODO Auto-generated method stub
		return true;
	}
	public static void main(String[] args){
		MagicPotion mgp1=new MagicPotion();
		mgp1.name="蓝瓶";
		mgp1.effect();
		mgp1.use(mgp1.disposable());	
	}
	
}
//输出
蓝瓶使用后,可以回复魔法值
蓝瓶已经使用,物品消失

							


1 个答案

yekai123 答案时间:2018-04-14




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





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群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图