面向对象的基础
面向对象基础
内容简介和特点:
面向对象编程三大特点:继承、封装、多态
定义对象并实例化的格式:类名对象名 = new类名();
普通方法声明格式:public返回类型 方法名(){}
构造器声明格式:public类名()或{}public类名(参数类型 形参...){}
1、构造器(构造函数/构造方法):
定义:用于构造当前类的对象的函数,在实例化类时被调用,有无参和有参两种形式,如果在定义类时没有写构造函数系统会默认定义一个无参形式的构造函数。
格式:public类名(){}或public类名(参数类型 形参...){}(可以有多个参数多种参数形式)
注意点:1)任何一个类都必然会有构造器,一般默认不写出来,系统会默认定义一个无参形式
2)创建对象过程中,一定会调用当前类的构造函数,此时便是类的对象实例化
3)构造函数有返回值,返回的是当前对象的内存地址,但在定义构造函数时不
必要在前面写返回类型
计算机存储数据的机制:内存、硬盘(注意:内存—>硬盘,程序在运行时数据先暂存在内存中,然后再存入硬盘)
如下图:(引用传递,将stu1的内存地址传给了stu)
输出结果都是王五
4)在java中,对象之间的赋值,就是地址之间的赋值(引用传递),类似于 上例
2、方法重载
定义:同一个类中,多个方法的方法名相同,参数不同(类型、顺序、个数),互为重载方法,所以同一个类中也可以有多个构造函数。
注意:
1)普通函数重载
2)构造函数重载:提供多种创建对象的方式
i. 创建一个对象只能调用一个构造函数
ii. 如果构造方法被重载了,默认构造方法就不存在了,如果说还要用默认无参的,则必须显性写出来
iii. 作用:初始化当前类的对象属性,使类使使用使更加灵活方便,具有多种属性
3、继承
定义:类与类之间的继承(子类继承父类),子类继承父类的属性和方法(不是所有)
格式:public class子类类名 extends父类类名{}(String等特殊类不能被继承)
应用场景:当一个类需要用到另外一个类中的属性,而自己不想重新定义的时候,就可以通过继承关系,直接从另外一个类中获取过来,这样可以优化代码,减小代码的冗余性
注意:继承是单继承的,一个子类只能有一个父类,不能同时继承多个,但一个父类可以有多个子类;但是可以多层继承,例如:祖父类>>父类>>子类>>.........(因此java可以说是无限的)
4、方法重写
前提条件:继承
定义:子类重写父类的方法,方法名、参数、返回类型都一致,否则便是上面第2点所说的方法重载(继承父类后可以在不改变父类的方法名、参数、返回类型的情况下重写父类的方法,使该方法有不同于父类方法的功能,相当于遗传中的变异)
作用:修改父类定义的过程,对父类继承过来的函数进行修改(过程)
子类如果重新定义了父类的函数,则把父类的函数覆盖掉,使之具有子类特定的功能
5、自动转型
定义:子类的对象会自动转型为父类的类型
格式:父类的类型 对象名 = new 子类类型();
注意:转型后的对象是父类类型的对象,不是子类类型的对象,但具有子类的部分属性
转型后的对象注意点:如果子类重写了父类的方法,则执行重写后的,如果没有重写,则执行父类自己的,一定不能调用子类特有的方法,否则会报错(就像父亲的眼睛鼻子耳朵嘴巴遗传给了儿子,虽然儿子会发生一些改变,但是父亲还是具备这些的,但儿子所特有的技能和特点是父亲不可能有的)
6、多态(现象)
多个同一个类型的对象,调用同一个方法的时候,执行的过程不一样
多态现象出现=(自动转型+方法重写->继承)
例如:Father类和Son类(前者是后者的父类,父类有一个方法study(),子类重写了)
Father fa=new Father();
Father s =new Son();
fa.study();
s.study();
上例是同一类型的对象,但调用同一个方法时执行的过程不同,即一个是父类方法的过程另一个则是子类重写方法后的过程。
注意:多态现象是基于继承、方法重写和自动转型同时发生的情况下出现的,类被继承并且方法被重写后,就会产生不同于父类方法的执行过程,在经过自动转型便会出现同一个类型的对象调用同一个方法的时候执行的过程不同
补充:
this对象:指代当前类的对象
寻找方式:
1、看this在哪个函数中使用
2、this就等于调用这个函数的对象
3、this也可以被省略,因为没写this时系统会默认