码迷,mamicode.com
首页 > 其他好文 > 详细

交行2部培训总结

时间:2018-01-20 22:43:11      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:构造方法   多个   指定   img   垃圾   alt   超过   同名   ted   

摘要:本文总结了6个问题
1、java有几大特性,分别是什么,并简述这些特性的特点
2、简单说明什么是 String 不可变
3、分别描述重载与重写,并说明重载与重写的区别
4、抽象类的特点
5、局部变量与全局变量的作用域
6、堆内存与栈内存的区别

 

一、java有几大特性,分别是什么,并简述这些特性的特点

1.封装:该公开的公开,改私有的私有。
          类的属性一般私有;类的方法该公开的公开。
2.继承:extends:实际上是对父类的扩展。                      
        任何父类适用的方法,子类一定适用。
生成对象的过程:                        
  1)分配对象空间;                        
  2)给属性赋初值;
    boolean:false                                                      
    数值类型的:0或0.0                                                      
    对象类型:null                        
  3)调用构造方法        
    ①任何子类的构造方法都会调用父类的构造方法      
    ②任何类都有构造方法,如果程序员自己不定义则系统会加上一 个默认的无参空实现的构造方法;如果定义了,则系统不会加。      
    ③任何子类的构造方法的第一行一定是super(...)或this;  
    如果程序员不这么写,则系统会默认加上super();
    自己写this()就不会加super();
    但是this()调用的构造方法一定会调用父类的构造方法;  
    This(...);//表示调用本类的其它构造方法,只能出现在构造方法的第一行;其它位置都是不合法的;  
    Super(...);//调用父类的构造方法,也是只能出现在构造方法的第一行;根据参数类型来确定调用父类的哪个构造方法。
    //默认调用父类的无参的构造方法。
    //即使把父类的私有属性继承下来,但还是不能直接访问,必须用getName();
 
 
方法的覆盖:
  1)  发生在父子类中
  2)同名、同参、同返回值
  3)访问权限同父类或更宽泛

3.多态:类中多个方法的重载叫做多态,父子类中方法的覆盖也叫多态。
  因此多态两种体现:
  一个是方法的覆盖,一个是方法的重载。
  所有的多态可以归结为两个定理:
  1)可以把子类对象当做父类对象来看,一旦这样做了,就只能去调用父类中原有定义的属性和方法,也就是子类扩展的方法和属性就不能调用了 
  2)当我们把子类对象当做子类对象来看时,如果子类覆盖了父类中的方法,在调用的时候实际上调用的是子类覆盖后的方法。
  例如:
  Animal a=new Bird();
  前面的引用a的类型叫做编译时类型(主观认为),
  后面的bird类型叫做运行时类型(客观存在)

 

二、简单说明什么是 String 不可变

  什么是不可变对象?

  如果一个对象,在它创建完成之后,不可再改变它的状态,那么这个对象就是不可变的。不可改变状态的意思是,不能改变对象内的成员变量,包括基本数据的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
  String s="ABCabc";
  System.out.println(s);
  s="123";
  System.out.println(s);
  s的值确实变了。
  解释: s只是String对象的一个引用,并不是对象本身。
        对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。
        引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。
        也就是说,s只是一个引用,它指向了一个具体的对象,当s="123"这句代码执行以后,又创建了一个新的对象"123",而引用s重新指向了这个新的对象,原来的"ABCabc"在内存中还存在,并没有改变。

  拓展:
  创建String的方式,三类:
  ①String s1=new String("abc");
  ②String s2="abc";
  ③String s3="ab"+c;
  String 的创建原理:
  1)当使用任何方式来创建一个字符串对象s时,java运行时(jvm)会拿着这个s在String Pool中找是否存在内容相同的字符串对象。
  如果不存在,则在池中创建一个字符串s,否者,不在池中添加。
  2)java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
  3)使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了。
  但绝不会在堆栈中再去创建一个String对象
  4)使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈中创建一个String对象。

  拓展:string对象的初始化java提供了一种简化的特殊语法,格式如下:String s="abc";
  如果按照String s=new String("abc");在内存使用上会存在很大的浪费,因为它实际上创建了两个String对象,一个是"abc"对象,存储在常量空间中,一个是使用new 关键字为对象s申请的空间。

三、分别描述重载与重写,并说明重载与重写的区别

  重写是子类的方法覆盖父类的方法,要求方法名和参数都相同
  重载是同一个类两个或两个以上的方法,方法名相同,但是参数类型不同,或者个数不同,或者顺序不同

四、抽象类的特点

  抽象类不能实例化
  抽象类中的抽象方法只能是public、protected来修饰

五、局部变量与全局变量的作用域

  定义在类中方法外的变量,就是全局变量,存放在堆内存。随对象的创建而创建 ,随对象的消失而消失。
  定义在方法里或域里的就是局部变量。局部变量离开了它的域{}就会失效,存放在栈内存。随方法的调用而存在,方法调用完毕就消失了。

六、堆内存与栈内存的区别:

  在函数中定义的一些 基本类型的变量对象的引用变量 都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,就会自动释放掉为该变量分配的内存空间,该内存空间可以立即另作他用。
  堆内存用于存放由new创建的 对象数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。
  在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在对内存中的首地址,在栈中这个特殊的变量就成了数组或者对象的引用变量。
  引用变量就是普通变量,定义在栈中分配内存,引用变量在程序运行到作用域外释放。
  而数组和对象本身子在堆中分配,即使程序运行到使用new产生数组和对象的语句所在的代码块之外,数组和对象本身占用的对内存也不会被释放,数组和对象在没有引用变量的时候,才会变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这也是java比较占内存的主要原因。

  例如,下列Java代码中的变量a、b、c分别在内存的____存储区存放。

技术分享图片

 

  解析:
  a是类中的成员变量,存放在堆区
  b、c都是方法中的局部变量,存放在栈区

 

 

交行2部培训总结

标签:构造方法   多个   指定   img   垃圾   alt   超过   同名   ted   

原文地址:https://www.cnblogs.com/gugibv/p/8322036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!