A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Kaweh. 中级黑马   /  2016-7-23 01:31  /  885 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  继承是java面向对象三大特性之一,我们平时用的时候想法是这样的
   1.子类可以继承父类的非私有成员。
   2.子类在创建对象的时候,需要首先访问父类的构造方法,目的是初始化父类的成员属性,以便子类可以使用。
  3.我们可以对父类的方法进行重写,重写要求:方法头部完全一样,方法体实现的逻辑不同。
     子类和父类息息相关。今天我想讨论的是关于java中的子类是如何实现继承父类的。首先,先介绍一下内存的结构是怎么样的。
   在se部分我们接触到的最多的内存是栈和堆。栈的理解:栈使我们用的最多的地方,由于它的存取速度较快,仅次于寄存器,所以我们的临时变量,就是存在这个地方,当方法结束时变量的空间便被释放掉了。
堆内存,用于存放引用类型的变量,诸如各种对象和数组,都是引用类型的变量。都是显性或者隐性需要用new关键字在堆内存中开辟空间的。
    平时课上老师经常画一个长方形的内存空间,害的我们好多人都认为内存是一个长方形啊?其实内存就是一串一串的01组成,然后由指针来操作寻到的地址。我们java语言不能操作指针,目前也只有c语言可以操控指针。所以底层是由c语言写的。言归正传,当我们的子类创建对象的时候,new关键字就会在堆内存中开辟一个空间,即划定一块属于该对象的内存区域。子类的成员变量存的地方,那么我们是如何继承父类的成员属性的呢?或者说我们为父类的成员属性初始化,我们的子类为什么可以用。原因是:在子类的内存空间中保留了一个特殊的区域,这个区域存放的是父类成员属性的引用即地址,我们可以通过这个地址来访问父类的成员属性,那么子类便实现了对父类的继承。我以前经常处在这样一个误区中,即如老师所言,在子类创建对象的时候,父类也跟着创建了一个对象。其实不然,假如真如以前所想,那么内存该是多么的浪费,我能想到,更何况无数的java的设计者。
    找了好多博客,看法不一,还是导师给予了很好的解释,碍于本人的学习进度,有些地方还是不太深入,欢迎各位程序员参与讨论。

2 个回复

倒序浏览
1什么是面向对象编程(OOP):Object Oriented Programming是一种编程思想, 使用对象去进行编程.
2它的特点有: 封装,继承, 多态 。  
3.对象从哪来:对象是需要先用类来描述, 然后使用类来创建.
类是对象的描述, 对象是类的实例.
4.面向对象的优点
              提高代码复用性.
              使用者无需关心对象其中是如何实现的.
              让程序员从一个编写者转换成一个使用者.
              更加符合人的思维能力,使编程更简单.
2 定义类
1.成员变量
在类中用变量来描述这一类对象公有的特征.
2.成员函数
在类中用函数来描述这一类对象公有的行为.

3 创建和使用对象
1.怎么创建
使用"new 类名()"形式创建一个对象
2.怎么使用
通过"."语法来访问类的成员.
       例如: Person p = new Person();//创建对象 p
                p.name = "张三";  //给对象定义的name赋值
                p.eat(); //调用p对象里面的eat方法

4对象的初始化过程
1.加载类
类在第一次使用的时候被加载到内存中
2.初始化成员变量
当创建对象的时候, 成员变量会初始化为默认值, 基本数据类型都是0, 引用数据类型都是null

5对象的生命周期
1.开始
new关键字创建对象的时候, 生命周期开始
2.结束
没有任何引用指向对象, 该对象成为垃圾, 被虚拟机回收



6 匿名对象
1.什么是匿名对象
没有任何引用指向的对象, 就叫匿名对象
2.匿名对象有什么特点
匿名对象在创建之后立即被回收, 只能使用一次

7 封装
1.什么是封装
封装就是将一类事物的特征和行为封装在一个类中, 定义成成员变量和成员函数
创建对象之后, 这些成员函数可以访问自己的成员变量
2.对成员变量的封装
使用private关键字将成员变量私有化

