一.抽象类
抽象类和普通类只有一点区别,那就是抽象类中包含抽象方法,普通类没有,其它的和普通类一样,正是抽象方法才让它的使用和普通类不一样。
抽象类是设计用来专门当父类的,作用类似于模板,目的就是就是让设计者依据它的格式创建新类,抽象类不能直接创建对象,只能通过继承它创建新类由新类创建对象,它使用规则如下:
子类必须覆写抽象类中的全部抽象方法。
一个抽象类不能使用final关键字声明,抽象方法不能使用private方法声明,抽象类中可以有构造方法。抽象类的定义格式如下:
abstract class 类名称{
属性;
访问权限 返回值类型 方法名称(参数){
[return 返回值];
}
访问权限 abstract 返回值类型 方法名称(参数){
//在抽象方法中没有方法体
}
}
二.接口
接口可以理解成一种特殊的类,是由全局常量和公共的抽象方法所组成的,定义格式如下图:
在接口中抽象方法必须定义成public,即使不写也是public权限,而不是default。
一个子类实现接口必须实现接口中所有的抽象方法。
接口要使用也必须通过子类,用implements关键字,声明格式如下图:
由声明可以看出一个子类可以实现多个接口,这已经摆脱了Java的单继承局限。
子类也可以同时继承抽象类和实现接口,定义格式如下图:
接口也可以多继承,定义格式如下图:
子类必须覆写抽象方法,不管它是接口中的还是抽象类中的。
三.对象多态性
多态在Java中表现为重载和覆写。还有对象的多态性,分为向上转型和向下转型。对于向上转型,程序自动完成,对于向下转型,必须要明确指明要转型的子类类型,定义格式如下:
向上转型是安全的,因为子类对象实例一定是父类对象实例;但是向下转型不安全,所以向下转型时必须要发生向上转型,否则会发生转换异常。
假设B是A的子类,向下转型时应该要 A a = new B();这相当于子类自己去实例化父类对象,这样父类就知道了自己有这么一个子类,这样就不会发生异常了。
**发生向上转型后,父类对象调用的一定是被子类覆写过的方法。**所以多态好
**instanceof关键字:**判断一个对象是哪一个类的实例,格式如下:
对象 instanceof 类 ----->返回boolean类型
对象向下转型时可以先进行判断再进行相应的转换工作,这样可以避免转换异常的出现。
类的设计中重点在于父类的设计,永远不要去继承一个已经实现好了的类,只能继承抽象类或接口,因为一旦发生对象的向上转型后,所调用的方法一定是被子类覆写了的方法。
抽象类可以理解成模板,接口可以理解成标准。
接口是功能方法的集合。
二者区别联系如下图:
四.Object类
Object类是所有类的父类,其中有以下方法:
对于toString()方法:对象输出时一定会调用它打印内容,所以我们可以通过它取得对象的一些信息。
public class TestExtends {
public static void main(String[] args) {
Person4 person4 = new Person4("张三",17);
System.out.println("对象信息:"+person4);
}
}
class Person4{
private String name;
private int age;
public Person4(String name,int age){
this.age = age;
this.name = name;
}
public String toString(){
return "姓名:"+this.name+";年龄:"+this.age;
}
}
equals()方法就是用来对象的比较。但它默认是对对象地址的比较,而不是对象内容。
Object接收任意引用类型的对象,包括数组和接口类型,所以在类库设计上很多都采用Object作为方法的参数,这样比较好操作。
五.包装类
Java中一切皆对象,但是基本数据类型又不能称之为对象,此时就要对基本数据类型进行包装,这就是包装类的作用。如下图:
其中Character,Boolean是Object的直接子类,而其它六类是Number的子类,Number类是一个抽象类,主要是把包装类的内容转换成基本数据类型。
装箱是指把基本数据类型变为包装类,拆箱是指把包装类变为基本数据类型,其中JDK1.5之前要自动装拆箱,JDK1.5后系统自动装拆箱。