抽象类
1.1抽象类的概念:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都时用来描绘对象的,如果一个类中没有足够的信息来描绘一个具体的对象,那么他就是抽象类。

1.11说明
(1)猫,狗,鱼都是动物,因此和动物的关系应该是继承关系
1.2抽象类语法:在Java中,一个类如果被abstract修饰,则这个类就是抽象类,对于类中的方法不用实体化。
abstract class Animal{
public int age;
public String name;//抽象类中可以有普通属性,以及他的构造方法等
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
public void print()
{
System.out.println("名称:"+this.name);//抽象类中也可以有不是抽象类的方法
}
abstract void eat();//抽象方法无方法体
abstract void run();
}
注意:抽象类也是类,它可以有普通属性,普通方法
1.3抽象类的特性
1.3.1抽象类不可以直接实例化,要想实例化必须由一个不抽象的子类继承并且重写抽象类中的抽象方法

1.3.2抽象方法不可用private修饰

1.3.3抽象方法不能被final,static修饰,因为抽象方法要被在子类重写

1.3.4抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也会是一个抽象方法,必须也有abstract修饰
class Cat extends Animal//子类为不抽象的类
{
public Cat(int age, String name) {
super(age, name);
}
public void eat()//重写父类的抽象方法
{
System.out.println("吃猫粮");
}
public void run()
{
System.out.println("四条腿行走");
}
}
class Dog extends Animal
{
public Dog(int age, String name) {
super(age, name);
}
public void eat()
{
System.out.println("吃狗粮");
}
public void run()
{
System.out.println("四条腿行走,比猫跑得快");
}
}
class Fish extends Animal
{
public Fish(int age, String name) {
super(age, name);
}
public void eat()
{
System.out.println("吃鱼粮");
}
public void run()
{
System.out.println("用鱼鳍游动");
}
}
1.3.5抽象类中不一定包含抽象方法,由抽象方法的类一定是抽象类
1.3.6抽象类中可以有构造方法,供子类创造对象时,初始化父类成员变量
public int age;
public String name;//抽象类中可以有普通属性,以及他的构造方法等
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
1.4抽象类的作用->为了被继承
使用抽象类时,实际工作不应该由父类完成,而应该有子类完成,那么因此如果不小心误用成了父类,普通编译器会报错,以及抽象的父类被实例化时也会报错,这让我们可以尽早的发现错误,充分的发挥了编译器的校验功能。
接口(接口是为了解决多继承问题)
2.1接口的概念:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,即可,在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.2接口语法:接口的定义与类的定义格式基本相同,关键字为interface。
interface Iswimming
{
public abstract void swim();//public abstract 是固定的,可以省略
//void swim();
}
2.3接口的使用:接口不能直接使用,需要有一个”实现类“实现该接口,实现接口中的所有抽象方法。
class animal implements Iswimming//用implements来实现接口的连接
{
@Override
public void swim() {
System.out.println("一部分动物会游泳");
}
}
2.4接口的特性
2.4.1接口是一种引用类型,但是不能直接new接口对象(因为它是抽象的)

2.4.2接口中的方法是不能在接口中实现的,只能由实现类中实现(除被 static,default修饰的方法)



2.4.3重写接口中的方法时,不能使用默认的访问权限(一定要使用public);
2.4.4接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量
public static final int age=1;
int age1=1;
2.4.5接口中不能有静态代码块,和构造方法

2.4.6接口虽然不是类,但是接口编译完成后字节码文件的后缀也是.class
2.4.7如果类没有实现接口中的所有抽象方法,则该类必须设置为抽象类。
2.5实现多个接口:在Java中类和类之间的继承是单继承,一个类只能继承一个父类,可以多层继承,但是一个类可以实现多个接口。
注意:1.一个类实现多个接口时,每个接口的抽象方法都要实现,否则类必须设置为抽象类。
2.如果有继承也有接口一定要先写继承在写接口
class animal extends animals implements Iswimming
接口与继承的区别
(1).类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.
(2).接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
(3).一个类一次可以实现若干个接口,但是只能扩展一个父类
(4).接口可以用于支持回调,而继承并不具备这个特点.
( 5).抽象类不能被密封。
(6).抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.
(7).(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
(8).抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的作为子类去实现。
(9).好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
(10).尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。
(11).如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.