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-06-11 作业
sharp小黑



判断语句没写好
public abstract class ABS {         //抽象类
	static String a="血瓶";
	static String b="武器";
	public static void main(String[] args) {
		zileia1 s=new zileia1();
		zileia2 s1=new zileia2();
		s.fangfa();
		s1.fangfa();
	}
public abstract boolean fangfa();                //抽象方法
}

class zileia1 extends ABS{
	public boolean LifePotion() {
		if(true) {
			System.out.println(a+"使用后消失了");
		}
		else {
			System.out.println(a+"使用后未消失");
		}
		return true;
	}
	public boolean fangfa() {   
		return LifePotion();
	}
}
class zileia2 extends ABS{
	public boolean Weapon() {
		if(false) {
			System.out.println(b+"使用后消失了");
		}
		else {
			System.out.println(b+"使用后未消失");
		}
		return false;
	}
	public boolean fangfa() {
		return Weapon();
	}
}

							


1 个答案

lzt501 答案时间:2018-07-18
package com.stly7.eland.oop.abstract_class; public class TestItem { //测试使用蓝瓶和武器 public static void main(String[] args) { Item armor = new Armor(); armor.setName("尚方宝剑"); armor.setPrice(10000); Item magicPotion = new MagicPotion(); magicPotion.setName("盖中盖"); magicPotion.setPrice(100); System.out.println(armor.disposable()); System.out.println(magicPotion.disposable()); } }




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





2018-05-28 什么是显式声明 什么是实体方法
llittle
问题有些中二。。但是百度过后仍不太清楚




1 个答案

南哥 答案时间:2018-06-03




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




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

上传截图