面向对象(三)

it2023-12-27  72

面向对象(三)

1、静态变量存放在什么位置2、类加载机制和双亲委派模型的好处3、StringBuffer和StringBuilder的区别,底层实现上4、String是否能继承5、Static关键字以及Java中是否可以Override一个private或者static方法?6、重载和重写的区别?相同参数不同返回值可以重载?7、Object类的方法及简要说明8、类和对象的区别9、String为什么不可变10、Java特性和多态例子11、wait方法的底层原理

1、静态变量存放在什么位置

方法区

2、类加载机制和双亲委派模型的好处

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,一次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务的时候才自己去加载。 双亲委派模型的好处在于Java类随着他的类加载器一起具备了一种带有优先级的层次关系,例如java.lang.object,它存在在rt.jar中,无论哪一个类要加载这个类,最终都是委派给处于模型最顶端的bookstarp CLassLoader进行加载,因此OBject类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。因此,如果开发者尝试编写一个与re.jar类库中重名的Java类,可以正常编译,但是永远无法被加载。

3、StringBuffer和StringBuilder的区别,底层实现上

StringBuffer线程安全,Stringbuilder线程不安全。底层实现上的话,Stringbuffer比StringBuilder多了个synchronized修饰符

4、String是否能继承

不能 char数组用final修饰的

5、Static关键字以及Java中是否可以Override一个private或者static方法?

static关键字表明一个成员或者是成员变量方法可以在没有所属类的实例变量的情况下被访问。 Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法时编译时绑定的。static方法跟类的任何实例都不相关。

6、重载和重写的区别?相同参数不同返回值可以重载?

重载: 1.方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载时一个类中多态性的一种表现 2.Java的方法重载。就是可在类中创建多个方法,他们具有相同的方法名,但是具有不同的参数和定义。调用方法时通过传递给他们的参数个数和参数类型来判断具体使用哪个方法,多态性 3.重载的时候,方法名必须一样,但是参数类型和参数个数不一样,返回值类型也可以不一样。无法以返回值类型作为重载函数的额区分标准 重写: 1.父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,那么该方法被重写。在Java中,子类可以继承父类中的方法,而不需要重新编辑相同的方法。但有时子类并不想原封不动的继承父类的方法,而是想做一定的修改,这就要采用方法重写 方法重写又称为方法覆盖 2.若子类中的方法与父类中的某一方法具有相同的方法名,返回类型,参数列表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可以使用super关键字,该关键字引用了当前类的父类。 3.子类函数的访问修饰权限不能少于父类

7、Object类的方法及简要说明

Object()默认构造方法。 clone()创建并返回此对象的一个副本。 equals()指示某个对象是否与此对象相等 finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用该方法。 getClass()返回一个对象的运行时类。 hashCode()返回该对象的哈希码值。 notify()唤醒在此对象监视器上的等待的单个线程 notifyAll()唤醒在此对象监听器上等待的所有线程 toString()返回该对象的字符串表现 wait()导致当前线程等待,直到其他线程调用此对象的notify()或notifyAll()方法。 wait(long timeout)比上一个多了一个超过指定的时间量。 wait(long timeout,int nanos)比上个多了 或者其他某个线程中断当前线程

8、类和对象的区别

1.类是对某一类事物的描述,是抽象的;而对象是一个实实在在的个体,是类的一个实例。 2.对象是函数,变量的集合体;而类是一组函数和变量的集合体,即类类是一组具有相同属性的对象集合体。

9、String为什么不可变

不可变对象是指一个对象的状态在对象被创建之后就不再变化。 String不可变是因为在JDK中String类被声明为一个final类,且类内部的value字节数组也是final的,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多的heap空间,因为不同的字符串变量都指向池中的同一个字符串; 如果字符串是可变的则会引起严重的安全问题,譬如数据库的用户名密码都是以字符串的形式传入来获取数据库的连接,或者在socket编程中主机名和端口都是以字符串形式传入,因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子改变字符串指向的对象的值造成安全漏洞;因为字符串的不可变的,所以他在创建的时候hashcode也就被缓存了,不变性也保证了hash码的唯一性,不需要重新计算,这就使得字符串很适合作为Map的键,字符串处理速度要快过其他的键对象,这就是HashMap中的键往往都是用字符串的原因

10、Java特性和多态例子

封装 继承 多态 多态:指允许不同类的对象对同一消息做出相应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

11、wait方法的底层原理

ObjectSynchronizer::wait方法通过object对象中找到ObjecMonitor对象调用方法 void ObjectMonitor::wait(jlong millis,bool interruptible,TRAPS)通过ObjectMonitor::AddWaiter调用把新建立的ObjectWaiter对象放入到_WAitSet的队列末尾中,然后再ObjectMonitor::exit释放锁,接着thread_ParkEvent->park也就是wait

最新回复(0)