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