java面向对象基础2

构造方法

构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。

构造方法总结:

1)给成员变量赋初值
2)与类名相同,无返回值,void都不用写,由public修饰。
3)在创建对象时会自动调用构造函数
4)若自己不写构造方法,会自动调用无参构造
5)构造方法可以重载

如果构造方法中形参名与属性名(即成员变量)相同时,需要使用this关键字区分属性与形参。this.id 表示属性id;id表示形参id。

垃圾回收机制(Garbage Collection)

垃圾回收又称gc, gc是运行在Jvm中,回收应用程序中创建的一些无用的对象,回收没有任何引用指向的对象。

栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存。对于c/c++这种语言,每当我们malloc动态分配一块内存或new一句爱内存时,都需要我们手动的去释放内存。如果不显示的释放内存,此块内存就不能分配给其他对象,该内存会在程序结束之前一直被占用;若一些内存没有及时被回收会造成系统运行减慢,甚至瘫痪,这种现象叫做内存泄漏。

this关键字

指代当前对象,哪个对象调用方法,它指的就是那个对象。

只能用在方法中,在类的方法中只要访问成员变量,默认都有this。严格来讲在方法中,需要用过this关键字来指明当前对象。

由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。一般在构造方法中不省略this。

this的用法:

1)this.成员变量名————————访问成员变量。
2)this.方法名()————————调用方法( )//无意义,一般不用。
3)this()——————————— 调用构造方法 //应用率不是很多 一般用于重载构造方法。

    //构造方法
    public GouZao(String name,int age,String address){
        this.name = name;//this.成员变量来调用 成员变量 
        this.age = age;
        this.address = address;
    }
    //构造方法重载,this()用于调用构造方法,以实现构造器重载(代码简洁)
    public GouZao(String name,int age){
        //this.name=name;
        //this.age=age;
        this(name, age,null);//和以上两行代码一样效果
    }
    public GouZao(String name){
        this(name,0);
    }

封装

我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。

封装的具体优点:

1. 提高代码的安全性。

2. 提高代码的复用性。

3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。

4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作

继承

继承让我们更加容易实现类的扩展。 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可。从英文字面意思理解,extends的意思是“扩展”。子类是父类的扩展。现实世界中的继承无处不在。

java不支持多继承,泛化:抽出超类的过程。继承要符合是一个的关系 如:老虎类是一个动物类。

1.继承作用为代码的复用。

2.通过关键字extends来继承

3.父类/超类是共有的属性和行为,子类/派生类在父类/派生类的基础之上,还有各自的特有属性和行为。

4.在子类的构造方法中若不自己调用父类的构造方法,则默认用super() 调用超类的构造方法,若超类中没有无参构造方法,则会报错。此时就需要显示的调用super()的有参构造。

5.super()调用超类的构造方法,必须位于派生类构造方法的第一行。

6.派生类是通过super()调用超类构造方法,而不是继承。

super关键字

super指当前对象的超类对象。

用法:1.super.成员变量名 ———————— 访问超类的成员变量

           2.super.方法名        ———————— 调用超类的方法

           3.super()                 ———————— 调用超类的构造方法

派生类访问超类的属性和方法时,用super.和this.都可以。因为派生类是继承了超类的属性和方法的,所以可以用this.来调用。

多态

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游。

多态的要点:

1. 多态是方法的多态,不是属性的多态(多态与属性无关)。

2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象(向上造型)。

3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

所有抽象方法都是多态的---行为的多态

所有对象都是多态的--对象的多态 //因为所有的类都是隐式的继承了Object这个父类,所以只要是个对象他都是多态的

多态一般会都用到向上造型和强制类型转换。

向上造型/自动类型转换

超类型的引用指向派生类的对象。
能造型成为的数据类型有:超类或者所实现的接口 。
能点出来什么 看引用的类型。

向下造型/强制类型转换成功的条件只有如下两种)

引用所指向的对象,就是该类型

引用所指向的对象,实现了该接口或继承了该类

建议强转之前使用instanceof方法判断引用指向的对象 是否是该类型。

强转时若不符合如上条件,则发生ClassCastException 类型转换异常 。 

小转大,自动!自动类型转换(也叫隐式类型转换) 

大转小,强转!强制类型转换(也叫显式类型转换) 

向上造型

向上造型是指,父类引用指向子类对象。子类引用的对象转换为父类类型。

向上造型后  子类 将不再具备其自己定义的方法,只有父类的方法。但若重写了父类的方法,向上造型的对象的方法为重写后新的方法。

在日常生活中,我们都扮演着不一样的角色。我们有可能是老师,有可能是学生;但是我们都有共同的属性,例如:名字、性别、年龄,但是在该基础上,不同身份的人也有着属于自己的不同的特点。我们通常描述他人的时候会说,这个人是老师,这个认识学生,这个人是个程序员。实际上“这个人是……”这种说法就是向上造型。

1)超类型的引用指向派生类对象

2)java中规定能点(调用)出来什么,看引用类型。 即向上造型只能点出来超类的,派生类所特有的不能访问。

3)是父类的类型

向下造型

向下造型一般是采用了向上造型之后才会采取向下造型。向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下造型!

把指向子类对象的父类引用赋给子类引用,需要强制转换。

例如:

Father f1 = new Son();

Son s1 = (Son)f1;

向上造型意义:当一个方法在子类中进行重写的时候,调用不同的子类可能需要new对象很多次,再调用对应的方法,会出现很多的代码重复,对于代码结构来说很不好看。

程序开始的时候确定有一个father型对象,但是要根据用户的选择来决定他要被实例化成哪种类型的。但如果你要分开来声明的话,那你就因为不确定性必须要声明两个变量,分别来等待实例化。就是实例化的时候可以根据不同的需求实例化不同的对象,这也就是多态的意义

向下转型的意义为:最大的用处是java的泛型编程,用处很大,Java的集合类都是这样的。单独看向下造型是没有什么作用。向下造型就是向上造型的反向作用。我们的世界是平衡的,既然java的开发者发明了向上造型,你应该一起发明了向下造型。

例如:体育馆里面有一个球柜,里面放着足球,篮球,排球。

然后我们想把这些球放到球柜里面,定义下面的list

List<ball> ballplace = new ArrayList<ball>();

运用向上造型:

Ball a = new football();

Ball b = new basketball(); 

Ball c = new volleyball();

这样就将足球,篮球,排球的集体球放进去了。不然就要定义足球柜,篮球柜,排球柜。要是有更多的就会定义很多集合。这样不堪设想。

想一想我们前面说的向上造型后,子类的各自的特有方法就没有了。那么我们从集合里面取出a,b,c的时候我们有想使用子类的特有方法怎么办呢!这里我们就用到了向下造型。取出a,b,c对象后用向下造型将它们转化成football,basketball,volleyball。这样就能用它们各自自己的方法了。这也是向下造型的具体用处

 

posted @ 2020-07-26 17:32  降温。  阅读(112)  评论(0编辑  收藏  举报