一、抽象类
1.定义
在普通类的基础上扩充了一些抽象方法。
2.抽象方法
只有方法声明,没有方法体。
3.关键字abstract
所有的抽象方法必须用abstract关键字来定义。并且抽象方法所在的类也要用abstract修饰,表示抽象类。
4.抽象类的使用说明
1)子类
所有的抽象类必须有子类。如果子类不是抽象类,子类必须覆盖所有的抽象方法。
2)实例化
抽象类的对象可以通过对象多态性利用子类为其实例化。
即使抽象类中没有定义任何抽象方法,此时抽象类仍然无法直接创建实例化对象。
抽象类不能直接产生实例化对象。必须由其子类(实现了所有抽象方法的子类)实例化。
子类实例化时,会默认调用父类的无参构造;如果没有调用父类的其它构造方法而且父类也没有无参构造时,就会报错。
3)关于修饰符
private与abstract不能同时使用。
因为被final修饰的类不能有子类,而抽象类必须有子类,因此抽象类不能被final修饰。
因为抽象方法必须能被覆写,所以抽象方法不能被private修饰。
4)抽象方法与抽象类的关系
抽象类中可以没有抽象方法,但是抽象方法所在的类一定是抽象类。
注意:如果构造方法中没有设置属性的值,那么对象中的属性为其对应数据类型的默认值。
5)抽象类的分类
外部抽象类 内部抽象类
注意: 外部抽象类不能用static修饰,但是内部抽象类可以用static修饰。
5.代码示例
package com.xunpu.abstrctClass;
abstract class B{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// private void fun();//编译出错
public abstract void test();
}
class C extends B{
@Override
public void test() {
System.out.println("C类继承自抽象类B 年龄为:"+this.getAge());//父类中的属性,如果没有被赋值,则为默认值
}
}
public class A {
public static void main(String[] args) {
B b=new C();//使用抽象类的子类实例化对象 向上转型
// B b2=new B();//编译出错,抽象类不能实例化对象
b.test();
b.setAge(3);
if(b instanceof C){
C c=(C)b;
System.out.println(c.getAge());//通过父类给age赋值 3
}
}
}
结果:
二、接口
1.接口的作用
解决抽象类的单继承权限。实现多继承(继承多个接口)
2.接口的概念
1)声明:使用interface关键字。 如:interface IMessage
2)定义:抽象方法和全局变量的集合。即接口中所有的方法默认用public abstract修饰,所有的属性默认用public static final修饰。
3.使用说明
1)实例化
通过其子类实例化,然后再向上转型。这个子类必须覆写接口的全部抽象方法。
2)子类
用implements实现接口。 如:class A implements IMessage
一个子类可以实现多个接口,接口间用逗号分开。如:class A implements B,C,D 类A继承了接口B,C,D。
当一个类既继承抽象类,又要实现接口时,先使用extends继承抽象类,然后再用implements实现接口。 如:class M extends A implements B,C{}。
3)使用权限
接口中的属性和方法只允许是public权限。
阿里编码规约:接口中的方法和属性不要加任何修饰符号,public也不要加,保持代码的简洁性。
一般不在接口中定义属性。
4.接口的内部结构
接口中的内部结构可以是:内部普通类、内部接口。使用static继承的内部接口相当于一个外部接口。
5.接口的应用
定义操作标准
表示能力
在分布式开发中暴露远程服务方法。
package com.xunpu.abstrctClass;
interface IA{
String message="hello Interface!";
void print();
}
interface IFun{
boolean fun();
}
class Ib implements IA,IFun {
@Override
public void print() {
System.out.println(message);
}
@Override
public boolean fun() {
return message==null?true:false;
}
}
public class MyInterface {
public static void main(String[] args) {
Ib impleDouble=new Ib();
System.out.println(impleDouble.fun());
impleDouble.print();
}
}
三、抽象类与接口的继承关系和区别
1.开发中应遵循“接口优先”的原则。
在一个操作既可以使用抽象类又可以使用接口时,优先考虑使用接口。
2.继承说明
一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类。
实现接口的抽象类也可以不实现接口中的抽象方法。
接口间是可以继承的。一个接口可以使用extends继承多个父接口。
抽象类间也是可以继承的。不过遵循”单继承“。一个抽象类只能继承一个抽象类。
3.区别
1)结构组成
接口由抽象方法+全局变量组成。抽象类由普通类+抽象方法组成。(甚至可以没有抽象方法)
2)权限
接口中的方法和属性只允许public权限。抽象类中可以允许各种权限。
3)子类使用
接口中子类用implements实现接口。抽象类子类用extends继承抽象类。
4)二者的继承关系
一个抽象类可以实现多个接口。 但是接口不能继承抽象类,但是接口可以使用extends继承多个父接口。
5)子类继承限制
子类可以实现多个接口,多个接口间用","隔开。 但是只能继承一个抽象类。
四、对象的实例化步骤
1)进行类加载
2)进行类对象的空间开辟
3)进行类对象中的属性初始化(构造方法)