Java基本知识点回顾一

  前言:该回顾系列主要用于对自身知识点的查漏补缺以及记载之前看过的一些比较有印象的面试题(如果文章中有哪些不对的地方也欢迎大家指正)


 

  1、面向对象都有哪些特性以及你对这些特性的理解

   Java面向对象的三个特性:封装、继承、多态

    • 封装:通俗易懂地来说,封装通常就是指将一个对象的数据和操作该数据的方法绑定在一起,对外提供一个可以访问该操作数据的方法,避免数据被直接赋值出现各种异常。
    • 继承:继承是指创建一个新的类可以继承一个父类(基类),新的类可以使用父类公共的成员变量与方法,从而实现代码复用。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段
    • 多态:多态是指有也允许不同子类型的对象对同一消息作出不同的响应。简单地说就是用同样的对象引用调用同样的方法,但是由于传入的子类对象的不同而表现出不同的行为。多态的特点是“父类的引用指向子类的对象”或者是“父接口的引用指向子实现类的对象”。同时多态性分为编译时的多态性和运行时的多态性,方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性。

 


 

  2、访问权限修饰符public、private、protected以及默认(不写)时的区别

  

 


 

  3、重载与重写的区别?

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,后者实现的是运行时的多态性。

    重载发生在一个类中,同名的方法中如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载

    重写发生在子类与父类(以及接口的实现类与接口)之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常

 


 

  4、char型变量能否存储一个中文汉字

    char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(万国码,不使用任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占两个字节(16位bit),所以放一个中文是没问题的(绝大部分的中文字符的Unicode范围是[0x4E00, 0x9FBB],恰好是在BMP范围内,BMP表示[U+0000, U+FFFF]之间的Unicode字符)

    使用Unicode意味着JVM内部和外部有不同的表现形式,也就是说在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(如存入文件系统中),需要进行编码转换,所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。

    (简书上有篇文章个人觉得还不错,感兴趣的可以去看下:https://www.jianshu.com/p/4c29d96d5e06

 


   5、String xxx = new String("xxx")这种情况下会创建几个对象

    如果字符串常量池存在该字符串,则只在堆中创建一个变量,也就是创建一个对象。如果不存在,则创建两个对象,一个在字符串常量池中,一个在堆中指向字符串常量池中该字符串的地址。

    https://blog.csdn.net/liuxiao19890212/article/details/38982363


   6、成员变量与局部变量的区别

    1)成员变量是属于类的,而局部变量是在方法中定义的变量或者是方法的参数;成员变量可以被public、private、static等修饰词所修饰,而局部变量不能被访问控制修饰符及static所修饰,但是,成员变量和局部变量都能被final修饰

    2)如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。对象存于堆内存,如果局部变量类型为基本数据类型,那么存储在栈内存,如果为引用数据类型,那存放的是指向堆内存对象的引用或者是指向常量池中的地址。

    3)成员变量是对象的一部分,它随着对象的创建而存在,而局部变量是随着方法的调用而自动消失。

    4)成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外:被final修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。


   7、String类定义为不可变(final)的好处

    1)可以缓存hash值:因为String的hash值经常被使用,例如String用做HashMap的key,不可变的特性可以使得hash值也不可变,因此只需要进行一次计算。

    2)String Pool的需要:如果一个String对象已经被创建过了,那么就会从String Pool中取得引用,只有String是不可变的,才可能使用String Pool。

    3)安全性:String经常作为参数,String不可变性可以保证参数不可变,例如在作为网络连接参数的情况下如果String是可变的,那么在网络连接过程中,String被改变,改变String对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。

    4)线程安全:String不可变性天生具备线程安全,可以在多个线程中安全地使用。

posted @ 2022-03-13 01:01  姆知叫咪名好  阅读(40)  评论(0)    收藏  举报