面向对象 继承 多态

面向对象

类里面有成员属性和行为
成员属性存放在类里面,而对象是由类实例化得来的,此处使用关键字new
Dog//类名 dog//对象名=new Dog()//表示得到一个新的对象
this指针
1.尽量都使用,让其赋值更有指向性,指向当前的值
2.this只能使用在方法里面

基本梳理

在这里插入图片描述在这里插入图片描述

对象的构造及初始化

在这里插入图片描述
特殊的两种 char boolean
在这里插入图片描述

构造方法

在这里插入图片描述
3.在整个对象的生命周期里只调用一次

在这里插入图片描述
当调用完成构造方法之后,对象才产生了(产生了就好了,产生了就不用了)
在这里插入图片描述
在这里插入图片描述
举个例子:在eat方法中调用show方法this.show();
属性的访问和方法的访问不用管在不在第一行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
右键选择generate,然后在工具里面选择你所要的方法,想要生成几个参数就选择几个参数

import导入包 有问题

在这里插入图片描述

static修饰

在这里插入图片描述
在这里插入图片描述
所以成员属性包括静态成员变量和非静态成员变量(普通成员变量),普通成员变量属于对象,而静态成员变量属于方法,在调用的时候使用(类名.成员变量名),甚至都不用类实例化产生对象
在这里插入图片描述
在这里插入图片描述
如果要在静态方法里调用非静态方法的话,一定要先类实例化对象,然后通过引用对象来实现方法的调用
在这里插入图片描述
因为this指针引用当前的对象,而静态方法在方法区,而不在对象区,所以在静态方法中不能直接调用非静态的方法或者成员变量(还可以通过对象的引用调用)

类和对象作业错题

【1】在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为:this(x)
this共有2种使用方式:
this.data 访问当前对象的实例成员变量
this.func() 访问当前对象的实例成员方法
this(参数列表) 访问当前对象的构造方法
此处在当前类当中,调用构造方法A(int a),使用this(x);的方式

【2】import 语句不能够导入一个指定的包,import语句只能导入一个包,所需要哪个包需要自己去调用,所以不接受指定

【3】class Test{
public String toString() {
System.out.print(“aaa”);
return “bbb”;

}
}

public static void main(String[] args) {
Test test = new Test();
System.out.println(test);
}

本题中主要考察toString 方法:
在这里插入图片描述
在执行println函数的时候,会调用Object类的toString方法,此时当我们自己类重新通过编译器实现了toString方法之后,会调用我们自己写的方法。
根据上面所述,调用我们自己写的toString方法后,执行输出语句,输出aaa,返回bbb交给println函数,输出bbb。(即在使用toString语句时,如果我自己定义了一定的输出值,那么就先执行我们自己写的语句,然后再return toString 语句)这道题就输出的是:aaabbb

【4】
在这里插入图片描述
因为x是由static修饰的,属于静态变量,静态变量是放在方法区的,与对象无关,所以无论上面代码中怎么引用对象,x都始终只有一个,属于类中的,所以x就按照代码顺序进行加加减减,得到102
程序通过编译,输出结果为:x=102
【5】

所以这个程序编译失败
在这里插入图片描述
static只能修饰成员变量,而现在它修饰int的时候放在了方法中,属于局部变量,不符合修饰标准

继承

子类继承父类所使用的关键词为extends
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
super关键字使用:在子类方法中访问父类,所以当super使用的时候一定在父类中
不能用在静态方法中!!

当子类继承父类之后,在构造函数的时候要先构造父类,再构造子类自己(先父后子)所以只能在子类中调用父类的构造函数
代码操作如下图所示
在这里插入图片描述
再识初始化,在上节课的学习中我们可以知道,在运行中我们是(1)静态代码块(2)实例代码块(3)构造方法
在本节课的学习中我们可以知道,子类在继承父类之后,代码块运行秉持先父后子的情况执行(如下图所示)
在这里插入图片描述
impo:静态实例只执行一次,所以接下来只执行

在这里插入图片描述
在这里插入图片描述
final关键字在这里插入图片描述
当一个类不想被继承的时候,那就加上一个final关键字(此时这种类被称为密封类),一般来说,我们不希望一个类被超过三个的子类继承
在这里插入图片描述
而当final修饰成员变量时,变量则变成常量,不能在被赋值修改
在这里插入图片描述
array1表示的是数组的一个地址,而final使其不能改变,所以array1不能再指向一个新的地址,一个新的对象

