第二十八、Java面向对象之抽象类

目前存在的问题:

1. 动物类的shout方法描述的不正确。
2. 没有强制要子类一定要重写shout方法。

抽象类的应用场景:

我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。

抽象类的好处: 强制要求子类一定要实现指定的方法。


为什么使用抽象类

1、定义Dog类

       有颜色属性和叫的方法

2、定义Bird类

       有颜色属性和叫的方法

3、定义其父类Animal

       1:抽取共性颜色属性和叫的方法

                 1)颜色的属性可以使用默认初始化值。

                 2)叫的方法在父类中如何定义?

                      1》狗是旺旺

                       2》鸟是叽叽喳喳

                       3》可以将父类的方法定义为狗叫让鸟继承父类重写叫的方法

                             ***   鸟怎么确定是否要重写父类方法。

                             ***   不重写,编译和运行都没有问题,只是执行鸟叫的方法就会出现狗叫

                       4》父类的方法很难确定。


class Animal {
	String color;

	 void shout(){
		 //如何定义呢?是旺旺还是叽叽喳喳?
	 }
}

class Dog extends Animal {

	void shout() {
		System.out.println("旺旺");
	}

}

class Bird extends Animal {

	void shout() {
		System.out.println("叽叽喳喳");
	}
}



         2:使用abstract


4、抽象类

               1:当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。

5、抽象类的实现方式

           1:定义animal类

                        1)定义叫的方法,无法确定方法体,不写方法体

                        2)publicvoid shout(); 编译失败

            2:根据提示在shout的方法加入abstract修饰

                          1)编译失败,有新的提示

            3:根据提示将类加入abstract修饰

                           1)编译通过


abstract class Animal {
	String color;
       //抽象的方法
	abstract void shout();
}

class Dog extends Animal {

	void shout() {
		System.out.println("旺旺");
	}

}

class Bird extends Animal {

	void shout() {
		System.out.println("叽叽喳喳");
	}
}

6、抽象类的特点

           1:有抽象函数的类,该类一定是抽象类。

           2:抽象类中不一定要有抽象函数。

           3:抽象类不能使用new创建对象

                1)创建对象,使用对象的功能,抽象类的方法,没有方法体。

            4:抽象类主要为了提高代码的复用性,让子类继承来使用。

            5:编译器强制子类实现抽象类父类的未实现的方法。

                 1)可以不实现,前提是子类的也要声明为抽象的。

7、抽象的优点

           1:提高代码复用性

                   强制子类实现父类中没有实现的功能

           2:提高代码的扩展性,便于后期的代码维护

8、抽象类不能创建对象,那么抽象类中是否有构造函数?

       1:抽象类中一定有构造函数。主要为了初始化抽象类中的属性。通常由子类实现。

9、final和abstract是否可以同时修饰一个类? 

           一定不能同时修饰。


abstract class Animal {

	String name;

	// 抽象类可以有构造函数
	Animal() {

	}

	Animal(String name) {
		this.name = name;
	}

	abstract void shout();

}

class Dog extends Animal {
	Dog() {

	}

	Dog(String name) {
		super(name);
	}

	void shout() {
		System.out.println("旺旺");

	}
}

class MyClass {

	public static void main(String[] args) {
		// 抽象类不能创建对象
		// Animal a=new Animal();
		Dog d = new Dog("旺财");

		System.out.println();
	}
}

抽象类要注意的细节:
      1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。
2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。
3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
5. 抽象类可以不存在抽象方法的。 (java.awt.*的类就是这样子操作的)
6. 抽象类是不能创建对象的。
疑问:为什么抽象类不能创建对象呢?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
调用抽象方法是没有任何意义的。
7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

      8.abstract与其他修饰符的关系:

             final与abstract不能共存:

                       final:它的作用  修饰类代表不可以继承  修饰方法不可重写

                       abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。

            static 修饰的方法可以用类名调用,

                      对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,也就是说不可以与static共存。

            private

                      private修饰的只能在本类中使用,abstract方法是用来被子类进行重写的,有矛盾, 所以不能共存.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值