面向对象day02

本文详细介绍了Java编程中的`this`、`super`关键字及其应用场景,阐述了构造器与setter方法在初始化成员变量时的区别。此外,文章讨论了继承的原因,Java中的继承语法,以及子类能继承父类的哪些成员。同时,解释了方法覆盖的规则以及何时需要定义抽象方法。最后,探讨了抽象类的使用和意义,指出抽象类不能直接实例化,用于强制子类实现特定方法。
摘要由CSDN通过智能技术生成

强调:一定用自己的话总结,避免抄文档,否则视为作业未完成。

this关键字的作用

在类中,如果成员变量的名称和当前类方法中形参的名称一样,此时要设置值给成员变量,如果直接用形参的名称和成员变量的名称,由于就近原则,两个参数名都代表形参,成员变量的值并未发生改变;此时就需要用到关键字this;在要设置值的变量名前面加上次关键字,就直接表示成员变量,就可以直接设置值个成员变量.

为成员变量设置值, 构造器和setter方法的选择,为什么?

构造器:构造器只能在创建对象的时候为成员变量设置值,一个对象只能用一次;

setter方法:可以在创建对象后,调用该方法设置任意次数的值

为什么需要继承?

当多个类中有重复代码时,我们可以把重复代码抽取出来放在一个父类中,然后让子类去去继承父类,这样我们就不用重复的编写代码,减少的代码的冗余,加快的代码编写效率,也方便后期的维护;

Java中的继承语法
public class 父类名{
    // 存放多个子类共同的字段和方法
}

public class 子类类名 extends 父类类名{
		// 存放自己特有的(独有的)字段和方法
}

Java中类只支持单继承,但是支持多重继承。也就是说一个子类只能有一个直接的父类,父类也可以再有父类。

class SuperSuperClass{}
class SuperClass extends SuperSuperClass{}
class SubClass extends SuperClass

一个父类可以有多个子类,但一个子类不可以有多个父类

class SuperClass{}
class SubClass1 extends SuperClass{ }
class SubClass2 extends SuperClass{ }
子类能从父类中继承到哪些成员?

使用public和protected修饰子类都可以继承, 当父类子类在同一个包中, 没有使用修饰符的也可以继承.

子类什么时候需要覆盖父类中的方法?

当父类中的方法与子类中的行为不符时,这时子类就需要重写父类中的方法;

例如:父类是一个Bird,这个类中定义了一个飞的方法;此时一个鸵鸟类继承了父类,在调用父类的方法是发现鸵鸟会飞,但事实是鸵鸟是不会飞的,这是就需要重写父类飞的这个方法

方法覆盖的规则
  1. 实例方法签名必须相同 (方法签名= 方法名 + 方法的参数列表)
  2. 子类方法的返回值类型是和父类方法的返回类型相同或者是其子类
  3. 子类方法的访问权限 >= 父类方法访问权限
    • 如果父类方法是private,子类方法不能重写。( 重写建立在继承的基础上,没有继承,就不能重写。)
  4. 子类方法中声明抛出的异常小于或等于父类方法声明抛出异常类型
super关键字的作用

当父类的方法被其子类重写,如果该子类还想调用父类的方法就需要使用super.方法名调用

注意事项

1.super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)(先创建父类然后创建子类)
2.this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
3.super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
4.this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

5.调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
   6.super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
   7.super()和this()均需放在构造方法内第一行。
   8.尽管可以用this调用一个构造器,但却不能调用两个。
   9.this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
   10.this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
   11.从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字

什么时候需要把父类中的方法定义成抽象方法?

当一个方法的参数和返回值都不明确,而子类中要编写这个方法,为了让子类在编写这个方法,但是方法名不能发生该改变(方便使用者调用),就把该方法定义成一个抽象方法,当子类不重写该方法或者把方法名改了就会发生报错

抽象类应该怎么使用?可以直接使用抽象类创建对象吗?

​ 抽象类是在其子类都有一个共同的方法,但是该方法的参数和返回值(类型相同)都不同,就可以定义一个抽象类(抽象类的命名应该带有abstract, 让人知名见意)里面定义一个抽象方法(抽象类必须有抽象方法);类必须覆盖父类的抽象方法,除非子类也是抽象类。

​ 抽象类中的抽象方法是没有方法体的,使用抽象类创建对象调用一个没有方法体的方法没有任何意义,而且也不能直接使用抽象类创建对象

抽象类的意义是什么?

抽象类是为了更好的管理方法的使用,让其子类在编写方法是必须重写抽象类中的抽象方法,也不可以随便的修改方法的方法名,方便使用者能够清晰明了的调用该方法;也是也符合java面向对象的一个原则,将多个具有相同行为的方法抽象出来,要使用时,再将其实例化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值