Java抽象类

1.抽象类

普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指只有方法声明没有方法实现的方法,同时抽象方法还必须使用关键字abstract做修饰

拥有抽象方法的类就是抽象类,抽象类是抽象方法与非抽象方法的集合,抽象类要使用abstract关键字声明。

2.语法格式

【修饰符】abstract class 类名{

 }

3.抽象类使用注意 

1.抽象类无法实例化,抽象类是专门给子类继承的

public abstract class A {
  public A(){
      
  }
}
class text{
    public static void main(String[] args) {
        new A();//Error:(5, 9) java: 集成开发.抽象类.A是抽象的; 无法实例化
    }
}

2.final与abstract无法联合使用

原因:final修饰的类与方法不能被继承和修改,但是抽象类是专门给子类继承的,抽象方法还必须实例化

public final abstract class A {//Error:(3, 23) java: 非法的修饰符组合: abstract和final
  public A(){

  }
}

3.抽象类虽然无法被实例化,但是抽象类有构造方法,因为抽象类有自己的一些属性。这个构造方法是给子类使用的

public abstract class A {   
  String name;
  public A(){

  }
}
class B extends A{
 private String name;
 
 public B(String name){
     super();
     this.name=name;
 }
}
class text{
    public static void main(String[] args) {
        B b=new B("张三丰");
    }
}

4.如果子类无法实例化父类全部的抽象方法,则该子类只能定义为一个抽象父类的抽象子类

原因:子类继承抽象父类,那么势必将父类的抽象方法继承过来,但是抽象方法只能在抽象类中,此时要么把子类定义为抽象类,要么将继承过来的抽象方法全部实例化

public abstract class A {
    public abstract void some();
    public abstract int move();
}
class B extends A{//Error:(7, 1) java: 集成开发.抽象类.B不是抽象的, 并且未覆盖集成开发.抽象类.A中的抽象方法move()
    public void some(){
        
    }
    //move方法没有声明
    public static void main(String[] args) {

    }
}

5.抽象类中可以没有抽象方法,但是抽象方法必须在抽象类中

public abstract class A {
    public  int move(){
        return 123;
    }
}
class B{//B含有抽象方法,但是B不是一个抽象类
    public abstract void some();

    public static void main(String[] args) {

    }
}

4.抽象类实例

例如,现在有三类事物:
(1)机器人:充电,工作;
(2)人:吃饭,工作,睡觉;
(3)猪:进食,睡觉。
现要求实现一个程序,可以实现三种不同事物的行为。

先定义一个抽象行为类:

package com.wz.abstractdemo;

public abstract class Action{
	
	public static final int EAT = 1 ;
	public static final int SLEEP = 3 ;
	public static final int WORK = 5 ;
	
	public abstract void eat();
	public abstract void sleep();
	public abstract void work();
	
	public void commond(int flags){
	  switch(flags){
		case EAT:
			this.eat();
			break;
		case SLEEP:
			this.sleep();
			break;
		case WORK:
			this.work();
			break;
		case EAT + SLEEP:
			this.eat();
			this.sleep();
			break;
		case SLEEP + WORK:
			this.sleep();
			this.work();
			break;
		default:
			break;
		}
	}
}

定义一个机器人的类:

package com.wz.abstractdemo;

public class Robot extends Action{

	@Override
	public void eat() {
		System.out.println("机器人充电");
		
	}

	@Override
	public void sleep() {
		
	}

	@Override
	public void work() {
		System.out.println("机器人工作");
		
	}
	
}


定义一个人的类:

package com.wz.abstractdemo;

public class Human extends Action{

	@Override
	public void eat() {
		System.out.println("人吃饭");
		
	}

	@Override
	public void sleep() {
		System.out.println("人睡觉");
		
	}

	@Override
	public void work() {
		System.out.println("人工作");
		
	}
	
}

定义一个猪的类:

package com.wz.abstractdemo;

public class Pig extends Action{

	@Override
	public void eat() {
		System.out.println("猪进食");
		
	}

	@Override
	public void sleep() {
		System.out.println("猪睡觉");
		
	}

	@Override
	public void work() {
		
		
	}
	
}

测试类:

package com.wz.abstractdemo;

public class AbstractDemo {

	public static void main(String[] args) {
		
		fun(new Robot());
		
		fun(new Human());
		
		fun(new Pig());

	}
	
	public static void fun(Action act){
		act.commond(Action.EAT);
		act.commond(Action.SLEEP);
		act.commond(Action.WORK);
	}

}

//运行结果:
//机器人充电
//机器人工作
//人吃饭
//人睡觉
//人工作
//猪进食
//猪睡觉

与我们之前采用多态设计的主人给宠物投食一样,只是使用抽象类更简单明了,我将改进的代码一律放在下面,对比前面讲继承时代码学习

需求:主人给不同的宠物投食,不同的宠物吃的食物不同

public class Text {
    public static void main(String[] args) {
        //创建主人对象
        zhuRen ren=new zhuRen();
        //创建小狗、小猫对象,然后向上转型成Pet类型
        dog dg=new dog();
        Pet dog=dg;
        Cat ct=new Cat();
        Pet cat=ct;
        //然后主人投食
        ren.feed(dog);//小狗正在啃骨头
        ren.feed(cat);//小猫正在吃鱼
    }

}

 class zhuRen{
    public void feed(Pet pet){
        pet.eat();
    }
}

abstract class Pet{
    public abstract void eat();
        }

class dog extends Pet{
    public void eat(){
     System.out.println("小狗正在啃骨头");
    }
}

class Cat extends Pet{
    public void eat(){
        System.out.println("小猫正在吃鱼");
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值