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

     

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/zqf-bczl/p/13381105.html
Copyright © 2020-2023  润新知