欢迎使用CSDN-markdown编辑器

来源:互联网 发布:忘记root密码 linux 编辑:程序博客网 时间:2024/05/24 01:34

今天面试,被问了一脸,收获很大,所以我决定记忆性的东西,自己写博客总结了,有些东西要自己实验,自己理解本质是什么,跟玩游戏一样,你理解深了,操作才会6.代码是活的东西,不要死记,理解最重要。

一、static理解的总结:
static 记住一点,它是在JVM加载类的时候首先加载静态成员并且,JVM只为其分配一次内存(节省内存)。这样就好理解了,还有static成员可以通过类直接访问,也可以通过实例来访问。

实例变量和静态变量主要区别: 
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
一般在需要实现以下两个功能时使用静态变量:
 在对象之间共享值时
 方便访问变量时

 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

静态方法跟静态变量差不多,注意一点,静态方法中不能有本类的实例,因为在new对象的时候,会加载类,加载类的时候,首先加载的是static,这时候还没有这个实例,static它找不到的。
这儿就可以引申一下,单例的创建:(利用的就是satic全局特性)
(1)静态属性 private static B b = new B();
(2)静态方法用来输出唯一的实例
public static B getB(){
return b;
}
(3)private constructor

然后把new 对象时候的过程说一下:
1. 所有的类都是在第一次被使用时,动态加载到JVM中。当首次创建类型为Dog的对象时,或者Dog类的静态方法首次被调用时,或者静态属性域首次被访问时,java解释器查找classPath,定位到Dog.class文件
2. 载入Dog.class文件,生成一个Class类型对象,所有有关的静态初始化动作都会执行:如静态代码块,静态成员属性。 并且这种初始化动作只在Class对象首次加载时候进行一次。
3. 当用new Dog()创建对象时,首先JVM在堆heap上为Dog对象分配足够的存储空间,并返回该对象的地址。

这里再说一下:堆之所以叫堆,因为它大,所以一般对象放在堆里,变量放在栈里

二、方法重载:很简单,但是没有说全
1、方法名相同
2、在同一个类当中
3、形参的个数、类型、顺序不同(只与形参有关,亲测)

三、super、this关键字作用
super形象的将就是父类对象,this指当前对象
它们两个作用,一个是调用相应对象的方法,比如super.aa()
其二就是通过super() this() 调用相应构造方法,括号里可放参数

四、new对象时用接口指向实现类比较好,为什么?
List list = new ArrayList();
这个list这个接口引用就不会被具体实现类所限制,便于开发,而且实现了多态

五、String 直接赋值 和String s = new String(“dfa”);区别
解释一下本质就可以了,String s = “dfa”,会首先到内存里找dfa这个字符串,如果有,就直接把地址给s,如果没有则创建。而new对象,不管有没有都会直接创建对象,开辟新的内存空间。dfa是常量池里的,而new出来的对象在堆里。

**六、上转型和下转型
向上转型时,父类指向子类引用对象,会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉。多态是针对子类重写的方法的。
向下转型时,父类对象强制转换为子类,两种情况:
1、Father f = new Son();
Son s = (Son) s;这种可以强制转换且不报错
2、Father f = new Father();
Son s = (Son) f;这种可以通过编译,但是运行时会报java.lang.ClassCastException异常,可以通过
if(f instanceOf Son){
Son s = (Son) f;
}来避免报错

0 0
原创粉丝点击