抽象
在现实中,抽象就是现实中不存在的东西
对于程序语言而言 抽象类就是只申明不实现
对于Java而言 什么可以被称之为抽象?
我们写个动物
public class Anm {
void eat(){
System.out.println("再吃东西");
}
}
我们都知道 动物都可以吃东西 但是怎样吃 它是一种概念性的东西( 程序员真是狠起来连自己都杠)
对于抽象的东西 我们可以使用abstract来修饰
public abstract class Anm {
abstract void eat();
}
抽象成员注意这些:
1、抽象方法使用abstract来修饰 (在权限修饰符与返回修饰符之间)
2、抽象方法没有方法体
3、如果一个类里面有一个抽象的成员 那么这个类就是抽象的类 需要 abstract 来修饰
抽象的特点:
1、不能创建出具体的对象
2、抽象的类的子类必须重写抽象类的抽象方法(子类重写抽象方法之后可以不是抽象类),否则子类也必须是抽象类
3、抽象类中可以有正常的成员
抽象类的作用:
1、 抽象类可以强制要求子类必须重写什么方法(规范的作用)
2、 抽象类支持多态
小知识点
在java中 抽象类可以有构造器 虽然我们不能使用new 来直接使用抽象本类的构造器 构造抽象类的实例, 但是 在抽象类里面的构造器有一个这么巧妙的作用 规定了子类必须实现的代码
接口
接口其实是一种特殊的抽象类(所以不能实例化) 它里面的方法全部都是抽象的方法 接口使用interface申明
我们知道抽象类的作用是让派生类重写基类的抽象方法 从而达到规定哪些方法是必须重写,但是继承接口的必须是接口 接口与类之间只能是实现关系 implements
实现关系其实与继承关系是一样的 但是不能使用extends而是implements 实现了接口的类 必须重写接口的抽象方法
// 接口的定义
public interface inf_test1 {
// 接口的方法都是抽象方法 所有可以忽略 abstract 且方法全部都是 public
void getMoney(); // 接口的方法都是抽象的方法
}
//java类实现接口
public class useInter implements inf_test1{
// 类实现接口
@Override
public void getMoney() {
// 重写getMoney抽象方法(类使用接口的抽象方法这一种现象可以叫做实现)
}
}
实现关系与接口关系大致一致 只不过实现是类与接口的关系 继承是类与类的关系 接口支持多态 且实现支持”多实现”
现在我们定义了四个类或接口
i - i_EatMeat - 食肉接口
方法:abstrect_eat()
i - i_Valuable - 珍稀动物接口
方法:
c - c_Animal - 动物类
class panda extends c_Animal implements i_EatMeat ,i_Valuable {
// 单继承c_Animal 类 多实现 食肉接口 珍稀动物接口
}
因为接口支持多态性所以我们使用向上转型:
panda p1 = new panda();
// 简单的实例化
c_Animal p2 = new panda();
// 类的向上转型
i_EatMeat p3 = new panda();
// 接口的向上转型
/*
站在动物的角度去思考panda对象 可以吃 可以睡 但是无法使用接口方面的方法
站在珍惜动物的角度去思考panda对象 可以保护 可以珍惜 但是不能吃 不能睡
*/
如果说 A 是 B 的话 那么 A 就是B的派生类(子类)
如果说 A 是 怎样怎样的(B) A就是B的实现类
如果有许多许多的道具都是雷属性,雷属性道具有许多特征
那么不妨将雷属性作为一个接口进行封装 给所有的雷属性道具实现这个接口
特点:
1、接口的方法都是抽象方法 并且都是公开的
2、属性必须是 公开 静态 常量
项目练习
public interface I_DataBaseManager {
// 数据库管理接口
public abstract void AB_SQL_ADD();// 数据库的增
public abstract void AB_SQL_REM();// 数据库的删
public abstract void AB_SQL_CHAGE(); // 数据库的改
public abstract void AB_SQL_SELECT(); // 数据库的查
public abstract void AB_CONNECT();
}
public abstract class AC_DBCRUD implements I_DataBaseManager {
// 抽象 实现了:增删改查 抽象保留: connect
@Override
public void AB_SQL_ADD() {
System.out.println("数据库在添加");
}
@Override
public void AB_SQL_CHAGE() {
System.out.println("数据库在修改");
}
@Override
public void AB_SQL_REM() {
System.out.println("数据库在删除");
}
@Override
public void AB_SQL_SELECT() {
System.out.println("数据库在查找");
}
}
public class C_CONNECT extends AC_DBCRUD{
String db;
public C_CONNECT(String dbType){
this.db = dbType;
}
@Override
public void AB_CONNECT() {
System.out.println("正在连接 "+this.db);
}
}
public class RUN {
public static void main(String[] args) {
C_CONNECT mainO = new C_CONNECT("Mysql");
mainO.AB_CONNECT();
mainO.AB_SQL_ADD();
}
}
object
在java中 object 是 所有类的父类
public class Test1 {
public static void main(String[] args) {
Object i = 2;
i = "asd";
System.out.println(i);
}
}
使用object与多态