抽象类与抽象方法

抽象类与抽象方法

1. 什么是抽象类

抽象类是对类与类之间的共同特征进一步抽象形成的类。由于类不同于对象本身,它是不存在的,所以抽象类无法创建对象。

抽象类和抽象类之间的共同特征还可以再抽象成为新的抽象类。

抽象类与类和对象的关系如下图:
在这里插入图片描述

2. 抽象类的数据类型

抽象类属于引用类型,不是基本数据类型(byte int long等)。

3. 如何定义抽象类

语法:

[修饰符列表] abstract class 类名{
	类体;
}

4. 抽象类属性

  • 抽象类无法实例化,无法创建对象,抽象类是用来被子类继承的。如下:
//银行账户类
abstract class Account{
}
class AbstractTest01{
	public static void main(String[] arge){
	Account a = new Account()//不行,Account是抽象类,无法实例化
	}
}
  • 子类继承抽象类,子类可以实例化对象。如下:
//银行账户类
abstract class Account{
}
class CreditAccount extends Account {  //CreditAccount类继承Account抽象类
	public static void main(String[] arge){
	CreditAccount a = new CreditAccount()//可以,CreditAccount类是抽象类的子类,可以实例化
	}
}
  • 抽象类的子类也可以是抽象类。如下:
//银行账户类
abstract class Account{
}
abstract class CreditAccount extends Account {  //可以,CreditAccount抽象类可以继承Account抽象类
}
  • final和abstract不能联合使用,这两个关键字是对立的。抽象类的创建就是为了被子类所继承,而final修饰后无法被继承。如下:
final abstract class Account//不行,final和abstract冲突
  • 抽象类虽然无法实例化,但是有构造方法,这个构造方法是供子类使用的。子类构造方法第一行默认代码为super(),意思是调用父类的构造方法。也就是说如果父类没有无参构造方法,创建子类的时候一定要设定父类的参数,否则无法通过。如没有特殊设定,父类默认无参,子类创建时也不用添加构造参数。如下:
abstract class Account{
	public Account(String s){  //把父类的无参构造方法改成有参构造方法
	}
}
class CreditAccount extends Account{ 
	public CreditAccount(){ //子类构造方法,默认有一个调用父类构造方法的代码
		super();  //不行,报错,因为上面父类的无参构造方法被改成有参构造方法
		super(a); //可以,给父类有参构造传一个字符串“a”。
	}	
}

5. 抽象方法

抽象方法是没有实现的方法,没有方法体的方法,特点:1. 没有方法体,以分号结尾。2. 修饰符里有abstract关键字。代码如下:

abstract class Account{
public abstract void doSome();  //可以,因为此抽象方法在抽象类里面
}

抽象类中可以有抽象方法或是普通方法。
抽象类里不一定有抽象方法。但是抽象方法的使用,必须在抽象类中,如下:

class Account{
public abstract void doSome();  //不行,因为此抽象方法在普通类里面
}

子类不是抽象类,如果继承抽象父类的抽象方法必须要重写次抽象方法,

abstract class Animal{   //抽象父类
	public abstract void move();   //抽象方法
}
class Bird extends Animal{    
//Bird类不是抽象类,不能继承父类的抽象方法,必须重写(实现)move方法为普通方法
	public void move(){  //可以,把父类方法的“;”改为“{}”实现抽象方法
	}
}
abstract class Bird extends Animal{//可以继承,因为Bird类为抽象类,可以继承抽象方法

举个例子:游戏里要设置动物:

动物抽象类(包含移动方法)==>鱼类(移动方法重写为“游”)

动物抽象类(包含移动方法)==>鱼类(移动方法重写为“游”)

动物抽象类(包含移动方法)==>人类(移动方法重写为“走”)

6. 抽象类和子类的多态

抽象父类和子类可以使用多态,当new一个父类型,但是引用子类型对象时,编译时局部变量a使用Animal方法,编译完成运行时使用Bird方法。
这种编程思想符合OCP开闭原则(目前不理解就写代码时能用多态就用多态写,慢慢会理解)

public class AbstractTest{
	public static void mian(String[] args){
		Animal a = new Bird(); //多态,向上转型(自动类型转换)
	}
}

public abstract class Animal{
	public abstract void move(){
		System.out.println("动物在移动";
	}
	
}
class Bird extends Animal{
	public void move(){
		System.out.println("鸟在飞");
	}
}

本章总结

抽象类

  1. 抽象类的定义需要在class前加abstract;
  2. 抽象类无法实例化,无法创建对象,只能被子类继承;
  3. final和abstract不能联合使用,它们是冲突的;
  4. 抽象类的子类可以是抽象类,也可以是非抽象类;
  5. 抽象类无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的;
  6. 抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中;
  7. 抽象方法的定义需要在方法修饰符中加入abstract;
  8. 非抽象类继承抽象类时,必须将抽象类中的抽象方法重写(覆盖/实现)。
  9. 面试题:Java语言凡是没有方法体的方法都是抽象方法。
    错误,Object类中就有很多方法有没方法体,都是以“;”结束的,但他们都不是抽象方法,例如:public native int hashCode();
    这个方法就没有方法体,但不是抽象类;
    这个方法底层调用了C++写的动态链接库程序;
    前面修饰符列表中没有“abstract,”但是有一个“native”,表示调用JVM本地程序。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值