组合
在自己的类里面放置别的类所构成的成员变量称之为组合
在这里插入图片描述

作业错题

(1)在这里插入图片描述
输出结果为:BaseBase
在这里插入图片描述
1中调用自己的构造函数,但是子类的构造函数无参,自动保留第一行的super,以此来调用父类的构造函数,因此输出值为Base,而2中是直接调用父类的构造函数,输出Base,所以最终输出为:BaseBase

(2)在这里插入图片描述
本题考察代码的执行顺序:

类Z继承类X。
在继承层次上,先执行父类和子类的静态的,再执行父类的实例,父类的构造,最后执行子类的实例和子类的构造。
根据以上顺序,我们得出结论:本题中没有静态的。所以先执行1和2,再执行4和5。执行注释1和注释4的时候,分班打印Y。故最终的结果是YXYZ。

多态

在这里插入图片描述
(1)什么是向上转型?
在继承体系下,将子类对象给父类在这里插入图片描述
在这里插入图片描述
向上转型有三种方法
1,直接赋值法
Animal animal=new Dog(“小狗”,10)直接用父类将子类实例化对象
2,方法传参法
在这里插入图片描述
本来func()里面放的应该是animal的对象,但现在给的是dog,说明将子类的dog转化为父类的animal 对象,符合向上转型的特点(即将子类对象给父类)
在这里插入图片描述
3,返回值方法
在这里插入图片描述
下面的图片是对上面return new的解释
在这里插入图片描述

更推荐func(2)的写法,这样可以返回animal的类或者子类,而func(3)只能返回bird类或者子类
核心:定义一个父类方法,对象变量为子类,以达到将子类对象给父类的目的

(2)父类只能调用父类的方法
(3)方法重写——满足条件//子类将父类重写了
在这里插入图片描述
当我们满足了【1】向上转型和【2】方法重写以后,我们就通过父类引用,调用这个父类和子类重写的方法
但结果是:调用了子类方法!!
而这个过程我们叫做运行时绑定或者动态绑定【动态绑定是多态的基础】
那我们来看看【静态绑定】,也叫【编译时绑定】:方法的重载,在编译的时候,我们通过方法的参数等,我们在编译的时候就能确定他确定的是那个方法了
在这里插入图片描述
下面这张图片就解释了为什么【但结果是:调用了子类方法】
在这里插入图片描述

重写 注意事项(1.方法名相同2.参数列表相同3.返回值相同)

1.被private修饰的方法不能发生重写
2.被static修饰的方法不能发生重写
3.被final(密封方法)修饰的方法不能发生重写
4.访问修饰限定符与重写的关系:子类重写的方法的权限不能低于父类的
即:private<默认权限(什么都不写)<protected<public
PS:private修饰父类时,即使是子类也不能访问

5.被重写方法的返回类型可以不同,但必需是父子关系
6.构造方法不能发生重写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
向下转型:将父类的对象给子类(缺点:不安全,因为运用了强转类型,所以必须要做检查,使用关键字instanceof来检查是否安全)
if(父类 instanceof 子类){
强转} 返回值为ture或者false

在这里插入图片描述

在这里插入图片描述

Q理解不透彻点:1.组合 2.向上转型 3.多态深度理解

向上转型困惑点:

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式:父类类型 对象名 = new 子类类型()

向上转型:1.父类引用的是子类的对象,调用方法时会先调用子类中与父类同名的方法(重写父类的方法)
2.相当于父类的方法被覆盖,只有当子类没有该方法的时候才会去父类中寻找,但是父类中private和static无法被覆盖,调用时还是调用父类的方法

**多态 **:就是当我们引用的对象不一样时,调用同一个重写方法的表现行为不一样,我们把这种思想叫做多态

(当我们子类对象不一样时,我们通过父类调用方法重写【重写本质上是去调用子类的】时表现的行为不一样)
在这里插入图片描述
cycle,rect,flower存放在数组shape中,数组中只能存放一个类的,它们本来不是一个类,但是他们都是shape的子类,继承shape类,所以可以存放在一起,所以这块其实是发生了向上转型
PS:1.属性没有多态性 2.构造方法没有多态性

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值