【一】抽象类和接口

抽象类

在我看来,抽象类就是一个模板(相当于是一种概念,所以没有实例)。不用太纠结什么是抽象类,反正都是抽象出来的东西

相比于普通类,抽象类在类名前有abstract修饰符 ,然后就是可能会增加一些抽象方法

并且不能通过new来创建实例对象(但是抽象类有构造方法),只能由继承它并重写了其所有抽象方法的子类来创建实例对象

  • 抽象类可以有抽象方法也可以没有,由abstract关键字修饰的方法、没有方法体(有抽象方法的一定是抽象类
  • 抽象类实际上就多了一些抽象方法而已,虽然抽象类中抽象方法可有可无
抽象类
public abstract class Animal {

	private void run() {
		
	}
	public static void method() {
		System.out.println("抽象类中的静态成员方法");
	}
	public Animal() {
		System.out.println("这是抽象类的构造方法");  //抽象类可以有构造方法
	}
	public void method1() {
		System.out.println("这是普通方法1");
	}
	public abstract void eat();
	public abstract void sleep();
	
}

子类(普通类)必须重写父类的抽象方法
public class Dog extends Animal {

	private void run() {

	}

	public static void method() {
		System.out.println("子类隐藏父类的静态成员方法");
	}

	
	public Dog() {

		System.out.println("这是子类的构造方法");
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub

	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub

	}

}


子类(抽象类) 可以不用对抽象方法重写
public abstract class Bird extends Animal{
	public Bird() {
		// TODO Auto-generated constructor stub
		System.out.println("抽象类继承抽象类");
	}

}

上面的代码中,子类父类都存在一个完全相同的静态方法method()  可以发现在eclipse中也没有@override注解出现,如果加上@override注解将会报错,静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏替换,所以这里并不是重写,可以看作这两个方法并无关系。

抽象方法不能搭配的修饰关键字static、final、private  (不能是本地方法[native]、也不能被synchronized修饰)

  •  抽象方法不能由static修饰,static修饰的方法为静态方法,随着类的创建而创建,抽象方法是需要子类重写才能调用的,也就是说是动态的。静态方法可以由类.方法名直接调用,但是抽象方法是没有方法体的,不能直接调用,并且静态方法本身就不能被重写
  • 由下图可知如果用static 修饰抽象方法,在eclipse中会报错  抽象方法只能由public和protect修饰

 

  • final和abstract搭配则毫无意义,final意为最终的,不能修改和重写,而abstract是需要继承然后重写的, 所以结果很明显
  • private修饰的方法为类私有,子类能继承但是不能访问,故不能重写,与抽象方法必须重写相矛盾
  • 本地方法(native)是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。
  • synchronized 修饰没有方法体的抽象方法???
  • 抽象方法只能用public和protect访问修饰符

接口

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。

接口中的方法定义默认为public abstract类型

接口中的成员变量类型默认为public static final。 

1.抽象类可以有构造方法,接口中不能有构造方法。  

2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

3.抽象类中可以有普通成员变量,接口中没有普通成员变量 

4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型

7. 一个类可以实现多个接口,但只能继承一个抽象类。

猜你喜欢

转载自blog.csdn.net/qq_39277571/article/details/83032842