java基础---抽象类

1. 抽象:模糊, 发现事物的共性, 并向上抽取,提高代码的复用性;如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。

2. 向上抽取,不同的对象有相同的方法 功能, 但方法的内容不同;

//所包含的变量和方法,不能具体描述一个事物, 只是抽象出了一些动物的共性
abstract class animal
{
	//抽象方法也要加上abstract,表示抽象方法
	 abstract void shouting();
}

class dog extends animal
{
	//狗有吼叫,但吼叫的内容是汪汪
	void shouting()
	{
		System.out.println("wangwang");
	}
}

class cat extends animal
{
	//猫有吼叫, 但吼叫的内容是喵喵
	void shouting()
	{
		System.out.println("miaomiao");
	}
}
3. 方法只有声明没有实现时候,该方法就是抽象方法,需要被abstract修饰;抽象方法必须定义在抽象类中,该类也必须被abstract修饰;因为一个类不是抽象类, 很有可能被创建对象, 当对象调用到该类的抽象方法时候,就产生矛盾;

4. 抽象类不能被实例化;也就是不能new 对象;因为调用抽象方法没有意义;

5. 抽象类的所有方法都需要被子类所继承后, 该子类才能实例化,否则该子类还是抽象类;

6.  抽象类有构造函数,因为抽象类的构造函数用于给子类对象进行初始化;

7. Java抽象类中不能有静态的抽象方法。静态方法必须自立更生,要有具体的实现,JVM规定当前类必须为静态方法提供实现。而抽象方法呢?不用实现它。所以这两个修饰关键字是矛盾体,一对冤家

8. 抽象方法必须由子类来进行重写。

9. 抽象方法必须在子类中实现,这句话对吗?

从两个层面来回答:
1. 某一个类如果定义了某个方法是抽象方法,则在本类中不能有任何实现,必须在子类中实现才行。(这里的子类,是广义的子类。)
2. 某一个类如果定义了某个方法是抽象方法,其子类并非一定要实现。不想实现父类中的抽象方法的话,子类同样定义成抽象类就是了。(这里的父类,也是广义的父类。)

10. 抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

11. 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

12. 子类中的抽象方法不能与父类的抽象方法同名。

13. abstract不能与final并列修饰同一个类。

14.abstract 不能与private、static、final或native并列修饰同一个方法。、

 private不行的原因是private修饰的变量和方法不会被子类所访问, 子类没有这个权限, 而定义抽象的意义就是让子类重写, 子类都不能访问到 , 就不能重写了

1.为什么不能在abstract方法前加static呢?
在没有实例化类的情况下(不讨论abstract类不能实例化),加了static后可以直接通过Class.method()来调用该方法,这个方法都没方法体,你觉得调用这样的方法有实际的意义么。(编程语言就是为了解决生活中的问题,而这个问题在生活中是没有意义的那编程语言也不会去实现它,如: 一台电视机上有一个电源按钮(方法),而这个按钮按下却没有任何作用,你说这样的按钮有实际的意义吗?)。static是静态,就是在编译时已经确定的东西,当然不能是抽象(动态)的,那是运行时才能确定的东西。


2.为什么不能加final?
abstract类需要被继承才能使用的,给方法加了final后方法就不能被导出类(子类)所修改,abstract类还没有实现,而子类又不许修改。这将产生一个没有实际意义的方法(跟就上面说的电源按钮一样)。

15.在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。

Java中,类与继承-抽象类有以下几个关键点。首先,继承是指一个类可以继承自另一个类。被继承的类被称为父类/超类/基类,而继承其他类的类被称为子类。继承使得子类可以拥有父类中所有的成员(成员变量和成员方法),从而提高了代码的复用性。 其次,当子类继承自一个抽象类时,子类必须重写父类所有的抽象方法,否则该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则从最初的父类到最终的子类都不能创建对象,失去了继承的意义。 一个示例代码如下: ``` public abstract class Animal { public abstract void run(); } public class Cat extends Animal { public void run() { System.out.println("小猫在墙头走~~~"); } } public class CatTest { public static void main(String[] args) { Cat c = new Cat(); c.run(); } } ``` 在上述代码中,Animal是一个抽象类,其中定义了一个抽象方法run。Cat类继承自Animal类,并且重写了run方法。在CatTest类的main方法中,创建了一个Cat对象并调用了run方法。 更多关于Java类与继承-抽象类的知识,可以参考Java基础教程之接口的继承与抽象类。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java面向对象基础——继承、抽象类](https://blog.youkuaiyun.com/qq_42538127/article/details/115426682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【JavaSe】面向对象篇(六) 抽象类](https://blog.youkuaiyun.com/qq_41744145/article/details/100023046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java基础教程之接口的继承与抽象类](https://download.youkuaiyun.com/download/weixin_38516270/12808613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值