一、栈内存和堆内存的区别: 答:栈内存是用来存储局部变量的,当数据使用完后,所占空间会自动释放。 堆内存,用来存储数组、对象,通过new建立的实例都存放在堆内存中, 堆内存中的每个对象和数组都有内存地址,并且有默认的初始值,当堆内存中的对象在栈内存中没有变量引用的时候,java的垃圾回收器会不定时的回收释放。 二int a; 没有任何修饰的属性是包访问权限。。 只要那个子类和他同包就能访问。。 如果不再同一个包中就不能访问。。。。 JAVA中有四种访问权限:private,protected,public,还有就是什么都不写。 private私有访问权限,只有在同一个类里才能访问。 public公共访问权限,所有的类都可以访问,无论在不在一个包中。 什么都不写,默认变量,是包访问权限,也就是说在同一个包类就可以访问。 protected是继承访问权限,在同一个包中的可以访问,对于不再同一个包中的类,如果该类是父类的子类,则可访问。不再同一个包中的不是继承的类就不可以访问。 默认变量和protected变量的共同点是在同一个包中都可以访问,但是如果不在同一个包中,但是有继承关系,protected变量就可以访问。但默认变量只要是不同的包,无论有没有继承关系都不能访问。 三、构造函数 如果类没有构造函数,java虚拟机会添加一个默认的无参的构造函数,如果有了构造函数就不添加了。构造函数可以有多个重载形式,给不同的对象进行初始化,而构造代码块是给所有这个类的对象初始化,并且优先于构造函数执行。 四、什么时候用静态 静态可以用来修饰成员变量和方法。 当要想让类中某个属性,让所有的对象都共享的时候,可以用静态修饰,被静态修饰的成员变量,不管创建多少个对象,在内存都只有一份,在方法区中。 当类中的方法,不涉及到对非静态属性进行访问的时候,可以用静态修饰,一般工具类中用静态方法比较多,因为只是提供方法,不涉及对对象属性的访问 五、静态代码块 格式是: Static { } 静态代码块,用来给类初始化的,随着类的加载而运行,只运行一次 六、继承 Java只支持单继承,不支持多继承,因为多继承容易带来安全隐患:当多个父类中定义了相同功能名称,当功能内容不同时,子类对象不确定要运行哪一个,但是java保留这种机制,并用另一种体现形式来完成表示,多实现。 七、子父类中的构造函数 在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式语句super();super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super(); 如果父类没有默认构造函数,则用显式的在第一行调用父类的构造函数。 八、常见的Runtime异常 ArithmeticException:算术异常,除0, ArrayStoreException:把Integer存储到String NullPointerException: 空指针异常,比如空字符串调用equals ClassCastException: 类型转换异常 IndexOutOfBoundException:角标越界异常 九、接口 接口就是给出一些没有内容的抽象方法,然后封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。接口实际上是定义了一个类对外暴露的方法和功能,我们只关心它提供了什么方法,不用知道其具体的实现方式。这样接口就可以实现不同模块的通信,降低代码的耦合性。比如jdbc就是sun公司提供的java访问数据库的接口,虽然在不同的数据库中接口中方法实现方式不一样,但是我们不用关心,知道接口中方法,我们就可以调用,实现模块的分离。 十、类加载器 (1)类加载器委托机制 Java虚拟机有三个类加载器,BootStrap,ExtClassLoader,AppClassLoader,并且这些类加载器存在着继承关系。类加载器委托机制就是说每个类加载器在加载类之前,都会委托给父类的类加载器,当所有的祖宗类加载器加载不到的时候,返回原先类加载器,如果还加载不到,则抛出异常。 (2)什么是类加载器 当java程序,运行时,要使用某个类的时候,就必须要把类的加载到内存中,形成类的字节码文件,类加载器就是用来加载java类的。Java虚拟机有三个类加载器,BootStrap,Extension ClassLoader,AppClassLoader。负载加载不同位置的java类。除了BootStrap外,其他两个类加载器也是java类,BootStrap是嵌在java虚拟机内的。并且这些类加载器,存在着继承的关系。 十一、代理和动态代理 (1) 什么是代理 代理实际上就是为多个具有相同接口的目标类的各个方法增加一些系统功能,如异常处理、日志、事务管理。代理类和目标类有相同的接口,并且代理类中的方法调用目标类中的方法,只是增加了一些系统功能代码。 (2) 动态代理 Java虚拟机可以在运行时期动态的生成类的字节码文件,动态代理就是jvm动态的生成代理类。Jvm生成的动态类必须实现一个或是多个接口,也就是说jvm只能为有相同接口的类生成代理。 对于没有接口的代理类,用第三方库,如CGLIB,采用的是建立子类的方式实现的。 十二、内部类 (1) 访问规则 内部类可以直接访问外部类的成员,包括私有的 外部类要访问内部类要建立内部类对象 (2) 匿名内部类 1、 匿名内部类其实就是内部类的简写格式 2、 定义匿名内部类的前提:内部类必须是继承一个类或者实现接口 3、其实匿名内部类是一个匿名子类对象。
|