什么是抽象函数,抽象类?
在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,并且它只能用作
基类。它与非抽象类的不同:
1、抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽然一些
变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
2、允许(但不要求)抽象类包含抽象成员。
3、抽象类不能被密封。
当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。
抽象函数的格式
1.在一个普通类中定义抽象函数?
class Home{
String where;
//1.定义一个抽象方法,编译能否通过?
abstract void gohome();
/*输出
Test.java:1: error: Home is not abstract and does not override abstract method gohome() in Home
*///说明:说明抽象方法必须声明在抽象类内
}
public class Test{
public static void main(String[] args){
}
}
抽象类的规则
- 使用abstract定义的类称为抽象类
- 抽象类不能生成对象
- 如果一个类中包含抽象函数,那么这个类必须声明为抽象类
- 一个类中没有抽象函数,也可以声明为抽象类
- 抽象类是用来当爹的,用于被继承的,他的子类可以生成对象
- 抽象类可以有构造函数,是为子类调用时候准备的
1.尝试生成抽象类的对象?
//2.尝试用抽象类生成对象
abstract class Home{
String where;
abstract void gohome();
}
public class Test{
public static void main(String[] args){
//创建抽象类对象
Home yang=new Home();
/*输出:
Test.java:14: error: Home is abstract; cannot be instantiated
Home yang=new Home();
^
1 error
*///原因:抽象类内的方法是没有方法体的(没有实现部分),假设能创建对象,那么对象调用方法肯定出错
}
}
2.通过继承再生成对象?
//2.尝试用抽象类生成对象
abstract class Home{
String where;
abstract void gohome();
}
class Myhome extends Home{
//继承了抽象函数和成员变量
/*继承以后不写抽象类的实现则不能编译通过
原则之一:有抽象类必须声明为抽象类
*/
void gohome(){
System.out.println("我回家了");
}
}
public class Test{
public static void main(String[] args){
//子类对象
Myhome yang=new Myhome();
yang.gohome();
//用对象转型输出
Home wang=new Myhome();
wang.gohome();
}
}
3.抽象类可以有构造函数吗?
//2.尝试用抽象类生成对象
abstract class Home{
String address;
abstract void gohome();
//构造函数
Home(){
System.out.println("Home类 无参构造函数");
}
Home(String address){
System.out.println("Home类 有参构造函数 我家住"+address);
}
}
class Myhome extends Home{
//继承了抽象函数和成员变量
String city;
Myhome(){
super();
System.out.println("Myhome类 无参构造函数");
}
Myhome(String city,String address){
super(address);
this.city=city;
System.out.println("Myhome 有参构造函数 我家在"+city);
}
void gohome(){
System.out.println("我回家了");
}
}
public class Test{
public static void main(String[] args){
// 创建对象
Myhome one=new Myhome();
System.out.println();
Myhome sec=new Myhome("Guangxi","Baise");
}
}