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。这样就能用它们各自自己的方法了。这也是向下造型的具体用处