抽象类:
抽象:笼统、模糊、不具体
定义:随着继承层次中一个个的新子类的定义,类变得原来越具体,而父类更一般普通
类的设计应该保证父类和子类能够共享特征,有时候将父类设计的特别抽象,以至于没有具体的方法体,这样的类就叫抽象类
抽象类-》抽象方法(|没有具体实现) 申明(几何图形 求面积 public double finadArea(); 方法体去掉)
声明:abstract 类名
抽象关键字:abstract
特点:
1.方法只有申明没有实现,该方法就是抽象方法,需要被abstract修饰。
抽象方法必须定义在抽象类里面,该类也必须被abstract修饰
2.抽象类不能被实例化 为什么? 因为调用抽象方法没有实现
3.抽象类必须有其子类覆盖所有的抽象方法,该类才可以被实例化,否则,这个子类还是定义为抽象类
抽象类里面可以有构造函数 用于给子类对象初始化
抽象里面可以定义非抽象方法 (很少用 如 AWT的适配器对象就是这种)
抽象方法就是没有具体实现的方法(抽象方法不能被static修饰 不能被private修饰)
public abstract void eat(); //后面没有方法体{}
* 面试题:下面那个方法为抽象方法 (A)
* A:public abstract void eat();
* B:static abstract void eat();
* C:private abstract void eat();
抽象关键字不可以和那些关键字共存?
static private final
抽象类一定是父类嘛? 是的,如果不是的话定义该抽象类就没有实际意义。
抽象类和一般类的异同?
相同:抽象类和一般类都是用来描述事物的,都在内部定义了成员
不同:一般类可以被实例化,抽象类不能被实例化
一般类不能定义抽象方法,抽象类可以定义抽象方法
一般类的子类可以复写方法,抽象类子类如果不实现抽象方法就得定义为抽象类
一般类有足够的信息描述事物,抽象类描述信息不充足
接口:
定义:是一个抽象类型,是抽象方法的集合,接口只是一种形式,接口自身不能做任何事情。
抽象层级: 接口-》抽象-》普通类
声明:interface 接口名
关键字:implements
接口的继承:一个接口能继承另一个接口,和类之间的继承方式比较相似。
接口的继承使用extends关键字,子接口继承父接口的方法。
接口优点:重构、复用性更好、定义规则和实现无关 面向接口编程 契约式
缺点:必须全部实现抽象方法 否则该类需要被abstract
接口里面可以定义普通的成员变量吗? 只能定义常量 默认为public static final类型
int NUM = 55;
public static final double PI = 3.14;// 以上两种方式都是在定义常量
// NUM = 66; 无法修改,该语句会报错
接口里面可以有构造方法吗? 不能定义,因为成员变量只能为常量,那么构造方法没意义,会报错
接口里面可以定义非抽象方法吗? 不能,会报错,接口中所有方法都是抽象方法
接口呢个被实例化吗? 不能
接口可以当引用? 可以 (多态的体现)
InterfaceDemo in = new Demo();
接口中定义抽象方法:
public abstract void show();// 显示定义
void show1();// 两种方法都是定义的抽象方法 默认加上public abstract 隐式定义
JDK1.8在接口里面支持定义类方法 默认的方法default
类方法:使用static修饰(静态方法),属于整个类的,不是属于某个实例的,只能处理static域或调用static方法;
实例方法:属于对象的方法,由对象来调用。
区别:1、类方法在该类被加载到内存时就分配了相应的内存空间。
实例方法不会被分配内存空间,只有在对象创建之后才会分配。
2、实例方法可以调用该类中的其他方法。
类方法只能调用其他类方法,不能调用实例方法。
3、实例方法既能对类变量操作也能对实例变量操作。
类方法只能访问其他static方法和其他static数据,类变量。
接口与抽象类的异同:
抽象类 接口
* 设计原则: 抽象类: 动作抽象 接口:行为抽象
* 声明 abstract 类名 interface 接口名
* 特点: 继承 单继承 实现 多实现
* 内部: 有变量、有构造函数、有普通方法 没有变量、构造函数、普通方法
* 关键字 extends 继承 implements 实现
*
* 相同:都不能被实例化
单继承多实现的简单例子:
//接口
public interface interfaceDemo {
public abstract void father();
}
//接口
interface grandafather{
public abstract void grandfa();
}
//抽象类
abstract class mather{
public abstract void mather();
}
//单继承,多实现
class son extends mather implements interfaceDemo,grandafather{
@Override
public void father() {
// TODO Auto-generated method stub
System.out.println("爸爸说,这是我儿子");
}
@Override
public void mather() {
// TODO Auto-generated method stub
System.out.println("妈妈说,这是我儿子");
}
@Override
public void grandfa() {
// TODO Auto-generated method stub
System.out.println("爷爷说,这是我儿子");
}
}
class interTest{
public static void main(String[] args) {
son s =new son();
mather s1 =new son();
grandafather s2 =(grandafather)s1;
interfaceDemo s5 = (interfaceDemo)s2;
s1.mather();
s5.father();
s2.grandfa();
}
}
输出为:
妈妈说,这是我儿子
爸爸说,这是我儿子
爷爷说,这是我儿子
接口与抽象类什么时候使用?
* 抽象继承:xxx是yyy的一部分(如studen是person的一部分)
* 接口实现:xxx包含yyy的一部分(如student包含Smoking)
*
* 接口:行为抽象(范围更广泛) 抽象:动作抽象(具体的动作)
* 抽象继承 is a 子类和父类(基类)关系 接口:实现
*(个人理解:行为是指一种持续性的动作或举止,不是一瞬间完成的,而动作就是具体的某个动作,可以一瞬间完成的。比如,吃饭是行为,吃是动作;跑步是行为,跑是动作;抽烟是行为,抽是动作)
实例:(这里eat定义的为抽象类里面的抽象方法,smoke定义的是接口里面的抽象方法)
//抽象类
public abstract class Person {
public abstract void eat();
}
//接口
interface Smoking{
void smoke();
}
//一个类可以同时继承和多个实现
//如果一个类没有实现接口里面的方法 那么这个类必须被abstract修饰
class Student extends Person implements Smoking
{
public void smoke(String name) {
// TODO Auto-generated method stub
System.out.println(name+"小烟抽抽");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("阿三吃饭用手抓");
}
@Override
public void smoke() {
// TODO Auto-generated method stub
System.out.println("抽烟");
}
}
class StuTest{
public static void main(String[] args) {
Student stu = new Student();
stu.eat();
stu.smoke("如花");
}
}
结果为:
阿三吃饭用手抓
如花小烟抽抽