demo1 抽象类可以提供构造方法的;
abstract class Message {// 定义抽象类;
private String type;
// 此抽象类中没有提供无参构造,所以子类必须明确调用单参构造
public Message(String type){
this.type = type;
}
public abstract String getConnectInfo();//定义抽象方法;,没有方法体
public String getType(){
return this.type;
}
}
class DatabaseMessage extends Message {
public DatabaseMessage(String type){// 子类构造---父类没有无参构造,子类必须调用父类的有参构造;
super(type);
}
@Override
public String getConnectInfo(){// 方法覆写,定义方法体
return "[" + super.getType() + "]数据库连接信息.";
}
}
class HelloWorld {
public static void main(String[] args) {
Message msg = new DatabaseMessage("Oracle");// 子类为父类实例化;
System.out.println(msg.getConnectInfo());
}
}
- 抽象类无法直接实例化
- 抽象类中允许没有抽象方法;即使没有抽象方法,也无法直接使用关键词new直接来实例化抽象类;
- 即便抽象类没有实例化对象,那么也无法直接使用关键词new获取抽象类的对象,必须依靠子类对象完成。
demo2 在抽象类中定义static方法
- 抽象类可以提供有static方法,并且该方法不受到抽象类对象的局限。
abstract class Message {// 定义抽象类;--抽象类一定不能用final来定义;抽象类必须有子类;
public abstract String getInfo();// 定义抽象方法
public static Message getInstance(){// 返回Message对象实例
return new DatabaseMessage();// 实例化子类对象
}
}
class DatabaseMessage extends Message {
@Override
public String getInfo(){
return "MLDN数据库连接信息";
}
}
class HelloWorld {
public static void main(String[] args) {
Message msg = Message.getInstance();//直接调用static方法
System.out.println(msg.getInfo());
}
}
- static方法永远不受到实例化对象或结构的限制,永远可以直接通过类名称直接调用!!