java基础三 [深入多态,接口和多态](阅读Head First Java记录)

抽象类和抽象方法
1.抽象类的声明方法,在前面加上抽象类的关键词abstract
abstract class canine extends animal{
     public void roam(){}
}
抽象类除了被继承过之外,是没有用途,没有值,没有目的。类中的方法可以当做子类的合约内容,合约是对其他程序的承诺协议
抽象类中可以带有抽象和非抽象的方法
如果类中有抽象方法,则类必定标识为抽象的。
 
2.抽象的方法没有实体
(因为方法中的程序代码没有意义。抽象类需要被extend过有意义,抽象方法一定要被覆盖才有意义)
public abstract void eat();//没有方法体,直接分号结束
注意:声明的抽象方法必须在抽象类下,不允许非抽象类拥有抽象方法。
 
3.使用抽象类和抽象方法的好处
多态,使用父类参数作为方法的参数、返回类型或数组类型,这样不同的子类不用写很多种方法,多态的好处就是所有的子型都会有那种方法
 
Object类
java中所有的类都是从Object这个类继承出来的,Object不是抽象类。
 
1.Object类有两个目的
作为多态让方法可以应付多种类型的机制;
提供了部分方法的具体代码实现,使得任何类在执行期都有方法可用。
 
2.Object类作为终极对象,它具有哪些主要方法
equals(object o)//对象是否相等
getClass()//获得对象被初始化的类
hashCode()//获得对象的hash代码,唯一id
toString()//列出类的名字等信息
 
3.为什么不所有参数和返回类型都设定成Object
 
3.1java是类型检查很强的语言,编译器是根据引用类型来判断有哪些method可以调用。如果想调用子类中有父类中没有的方法,就不能用父类做引用变量。例如:
Object o=new ferry();
o.gofast();//非法,Object中没有这个方法。
 
3.2使用Object定义的变量返回的值也是Object类型的,将不能被赋值为其他类型的变量。
例如当把对象装进ArrayList<Object>时,不论它原来时什么类型,现在只能把它当作Object类型。这样你就只能使用Object的方法(当然可以使用强制转换来更改类型)
 
4.将Object转换为原来的类型
Object o =al.get(index);
Dog d=(Dog) o;//使用(Dog)进行强制转换
d.roam();
如果不确定对象是不是Dog,可以使用instanceof来判断类型,如果转换错误会抛出异常ClassCastException:
if(o instance Dog){
     Dog d=(Dog) o;
}
 
接口
接口是100%纯抽象的类(无法被初始化的类)。想要更好的使用多态需要接口。接口相当于一个规范,子类需要实现所有的方法。
 
1.为什么要有接口?
a.有些类不适合初始化,比如animal,而他的子类是可以被实例化的,比如dog。所以为了防止这个类被初始化(被new出来),通过标记类为抽象类来实现。抽象类不能被实例化,但是可以作为引用类型。
b.可以很好的解决java不能多重继承的问题,解决方法就是把所有方法都设为抽象的,让子类将所有的方法重写一遍。
(我理解的接口,定义一个抽象的合约规范,然后子类去实现这个接口的具体方法,这样子类肯定遵守来这个合约规范,更好的使用了多态)
 
2.接口的定义(使用关键字interface)
public interface pet{具体的abstract抽象方法,没有内容,直接分号结束,可以不写abstract关键词也是默认抽象的}
例如:
interface pet{
     String name=“cat”;
     void run();
     String jump();
}
 
说明:
a.public修饰符不是必填的,如果不写接口的权限为默认的public的abstract类
b.接口可以继承自其他接口
c.接口的方法也不用填写public等修饰符,默认public。且方法不需要写abstract关键词,也表示是一个抽象方法
d.接口的常量默认是public static final标志
 
3.接口的实现
public class dog extends canine implements pet{具体的接口实现,必须在这里实现接口下所有方法的实现,这是合约规定}
 
说明:
a.使用implements关键词来实现接口
b.如果既要继承父类又要实现接口,extends写在implements前面
c.一个类可以一次implements多个接口(使用逗号隔开),引用多个接口同名变量时使用接口名.常量来定义,如果是方法名同名,定义一个方法就可以了。
d.子类调用父类的方法,可以使用super.xxx();
e.UML类图使用虚线箭头表示接口的实现(箭头指向接口)也可以用圆圈表示;实线空心封闭箭头表示继承(箭头指向父类)[但是不知道为什么书上用的是实线箭头来表示的继承]
 
 
 
原文地址:https://www.cnblogs.com/meitian/p/5602286.html