如果需要对外部提供访问方式, 写公有的get,set方法
8 构造函数
    1.什么是构造函数
              构造函数是一个特殊的函数.
              函数名必须和类名一致.
              没有返回值类型.(不等于void,不能写任何返回值).
              可以写return,但是不能写return+值(尽量不要写).
              new关键字创建对象时自动调用

    2.应用场景
              如果我们希望一段代码在创建对象的时候执行, 就可以写在构造函数中
              通常我们使用构造函数对成员变量进行赋值

       3.构造函数和成员变量的执行顺序
成员变量优先于构造函数先执行,因为通常使用构造函数都是对成员变量进行初始化,所以如果没有成员变量,构造函数是没有任何意义的.

       4.构造函数的重载
              和普通函数一样, 参数列表不同(类型不同,顺序不同,个数不同)即可.
              重载只与参数列表有关

    5.构造函数的调用
              在创建对象时自动调用.
在构造函数的第一条语句可以使用"this(被调用的构造函数的实际参数)"的形式调用该类其他构造函数.

    6.自动生成构造函数
在一个类中构造函数是一定存在的.
因为在一个类中如果没有写任何的构造函数, 编译时也会自动生成一个无参的构造函数, 里面什么代码都没有.
              如果写了任何一个构造函数, 那么就不会有自动生成的了
注意:我们在类中只写了一个有参构造函数的时候, 这个类就不能使用无参的构造函数创建对象了

       7.构造函数的访问权限
通常构造函数的访问权限都是公有的, 因为构造函数就是为了让别人创建对象时调用的
个别情况下在定义类时不希望外部创建对象, 这时可以使用private修饰构造函数, 例如:单例设计模式(Singleton)

9 成员代码块(构造代码块)
       1.什么是成员代码块
              在类中使用"{}"定义一段代码, 这段代码在创建对象的时候会自动运行
       2.成员代码块和构造函数的区别
              构造函数在创建对象的时候是N个选1个调用
              而代码块是一定执行
              构造函数可以传入参数
              代码块不能传入参数
       3.创建对象时内存中的工作顺序
              在内存中查找指定的类, 如果没有就加载类, 有则直接引用
              在内存中开辟一块空间, 将成员变量初始化为默认值, 0和null
              按照类代码从上到下的顺序, 执行代码块或者成员变量赋值
              执行构造函数中的代码
       4.在方法中也可以写代码块(方法代码块),但是不常用

10成员变量和局部变量
       1.成员变量
              在类中定义的变量,(Field),在整个类都可以访问(用于描述着一类事物的共有特征).
              成员变量随着对象的建立而建立,存在于对象所在的堆内存中.
              成员变量有默认初始值(0/false/null)

       2.局部变量
              在方法/语句中定义的变量(Local Variable),
              存在于栈内存中.
              作用范围一结束,变量的空间会自动释放.
              局部变量是没有初始值的.

       3.同名问题
              在同一个作用域中成员变量不能重复, 局部变量也不能重复
              但是成员变量和局部变量可以同名, 他们互相不冲突
    4.访问问题
在局部变量和成员变量同名的时候, 如果直接用变量名访问一个变量, 那么是先找局部变量, 如果不存在才找成员变量

              这时如果不想找局部变量, 直接找成员变量, 应该用"this.变量名"
11 this关键字
    1.构造函数中
              "this(参数)"形式可以在构造函数的第一条语句中调用其他的构造函数
              "this.成员名"形式可以调用当前对象的成员

     2.普通函数中
              this用在普通的函数中, 可以代表调用当前函数的对象
              哪个对象调用this所在的函数,this就代表那个对象.

3.内部类中
              可以使用 外部类名.this.成员 来访问外部类的成员.

12静态(static)变量
1.什么是静态变量
              用static修饰的成员变量就是静态变量(随着类的加载而加载)
              优先于所有非静态成员及成员代码块.

2.静态变量和普通变量有什么不同
              静态变量在类加载后就初始化, 不用创建对象可以直接使用.
              静态变量被类的所有对象共享(在共享区), 通过一个对象改变, 所有对象都改变.
静态变量可以使用"类名.变量名"形式访问, Java推荐使用这种方式, 而不是通过对象访问.

       3.类在什么时候加载
              类在第一次使用的时候加载
              例如:创建对象, 使用静态变量, 使用静态方法
              定义变量的时候不加载类.

       4.静态变量在什么时候使用
              在定义一个类的时候, 如果希望这个类的所有对象共享一个数据时, 就可以使用静态成员变量
回复 使用道具 举报
总结的很好!赞一个!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马