Java总结-继承和抽象


继承:
提高了代码的复用性,增强了扩展功能。
让类与类之间产生了关系,该关系的出现,就有了第三个特征:多态。

出现了子父类:
父类如何由来:
对事物进行分析:不断的向上抽取相同的内容。出现父类。
子类可以获取父类中非私有的成员。

当子父类中出现一模一样的方法时:会出现的覆盖操作。

使用覆盖的注意事项:
1,子类在覆盖时,权限必须要大于等于父类的权限。
2,静态只能覆盖静态。


当功能一致还有使用父类中的原有功能时,需要通过super对其进行调用。

覆盖:
class Fu
{
void show(){}
}

class Zi extends Fu
{
void show(){super.show();}
}


super:该关键字的使用和this相同。
this代表的本类对象的引用。super代表的是父类对象的引用。


子类的实例化过程:
1,子类中所有的构造函数默认都会访问父类中的空参数构造函数。
原因:每一个构造函数的第一行有一条默认的super()语句,该语句是隐式的。
为什么非要访问父类中的构造函数呢?
因为子类会获取父类中的成员,所以要先看父类是如何对该成员进行初始化的。

为什么要放在第一行呢?
因为初始化的动作要先完成。

2,当父类中没有空参数的构造函数时 ?子类的构造函数必须通过this或者super语句指定要访问的构造函数。

class Fu
{
Fu()
{

System.out.println("Fu");
}
}

class Zi extends Fu
{
Zi()
{
//super();
System.out.println("Zi");
}
}

main()
{
new Zi();// Fu Zi.
}


----------------
java只支持单继承,不支持多继承。
原因:如果支持多继承,会存在安全隐患。当多个父类中定义了相同功能,但功能体不一致。
那么子类对象在调用该功能时,不明确会运行哪一个。
一个儿子只能有一个父亲。不可以有多个父亲。

什么时候定义继承呢?
当类与类之间出现了所属关系(is a)时,可以定义继承。
怎么判断所属关系呢?
这个类是否可以获取另一个中所有的内容。如果可以,可以将这个类继承另一个类。
注意:千万别为了拿到其他类中的方法而进行继承。

class A
{
void show1(){}
void show2(){}
void show3(){}
void show4(){}
}

class B extends A
{
void showA(){}
void showB(){}

}
有A,B两个类。
A 中有四个功能。show1 show2 show3 show4
B中也有四个功能。showA showB show3 show4

B中的两个功能。在A中已有。那么可不可以直接继承A,而获取这两个功能呢?
虽然B获取到了show3。show4功能。但是,也将不需要的show1,show2获取到了。
这时B和A之间是不存在继承关系的。

虽然A和B没有继承关系,但是A和B中是不是有相同内容,那么A和B可以向上抽取。提高代码的复用性。

将相同功能,抽取到C类中。
class C
{
void show3(){}
void show4(){}
}

class A extends C
{
void show1(){}
void show2(){}
}

class B extends C
{
void showA(){}
void showB(){}

}


扩展:继承的出现,有一个弊端,就是打破了封装性。


--------------------------------

final:
1,final可以修饰类,方法,变量。
2,final修饰的类不可以被继承。
3,final修饰的方法不可以被覆盖。
4,final修饰的变量是一个常量。只能被赋值一次。
5,内部类在局部位置上,只能访问被final修饰的局部变量。

final其实就是用来锁住内存区域。为了增强程序的严谨性。


--------------------------------

抽象类:
1,抽象方法的出现需要存在与抽象类中。
2,抽象类和抽象方法需要使用abstract关键字来修饰。
3,抽象方法只需要声明,不需要实现。
4,抽象类不可以通过new进行实例化。
原因:抽象类实例化,调用抽象方法没意义。
5,抽象类必须由自己的子类覆盖调用所有的抽象方法后,
子类才可以进行实例化,否则该子类还是抽象类。


抽象类是怎么出现的呢?
其实也是向上抽取而来的。
方法分成两部分,一部分是方法声明,一部分是方法主体。
在向上抽取的过程中,出现了功能声明一致,但是功能主体不同。
这时,我们只抽取声明,而不抽取主体。
那么这个没有主体的方法,需要定义成抽象的来表示。
而抽象方法一定要存在与抽象类中。

示例:
需求:预热班学生,就业班学生。

预热班学生:学习方法(学习是基础部分),睡觉方法(我倒)。
就业班学生:学习方法(学习是高级部分),睡觉方法(我倒)。

这些学生具备一些共性。
为了提高复用,向上抽取相同功能。

abstract class XueYuan
{
void sleep()
{
System.out.println("wo dao");
}
abstract void study();
//void study(){System.out.println("xuexineirong");}
}
//抽象方法有什么好处呢?强制子类去做某些事。
class YuRe extends XueYuan
{

vodi study()
{
System.out.println("base");
}
/**/
}
class JiuYe extends XueYuan
{
void study()
{
System.out.println("gaoji ");
}
}
//一年后来了个冲刺班:
class ChongCi extends XuYuan
{
void study()
{
System.out.println("chongci ");
}
}

抽象类的特点:
1,抽象类中是否有构造函数呢?
抽象类和一般没有太大的区别,也是一样在不断的描述事物,只不过该类可以定义抽象方法而已。
所以该类中是有构造函数的。该构造函数的出现为了给子类继续实例化的。

2,抽象类中可不可以不定义抽象方法呢?
可以,那么该类的出现只有一个作用,就是不让该类建立对象。
这种情况相对少见,awt,适配器类是这样设计的。如WindowAdapter。

抽象关键字不可以和哪些关键字共存呢?
private static final



需求:
公司内有普通员工,和经理,所有的员工都具有姓名,工号,工资。
对于经理多了一个奖金。
请设计一下该程序的基本数据模型。

abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
ths.pay = pay;
}
abstract void work();
}

class Pro extends Employee
{
Pro(String name,String id,double pay)
{
super(name,id,pay);
}
void work()
{
System.out.println("pro work")
}
}

class Manager extends Employee
{
private double bonus;
Manager(String name,String id,double pay,double bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
void work()
{
System.out.println("manager work");
}
}

------------------------------------------------




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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.csdn.net/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.csdn.net/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.csdn.net/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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值