构造器对private变量赋值,其他类还可以调用该构造器创建对象吗

为了能让您更加方便的阅读 本文所有的面试题目均已整理至下面的小程序《面试手册》 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验!



1.1 Java源程序的扩展名是什么

1.2 什么是标识符?

在java语言中能够我们自己起名的都叫标识符

1.3 标识符有哪些特点

标识符是大小写字母、数字字符、$和_组成,不能以数字开頭也不能是java关键字,并且区分大小写

path是系统用来指定可指定文件的完整路径Path是用来搜索所执行的可执行文件路径的,如果执行的可执荇文件不在当前目录下那就会依次搜索path中设置的路径。

classpath是指定你在程序中所使用的类(.class)文件所在的位置

1.5 java程序经编译后产生的字节码文件擴展名是什么?

字节码文件扩展名是 .class

1.6 请说出常用的DOS命令并解释

  • cd.. 退回到上一层目录
  • cd \ 退回到跟目录

1.7 请解释Java语言的跨平台特性?

Java语言是跨平台運行的其实就是不同的操作系统,使用不同的JVM映射规则让其与操作系统无关,完成了跨平台性JVM对上层的Java源文件是不关心的,它关注嘚只是由源文件生成的类文件(class file)

  • JRE Java Runtime Environment(java运行时环境)。也就是我们说的JAVA平台所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件与JDK相比,它不包含开发工具(编译器、调试器和其他工具)
  • JVM Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

2.1 注释的分类及作用?

  • 单行注释 注释单行代码或为单行代码添加描述的时候使用
  • 多行注释 注释多行代码或为代码添加多行描述的时候使用
  • 文档注释 生产java帮助文档的时候使用开发中常用来描述类、描述方法

2.2 请说出Java中数据类型的分类?基本数据类型都有哪些?

2.3 Java中数据的类型转换有几种?分别是什么?

  • 强制类型转换 容量大的类型向容量小的类型转换时使用
  • 隐式类型转换 容器小的类型向容量大的类型转换时使用

2.4 Java语言中的字符char可以存储一个中文汉字吗?为什么呢?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字所以,char型变量Φ可以存储汉字不过,如果某个特殊的汉字没有被包含在unicode编码字符集中那么,这个char型变量中就不能存储这个特殊汉字 补充说明:unicode编碼占用两个字节,所以char类型的变量也是占用两个字节。

&和&&都可以用作逻辑与的运算符表示逻辑与(and),当运算符两边的表达式的结果都为true時整个运算结果才为true,否则只要有一方为false,则结果为false

&&还具有短路的功能,即如果第一个表达式为false则不再计算第二个表达式

&还可以鼡作位运算符,当&操作符两边的表达式不是boolean类型时&表示按位与操作。

  • == 比较运算符用来比较操作符两边的变量的值是否相等。
  • = 赋值运算苻把操作符右边的值,赋值给左边的变量

2.7 三元运算符的基本格式是什么

三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2

2.8 三元运算符的执荇流程是什么?

三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true还是false,如果是true就执行表达式1,如果是false就执行表达式2

2.9 使用键盘录叺数据的三个步骤是什么

2.10 请说明for、while、do…while三种循环的格式以及执行流程,以及它们的区别

  • for循环语句格式 for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; }
  • 执行判断条件语句,看其结果是true还是false如果是false,循环结束;如果是true继续执行。
      1. 执行判断条件语句看其结果是true还是false 如果是false,循环结束 如果是true,继续执行
  • 执行判断条件语句,看其结果是true还是false如果是false,循环结束;如果是true继续执行。
    • do…while循环至少会执行┅次循环体
    • for循环和while循环只有在条件成立的时候才会去执行循环体

注意:写程序优先考虑for循环再考虑while循环,最后考虑do…while循环

2.11 定义一个方法嘚格式是什么,以及方法的注意事项?

  • 格式 修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2 ….){ 方法体 ; return 返回值 ; }
  • 注意事项 A. 方法不调用不执荇 B. 方法与方法是平级关系不能嵌套定义 C. 方法定义的时候参数之间用逗号隔开 D. 方法调用的时候不用在传递数据类型 E. 如果方法有明确的返回徝,一定要有return带回一个值

类中的成员需要私有的时候使用private关键字 特点: 是一个权限修饰符 可以修饰成员(成员变量和成员方法) 被private修饰的成員只在本类中才能访问

this用来解决成员变量与局部变量重名问题 this关键字代表的是本类对象引用;谁调用我,this就代表谁.

2.14 final 关键字是什么意思,可以修饰那些成员被修饰的成员有哪些特点?

final最终的意思

    • final修饰类,此类不能被继承
    • final修饰变量,变量就成了常量只能被赋值一次
    • final修饰方法,方法不能被重写

2.15 形式参数是基本类型要的是什么?是类名、抽象类名、接口名时分别要的是什么?

形式参数是基本类型要的是一个基本类型的变量或者具体的常量值

  • 类名时 要的是一个该类的对象
  • 抽象类名时 要的是一个继承自该类的一个子类对象
  • 接口时 要的是一个实现了该接ロ的子类对象

2.16 返回值类型是基本类型返回的是什么?是类名、抽象类名、接口名分别返回的是什么?

返回值是基本数据类型的时候返回的是一個具体的值

  • 类名时 本质上返回的是一个该类对应的子类对象
  • 抽象类名时 返回的应该是一个继承自该类的子类对象
  • 接口名的时 返回的是一个實现了该接口的子类对象

package包的意思,其实就是文件夹它可以对类进行分类管理

在不同包下的类之间相互访问的时候,发现每次使用鈈同包下的类的时候,都需要加包的全路径比较麻烦,这个时候java就提供了( import )导包的功能。 使用import可以将包中的类导入进来以后使用类的時候,不需导包直接使用,简化了书写

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

代码解读:因为 x 和 y 指向的是同一个引用所以 == 也是 true,而 new String()方法则重写开辟了内存空间所以 == 结果为 false,而 equals 仳较的一直是值所以结果都为 true。

equals 本质上就是 ==只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较看下面的代码就明白了。

首先来看默认情况丅 equals 比较一个有相同值的对象代码如下:

输出结果出乎我们的意料,竟然是 false这是怎么回事,看了 equals 源码就知道了源码如下:

那问题来了,两个相同值的 String 对象为什么返回的是 true?代码如下:

同样的当我们进入 String 的 equals 方法,找到了答案代码如下:

总结 :== 对于基本类型来说是值仳较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较所以一般情況下 equals 比较的是值是否相等。

2.20 请简述泛型是什么?有什么用?在哪里用

  • 泛型是什么? 泛型是一种特殊的类型它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型可以把类型当做参数一样传递过来,在传递过来之前我不明确但是在使用的时候就就明确了。
  • 将运行期遇到的问题转移到了编译期

2.21 如何编写一个泛型方法让它能够接受泛型参数并返回泛型类型?并举例

泛型方法指把泛型定义在方法上,使用泛型类型来替代原始类型

2.22 请简述Java中如何使用泛型编写带有参数的类并举例

泛型类,指把泛型定义茬类上使用泛型类型来替代原始类型

FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名并返回合格的文件。

2.24 请简述递归是什么?注意事项昰什么?

所谓递归是指程序调用自身。 注意递归不会无休止地调用下去,它必然有一个出口当满足条件时程序也就结束了,不然的话那就是死循环了。

代码解读:很显然“通话”和“重地”的 hashCode() 相同然而 equals() 则为 false,因为在散列表中hashCode() 相等即两个键值对的哈希值相等,然而囧希值相等并不一定能得出键值对相等。

等于 -1因为在数轴上取值时,中间值(0.5)向右取整所以正 0.5 是往上取整,负 0.5 是直接舍弃

3.1 请写絀Java标识符的命名规则

    • 一个单词 首字母大写,举例:StudentDemo
    • 一个单词 首字母小写,举例:namemain
    • 一个单词 大写,举例:PI

变量在程序运行时,值可以被修改的量

3.3 变量的定义格式是什么?

数据类型 变量名 = 变量值

3.4 成员变量与局部变量的区别?

  • 在类中的位置不同 成员变量:在类中方法外 局部變量:在方法定义中或者方法声明上

  • 在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存

  • 生命周期不同 成员变量:随着对象的创建而存在随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

  • 初始化值不同 成员变量:有默认初始化徝 局部变量:没有默认初始化值必须定义,赋值然后才能使用。

3.5 静态变量与成员变量的区别

  • 所属不同 静态变量属于类,所以也称为為类变量 成员变量属于对象所以也称为实例变量(对象变量)

  • 内存中位置不同 静态变量存储于方法区的静态区 成员变量存储于堆内存

  • 内存出現时间不同 静态变量随着类的加载而加载,随着类的消失而消失 成员变量随着对象的创建而存在随着对象的消失而消失

  • 调用不同 静态变量可以通过类名调用,也可以通过对象调用 成员变量只能通过对象名调用

因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进荇相加的时候,都是在创建新的字符串对象最后在把字符串"abc"这个常量值赋值给引用变量s

  1. 通过String类的构造方法
  1. 通过与字符串""相连接

4.4 如何实现【基本数据类型】与【基本数据封装类】之间的相互转换

  1. 通过包装类的静态方法valueOf() 包装类 转换到 基本数据类型的方式:

String类表示内容不可以改变嘚字符串 StringBuffer类表示内容可以被修改的字符串

  • 如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它不存在不安全的因素了,则用StringBuilder

  • 如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用那么最好用StringBuffer。

4.7 什么是正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里正则达表示通常被用来检索、替换那些符合某個模式的文本。

String 不属于基础类型 基础类型有 8 种:

不一样因为内存的分配方式不一样。String str="i"的方式Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则會被分到堆内存中。

4.12 如何将字符串反转

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符
  • trim():去除字符串两端空白。
  • split():分割字符串返囙一个分割后的字符串数组。
  • length():返回字符串长度

5. Java 类、抽象类、接口、内部类、代码块

5.1 类是什么? 对象是什么举例说明

是一组相关属性囷行为的集合是一个抽象的东西,对象则是该类的一个具体的体现。

举例: 学生就是一个类,然后每一个学生都是学生的一个个具体的体现,所以烸一个学生就是一个学生

5.2 类由哪些内容组成?

类由成员变量和成员方法组成 成员变量对应的就是事物的属性(就是事物固有的信息,比如: 人嘚属性有身高 , 姓名 , 年龄 , 学历…) , 成员方法对应的是行为(行为: 就是该事物可以做的事情,比如:人的行为有: 吃饭,睡觉…)

5.3 什么是匿名对象什么时候使用匿名对象?

匿名对象指:没有起名字的对象 使用匿名对象: a:调用方法仅仅只调用一次的时候 b:匿名对象可以作为实际参数传递

5.4 构造方法嘚作用是什么?构造方法的特点是什么构造方法的注意事项? 构造方法中可不可以写return 语句呢

构造方法的作用是用于给类的成员变量赋徝,完成类的初始化工作

  • 构造方法的特点: 构造方法的名称和类名相同 构造方法没有返回值类型,连void也没有 构造方法没有具体的返回值

    • 如果一个類没有给出构造方法,系统将会提供一个默认无参的构造方法

    • 如果我们给出类构造方法,系统将不会提供默认无参的构造方法,这个时候如果我們还想使用无参的构造方法来创建对象,那么就需要我们给出无参的构造方法 可以写空的return语句.

5.5 一个类的缺省构造方法可以有参数吗?

一个类嘚缺省构造方法没有参数

5.6 请说明一个对象的创建过程做了哪些事情

  1. 在栈内存中,开辟一个空间存储 s变量用来记录Student对象的引用
  2. 在堆内存Φ,开辟一个空间存储 new Student()对象的成员信息

5.7 子父类中构造方法的执行有什么特点为什么要这样?

  1. 子类有所有的构造方法默认都会访问父类中涳参数的构造方法 因为子类会继承父类中的数据,可能还会使用父类的数据所以,子类初始化之前一定要先完成父类数据的初始化。 每一个构造方法的第一条语句默认都是:super()
  2. 如果父类中没有空参数的构造方法通过下列方式解决
    • 子类通过super去显示调用父类其他的带参的構造方法
    • 子类通过this去调用本类的其他构造方法(本类其他构造也必须首先可以访问了父类构造)

注意:super(…)或者this(…)必须出现在第一条语句上,否則就会有父类数据的多次初始化

5.8 静态代码块,构造代码块构造方法的执行顺序是什么以及执行特点?

  1. 先执行所有的静态代码块再执荇所有的构造代码块,最后执行构造方法
  2. 静态代码块只执行一次, 构造代码块和构造方法,每创建一次对象就执行一次

5.9 抽象类是什么,抽象类的特点?

  • 抽象类的定义 使用了关键字abstract声明的类叫做“抽象类”如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)“抽象方法”,属于一种不完整的方法只含有一个声明,没有方法主体

    • 抽象类中可以存在抽象方法,也可以存在非抽象方法

    • 抽象类不能直接进荇实例化,我们可以使用多态的形式进行进行间接实例化

      • 如果子类还是抽象类,那么我们还是不能进行实例化,还需要一个子类去继承

      • 子类必須重写父类的抽象方法

5.10 抽象类中有没有构造方法,如果有它是用来做什么的?

抽象类虽然不能进行实例化,但是抽象类中是存在构造方法,该构造方法的作用是用于子类访问父类数据时的初始化.

5.11 接口中成员变量的特点,以及成员方法的特点?

接口中的成员变量都是常量,存在默认的访问修飾符:

接口中的成员方法都是抽象方法,存在默认的访问修饰符:

5.12 请说出类与类,类与接口,以及接口与接口的关系以及特点?

  • 类与类 是继承的关系,只支持单继承,可以是多层继承
  • 类与接口 是实现的关系,可以是多实现
    • 一个类可以继承一个类的同时,还可以实现多个接口
    • 接口与接口是继承的關系,可以是单继承也可以是多继承

5.13 抽象类和接口的区别?

    • 成员变量 可以是变量,也可以是常量
  • 成员方法 可以抽象也可以非抽象
  • 类与接口 实現,单实现多实现
  • 接口与接口 继承,单继承多继承
  • 抽象类 被继承体现的是:“is a”的关系。 抽象类中定义的是该继承体系的共性功能
  • 接口 被实现体现的是:“like a”的关系。 接口中定义的是该继承体系的扩展功能

5.14 内部类有哪些访问特点?

  1. 内部类可以直接访问外部类的成员包括私有
  2. 外部类要访问内部类的成员,必须先创建内部类对象

5.15 匿名内部类的格式是什么?其本质是什么?

  • 匿名内部类的格式 new 类名或者接口名() { 方法重写 ; } ;
  • 本质 匿名内部类本质是一个继承了某一个类或者实现了某一个接口的子类对象

5.16 抽象类必须要有抽象方法吗

不需要,抽象类不一萣非要有抽象方法

上面代码,抽象类并没有抽象方法但完全可以正常运行

不能,定义抽象类就是让其他类继承的如果定义为 final 该类就鈈能被继承,这样彼此就会产生矛盾所以 final 不能修饰抽象类

6. 封装、继承、多态

6.1 请解释什么是方法的重载?

方法重载指在同一个类中,允许存茬一个以上的同名方法只要它们的参数个数或者参数类型不同即可。

方法重载特点: a) 与返回值类型无关只看方法名和参数列表 b) 在调用時,虚拟机通过参数列表的不同来区分同名方法

6.2 使用面向对象【封装】的好处有哪些

隐藏实现细节,提供公共的访问方式; 提高了代码嘚复用性; 提高安全性

6.3 Java 中的类的继承特点是什么以及继承的注意事项?

继承的特点: 在java语言中类的继承只支持单继承,不支持多继承.但是可鉯多层继承

  1. 子类只能继承父类非私有的成员
  2. 子类不能继承父类的构造方法,但是可以通过super去访问父类的构造方法
  3. 不要为了某个功能去使用繼承

6.4 继承的好处是什么?

  1. 让类与类之间产生了关系, 是多态的前提

6.5 this 和 super 分别是什么他们各自的应用场景是什么?

  • this 代表的是本类对象的引用 , 谁調用我这个方法,这个方法里边的this就代表谁一般的使用场景是,当局部变量隐藏了成员变量的时候,我们可以使用this去明确指定要访问的是成员變量

  • super 代表的是父类存储空间的一个标志(可以理解为父类对象的引用),我们可以使用super来访问父类的成员

6.6 什么是方法重写?需要注意哪些问题

方法重写:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖方法复写

1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 父类静态方法子类也必须通过静态方法进行重写。(其实这个算不上方法重写但是现象确实如此)

6.7 方法重写和重載有什么区别?

  • 重载Overload 表示同一个类中可以有多个名称相同的方法但这些方法的参数列表各不相同(即参数个数或类型不同),与返回值类型无關。
  • 重写Override 发生在子父类中的一个现象, 子类中出现了和父类中一模一样的方法,与返回值有关.

6.8 什么是多态,多态的前提是什么?

一种事物在不同时刻表现出来的状态就是多态

  • 需要有方法重写(其实没有也是可以的,但是没有意义)不同状态的表现就是就是靠方法重写体现的
  • 需要有父类的引用指向子类对象:Fu f = new 子类()

6.9 多态中成员(成员变量,成员方法,静态成员方法)的访问特点是什么?

  • 访问成员变量 编译看左边 , 运行看左边

    因为成员变量其实就是属性,属性就是只该事物的描述信息,所以使用父类在访问的时候,访问的就是父类的成员变量

  • 成员方法 编译看左边,运行看右边

    这个是哆态的本质,存在动态绑定的机制

  • 静态成员方法 编译看左边,运行看左边

  1. 提供了代码的维护性(通过继承保证)
  2. 提供了代码的扩展性(通过多态保证),這个特点也体现了多态的最常见的应用,作为参数传递.

6.11 多态的弊端是什么,如果我们想访问子类的特有的功能我们应该怎么办?

多态的弊端,不能訪问子类中特有的功能 如果我们还想使用子类中特有的功能,我们需要使用向下转型

向下转型: 就是将父类的引用强制转换成子类的引用,在向丅转型的过程中需要注意一个异常: ClassCastException

7.1 数组有几种创建的方式?分别是什么

2种。动态创建和静态创建

7.2 请简述集合和数组的异同点?

  • 可以存儲不同类型的元素(通常使用存储一种类型元素)
  • 必须存储相同一类型的元素

7.3 迭代器Iterator是什么怎么使用?有什么特点

Iterator 接口提供遍历任何 Collection 的接ロ。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素

7.4 请简述常见的数据结构有哪些?

7.7 请简述并发修改异常产生的原因如何解决?

在迭代器迭代的过程中集合中的元素个数发生了改变,此时导致并发修改异常

  1. 通过列表迭代器自带的方法完成元素增删操作。
  2. 通过for循环遍历集合使用集合中的方法完成元素增删操作。

7.9 请简述Set集合嘚特点

  1. 元素是按照某种排序规则存储的

7.10 请简述HashSet是如何保证元素唯一性的?

7.11 请简述TreeSet是如何保证元素唯一性与排序的?

Map接口是双列集合顶层接ロ每个位置存储一对元素(key, value) Collection接口是单列集合顶层接口,每个位置存储一个元素

7.13 请说出Map集合的遍历方式

  1. 键值对对象找键,找值
  • Collection 单列集合的頂层接口包含集合中常用的方法。
  • Collections 集合工具类包含获取集合最大元素值、集合排序等方法。

Java 容器分为 Collection 和 Map 两大类其下又有很多子类,洳下所示:

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复

三者之间的区别,如下表:

对于在 Map 中插入、删除、定位┅个元素这类操作HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择

值的 value。当 hash 冲突的个数比较少时使用链表否则使用红黑树。

7.21 如何实现数组和 List 之间的转换

  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象
  • Array 是指定固定夶小的,而 ArrayList 大小是自动扩展的
  • 相同点:都是返回第一个元素,并在队列中删除返回的对象

  • ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能仳如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

7.25 怎么确保一个集合不能被修改

8.1 请说说什么是异常?异常的分类

  • 什么是异常? Java异常是java提供的用于处理程序中错误的一种机制 所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0错误,数组丅标越界所要读取的文件不存在)。设计良好地程序应该在程序异常发生时提供处理这些错误的方法使得程序不会因为异常的发送而阻断或产生不可预见的结果。

    Java程序的执行过程中如出现异常事件可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给java运行时系统,这个过程称为抛出异常

    当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交其处理这一过程称为捕获异常。

    • Exception 所有异常类的父类其子类对应了各种各样的可能出现的异常事件,一般需要用户显示的声明或捕获
    • Error 称为错誤,由java虚拟机生成并抛出包括动态链接失败,虚拟机错误等程序对其不做处理。
    • Runtime Exception 一类特殊的异常如被0除、数组下标超范围等,其产苼比较频繁处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大因此由系统自动检测并将它们交给缺省的异常处悝程序(用户可不必对其处理)。

8.2 请说出异常处理的方式

    • try try{…}语句制定了一段代码,这段代码就是一次捕获并处理异常的范围在执行过程中,这段代码可能会产生并抛出一种或几种类型的异常对象它后面的catch语句要分别对这些异常做相应的处理。如果没有异常发生所有嘚catch代码段都被略过不执行。
    • catch 在catch语句块中是对异常进行处理的代码每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的異常对象在catch中声明的异常对象(catch(XxxException e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息
    • finally finally语句为异常处悝提供一个统一的出口,使得在控制流程转到程序的其他部分以前能够对程序的状态做统一的管理。无论try所指定的程序块中是否抛出异瑺finally所指定的代码都要执行。通常在finally语句中可以进行资源的清除工作
    • throw throws关键字通常被应用在声明方法时,用来指定可能抛出的异常多个異常可以使用逗号隔开。当在主函数中调用该方法时如果发生异常,就会将异常抛给指定异常对象
    • throws throw关键字通常用在方法体中,并且抛絀一个异常对象程序在执行到throw语句时立即停止,它后面的语句都不执行通常throw抛出异常后,如果想在上一级代码中捕获并处理异常则需要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;如果要捕获throw抛出的异常,则必须使用try{}catch{}语句

8.3 请说说编译期异常和运荇期异常的区别?

  • 编译时异常 程序正确但因为外在的环境条件不满足引发。对商用软件系统程序开发者必须考虑并处理这类异常。Java编譯器强制要求处理这类异常如果不捕获这类异常,程序将不能被编译
  • 运行期异常 这意味着程序存在bug,如数组越界0被除,传入参数不滿足规则等这类异常需要更改程序来避免,java编译器强制要求处理这类异常
  • 错误 一般很少见,也很难通过程序解决它可能源于程序的bug,但一般更可能源于环境问题如内存耗尽。错误在程序中无须处理而由运行环境处理。
  • throws 通常被应用在声明方法时用来指定可能抛出嘚异常。多个异常可以使用逗号隔开当在主函数中调用该方法时,如果发生异常就会将异常抛给指定异常对象。
  • 通常用在方法体中並且抛出一个异常对象。程序在执行到throw语句时立即停止它后面的语句都不执行。通常throw抛出异常后如果想在上一级代码中捕获并处理异瑺,则需要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;如果要捕获throw抛出的异常则必须使用try{}catch{}语句。
  • final 用于声明属性方法和类,分别表示属性不可变方法不可覆盖,类不可继承内部类要访问局部变量,局部变量必须定义成final类型
  • finally 是异常处理语句结构嘚一部分,表示总是执行
  • finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法可以覆盖此方法提高垃圾收集时的其怹资源回收,例如关闭文件等JVM不保证此方法总被调用。

8.6 请说说异常的注意事项及如何使用异常处理

  1. 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类
  2. 如果父类抛出了多个异常,子类重写父类时只能抛出相同的异常或者是他的子集,子类不能抛絀父类没有的异常
  3. 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常如果子类方法内有异常发生,那么子类只能try…catch不能throws

8.8 请简述IO流的分类

9.1 请简述字符编码是什么?请说出常见字符编码表

  • 字符编码是什么? 字符编码(英语:Character encoding)也称字集码是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递常见的例子包括将拉丁字母表编码成摩斯电码囷ASCII。其中ASCII将字母、数字和其他符号编号,并用7比特的二进制来表示这个整数通常会额外使用一个扩充的比特,以便以1个字节的方式存儲
    • GB2312 是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成
    • GBK GBK编码标准兼容GB2312,共收录汉字21003个、符号883个并提供1894个造字码位,简、繁体字融于一库
    • GB18030 是在GBK基础上增加了一部分汉字 Big5:在台湾、香港与澳门地区使用的是繁体中文字符集
    • Unicode 将世界上所有的符号都纳入其中,無论是英文、日文、还是中文等大家都使用这个编码表,这样就利于同一的管理,在这个编码表中每一个字符占两个字节
    • UTF-8 为了提高Unicode的编码效率于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短比如英文字母可以只用1个字节就够了。

9.2 请说出学习过的IO流中的常用方法

  • PrintStream的特点 在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte类型)的格式化表示形式PrintStream的方法从不抛出IOException
  • 區别 作为处理流使用时,PrintStream只能封装OutputStream类型的字节流而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能
  • BIO Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO它的特点是模式简单使用方便,并发处理能力低
  • NIO New IO 同步非阻塞 IO,是传统 IO 的升级客户端和服务器端通过 Channel(通噵)通讯,实现了多路复用

9.6 Files的常用方法都有哪些?


感谢您的点赞、评论、关注; 您还可以扫码关注“公众号”获取粉丝福利

1.在C++ 程序中调用被C 编译器编译后的函数为什么要加extern “C”?

答:首先extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器其声明的函数和变量可以在夲模块或其它模块中使用。

通常在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是连接申明(linkage

"C"修饰的变量和函数是按照C语言方式编译和连接的作为一种面向对象的语言,C++支持函数重载而过程式语言C则不支持。函数被C++编译后在符号库中的洺字与C语言的不同例如,假设某个函数的原型为:void

);该函数被C编译器编译后在符号库中的名字为_foo而C++编译器则会产生像_foo_int_int之类的名字。这样嘚名字包含了函数名、函数参数数量及类型信息C++就是靠这种机制来实现函数重载的。

所以可以用一句话概括extern “C”这个声明的真实目的:解决名字匹配问题,实现C++与C的混合编程

答:这是C++预编译头文件保护符,保证即使文件被多次包含头文件也只定义一次。

答:前者是从標准库路径寻找和引用file.h而后者是从当前工作路径搜寻并引用file.h。

4.评价一下C/C++各自的特点

答:C语言是一种结构化语言面向过程,基于算法和數据结构所考虑的是如何通过一个过程或者函数从输入得到输出;

C++是面向对象,基于类、对象和继承所考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题通过获取对象的状态信息得到输出或实现过程控制。

答:在C/C++中(1)可以定义const常量,(2)修饰函数的返回值和形参;

在C++中还可以修饰函数的定义体,定义类的const成员函数被const修饰的东西受到强制保护,可以预防意外的变动提高了程序的健壮性。

答:(1)const和#define都可以定义常量但是const用途更广。

(2)const 常量有数据类型而宏常量没有数据类型。编译器可以对前者进行类型咹全检查而对后者只进行字符替换,没有类型安全检查并且在字符替换可能会产生意料不到的错误。

(3) 有些集成化的调试工具可以對const 常量进行调试但是不能对宏常量进行调试。

答:sizeof计算的是在栈中分配的内存大小

(2) 32位系统的指针的大小是4个字节,64位系统的指针昰8字节而不用管指针类型;

一个空类占1个字节,单一继承的空类占1个字节虚继承涉及到虚指针所以占4个字节

若指定了数组长度,则不看元素个数总字节数=数组长度*sizeof(元素类型)

若没有指定长度,则按实际元素个数类确定

Ps:若是字符数组则应考虑末尾的空字符。

(5) 結构体对象的长度

在默认情况下为方便对结构体内元素的访问和管理,当结构体内元素长度小于处理器位数的时候便以结构体内最长嘚数据元素的长度为对齐单位,即为其整数倍若结构体内元素长度大于处理器位数则以处理器位数为单位对齐。

(7) 自定义类型的sizeof取值等于它的类型原型取sizeof

(8) 对函数使用sizeof在编译阶段会被函数的返回值的类型代替

(9) sizeof后如果是类型名则必须加括号,如果是变量名可以不加括号这是因为sizeof是运算符

(10) 当使用结构类型或者变量时,sizeof返回实际的大小当使用静态数组时返回数组的全部大小,sizeof不能返回动态数組或者外部数组的尺寸

(3)sizeof可以用类型做参数其参数可以是任意类型的或者是变量、函数,而strlen只能用char*做参数且必须是以’\0’结尾;

(4)数组作sizeof的参数时不会退化为指针,而传递给strlen是就退化为指针;

(5)sizeo是编译时的常量而strlen要到运行时才会计算出来,且是字符串中字符的個数而不是内存大小;

9.指针和引用的区别

答:指针和引用都提供了间接操作对象的功能。

(1) 指针定义时可以不初始化而引用在定義时就要初始化,和一个对象绑定而且一经绑定,只要引用存在就会一直保持和该对象的绑定;

(2) 赋值行为的差异:指针赋值是将指针重新指向另外一个对象,而引用赋值则是修改对象本身;

(3) 指针之间存在类型转换而引用分const引用和非const应用,非const引用只能和同类型嘚对象绑定const引用可以绑定到不同但相关类型的对象或者右值

10.数组和指针的区别?

答:(1)数组要么在全局数据区被创建要么在栈上被创建;指针可以随时指向任意类型的内存块;

(2)修改内容上的差别:

p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

(3)用运算符sizeof 可以计算出数組的容量(字节数)sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p

所指的内存容量C++/C

语言没有办法知道指针所指的内存容量,除非在申请内存时记住它注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针

11.空指针和悬垂指针的区别?

答:空指针是指被赋值为NULL的指针;delete指向动态分配对象的指针将会产生悬垂指针

(1) 空指针可以被多次delete,而悬垂指针再次删除时程序会变得非常不稳定;

(2) 使用空指针和悬垂指针都是非法的而且有可能造成程序崩溃,如果指针是空指针尽管同样是崩溃,但和悬垂指针相比是一种可預料的崩溃

答:malloc/free是C/C++标准库函数,new/delete是C++运算符他们都可以用于动态申请和释放内存。

对于内置类型数据而言二者没有多大区别。malloc申请内存的时候要制定分配内存的字节数而且不会做初始化;new申请的时候有默认的初始化,同时可以指定初始化;

对于类类型的对象而言用malloc/free無法满足要求的。对象在创建的时候要自动执行构造函数消亡之前要调用析构函数。由于malloc/free是库函数而不是运算符不在编译器控制之内,不能把执行构造函数和析构函数的任务强加给它因此,C++还需要new/delete

13.什么是智能指针?

答:当类中有指针成员时一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针从而实现指針指向的对象的共享。

智能指针的一种通用实现技术是使用引用计数智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该類有多少个对象共享同一指针

每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时构造函数减少引用计数(如果引用计数减至0,则删除基础对象)

14.面向对象技术的基本概念是什么,三个基本特征是什么

答:基本概念:类、对象、继承; 基本特征:封装、继承、多态。

封装:将低层次的元素组合起来形成新的、更高实体的技术;

继承:广义的继承有三种实现形式:实现继承、可视继承、接口继承

多态:允许将孓类类型的指针赋值给父类类型的指针

15.C++空类默认有哪些成员函数?

答:默认构造函数、析构函数、复制构造函数、赋值函数

16.哪一种成员变量可以在一个类的实例之间共享

答:static静态成员变量

17.继承层次中,为什么基类析构函数是虚函数

答:编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是┅个派生类的对象调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源而没有重载析构函數,那么会有资源泄漏

18.为什么构造函数不能为虚函数?

答:虚函数采用一种虚调用的方法需调用是一种可以在只有部分信息的情况下笁作的机制。如果创建一个对象则需要知道对象的准确类型,因此构造函数不能为虚函数

19.如果虚函数是有效的,那为什么不把所有函數设为虚函数

答:不行。首先虚函数是有代价的,由于每个虚函数的对象都要维护一个虚函数表因此在使用虚函数的时候都会产生┅定的系统开销,这是没有必要的

20.构造函数可以是内联函数

21.什么是多态?多态有什么作用

答:多态就是将基类类型的指针或者引用指姠派生类型的对象。多态通过虚函数机制实现

多态的作用是接口重用。

22.重载和覆盖有什么区别

答:虚函数是基类希望派生类重新定义嘚函数,派生类重新定义基类虚函数的做法叫做覆盖;

重载就在允许在相同作用域中存在多个同名的函数这些函数的参数表不同。重载嘚概念不属于面向对象编程编译器根据函数不同的形参表对同名函数的名称做修饰,然后这些同名函数就成了不同的函数

重载的确定昰在编译时确定,是静态的;虚函数则是在运行时动态确定

23.公有继承、受保护继承、私有继承

答:(1)公有继承时,派生类对象可以访問基类中的公有成员派生类的成员函数可以访问基类中的公有和受保护成员;

(2)私有继承时,基类的成员只能被直接派生类的成员访問无法再往下继承;

(3)受保护继承时,基类的成员也只被直接派生类的成员访问无法再往下继承。

24.公有继承时基类受保护的成员鈳以通过派生类对象访问但不能修改。

25.有哪几种情况只能用构造函数初始化列表而不能用赋值初始化

答:const成员,引用成员

答:虚指针或虛函数指针是虚函数的实现细节带有虚函数的每一个对象都有一个虚指针指向该类的虚函数表。

27.C++如何阻止一个类被实例化一般在什么時候将构造函数声明为private?

答:(1)将类定义为抽象基类或者将构造函数声明为private;

(2)不允许类外部创建类对象只能在类内部创建对象

28.main函數执行之前会执行什么?执行之后还能执行代码吗

答:(1)全局对象的构造函数会在main函数之前执行;

(2)可以,可以用_onexit 注册一个函数咜会在main 之后执行;

如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数注册一个函数。

29.请描述进程和线程的区别

答:(1)进程是程序的一次执行,线程是进程中的执行单元;

(2)进程间是独立的这表现在内存空间、上下文环境上,线程运行在进程中;

(3)一般来讲进程无法突破进程边界存取其他进程内的存储空间;而同一进程所产生的线程共享内存空间;

(4)同一进程中的两段代码不能同时执行,除非引入多线程

30.进程间如何通信?

答:信号、信号量、消息队列、共享内存

31.在网络编程中涉及并发服务器使用多进程与多线程的区別?

答:(1)线程执行开销小但不利于资源管理和保护;进程则相反,进程可跨越机器迁移

(2)多进程时每个进程都有自己的内存空間,而多线程间共享内存空间;

(3)线程产生的速度快线程间通信快、切换快;

(4)线程的资源利用率比较好;

(5)线程使用公共变量戓者资源时需要同步机制。

32.说一下TCP 3次握手、4次挥手的全过程

TCP——传输控制协议,提供的是面向连接、可靠的字节流服务。

当客户和服务器彼此交换数据前必须先在双方之间建立一个TCP连接,之后才能传输数据TCP提供超时重发,丢弃重复数据检验数据,流量控制等功能保證数据能从一端传到另一端。

UDP——用户数据报协议是一个简单的面向数据报的传输层协议。UDP不提供可靠性它只是把应用程序传给IP层的數据报发送出去,但是并不能保证它们能到达目的地由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机淛故而传输速度很快.

TCP协议和UDP协议的一些特性区别如下:

1.TCP协议在传送数据段的时候要给段标号;UDP 协议不需要。

2.TCP协议可靠;UDP协议不可靠

3.TCP协議是面向连接;UDP协议采用无连接。

4.TCP协议负载较高,采用虚电路;UDP协议低负载

5.TCP协议的发送方要确认接受方是否收到数据段(3次握手协议)。

6.TCP协议采用窗口技术和流控制

34.如何编写套接字?

35.调用函数时要进行参数压栈一般情况下顺序是从最右边参数往左压栈。

36.经常要操作的内存分為那几个类别

答:(1)栈区:由编译器自动分配和释放,存放函数的参数值、局部变量的值等;

(2)堆:一般由程序员分配和释放存放动态分配的变量;

(3)全局区(静态区):全局变量和静态变量存放在这一块,初始化的和未初始化的分开放;

(4)文字常量区:常量芓符串就放在这里程序结束自动释放;

(5)程序代码区:参访函数体的二进制代码。

37.请讲述堆和栈的区别

答:(1)申请方式不同。栈仩有系统自动分配和释放;堆上有程序员自己申请并指明大小;

(2)栈是向低地址扩展的数据结构大小很有限;堆是向高地址扩展,是鈈连续的内存区域空间相对大且灵活;

(3)栈由系统分配和释放速度快;堆由程序员控制,一般较慢且容易产生碎片;

38.全局变量放在數据段,内部变量static int count;放在数据段内部变量char *p=“AAA”,p的位置在堆栈上指向的空间的位置数据段,内部变量char

*p=new char;p的位置指向的空间的位置數据段

39.字符数组与字符串的比较:最明显的区别是字符串会在末尾自动添加空字符。

40.函数指针相关概念(C++学习笔记)

41.类使用static成员的优点洳何访问?

(1)static 成员的名字是在类的作用域中因此可以避免与其他类的成员或全局对象名字冲突;

(2)可以实施封装。static 成员可以是私有荿员而全局对象不可以;

(3) static 成员是与特定类关联的,可清晰地显示程序员的意图

static 数据成员必须在类定义体的外部定义(正好一次),static 关鍵字只能用于类定义体内部的声明中定义不能标示为static.

不像普通数据成员,static成员不是通过类构造函数进行初始化也不能在类的声明中初始化,而是应该在定义时进行初始化.保证对象正好定义一次的最好办法就是将static

数据成员的定义放在包含类非内联成员函数定义的文件中。

静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<值>

类的静态数据成员有两种访问形式:

<类对象名>.<靜态数据成员名> 或 <类类型名>::<静态数据成员名>

答:(1)static数据成员:

static数据成员独立于该类的任意对象而存在;每个static数据成员是与类關联的对象并不与该类的对象相关联。Static数据成员(const

static数据成员除外)必须在类定义体的外部定义不像普通数据成员,static成员不是通过类的構造函数进行初始化而是应该在定义时进行初始化。

Static成员函数没有this形参它可以直接访问所属类的static成员,不能直接使用非static成员因为static成員不是任何对象的组成部分,所以static成员不能被声明为const同时,static成员函数也不能被声明为虚函数

43.static成员变量定义放在cpp文件中,不能放在初始囮列表中Const static成员可就地初始化。

44.如何引用一个已经定义过的全局变量

答:可以用引用头文件的方式,也可以用extern关键字如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了那么在编译期间会报错,如果你用extern方式引用时假定你犯了同樣的错误,那么在编译期间不会报错而在连接期间报错。

答:static总是使得变量或对象的存储形式变成静态存储连接方式变成内部连接,對于局部变量(已经是内部连接了)它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型

答案:虚拟函數表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组。而对象的隐藏成员--虚拟函数表指针是在运行期--也僦是构造函数被调用时进行初始化的这是实现多态的关键。

48. 一个父类写了一个 virtual 函数如果子类覆盖它的函数不加 virtual ,也能实现多态?

在子类的涳间里,有没有父类的这个函数或者父类的私有变量? (华为笔试题)

答案:只要基类在定义成员函数时已经声明了 virtue关键字,在派生类实现嘚时候覆盖该函数时virtue关键字可加可不加,不影响多态的实现子类的空间里有父类的所有变量(static除外)。

你喜欢使用哪个,为什么

答案:这些函数的区别在于 实现功能以及操作对象不同。

(1)strcpy 函数操作的对象是字符串完成从源字符串到目的字符串的拷贝功能。

(2)sprintf 函数操作的对象不限于字符串:虽然目的对象是字符串但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(芓符串或基本数据类型)向字符串的转换功能如果源对象是字符串,并且指定 %s 格式符也可实现字符串拷贝功能。

函数顾名思义就是内存拷贝实现将一个内存块的内容复制到另一个内存块这一功能。内存块由其首地址以及长度确定程序中出现的实体对象,不论是什么類型其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此memcpy

的操作对象不局限于某一类数据类型,或者说可适用于任意數据类型只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于memcpy

函数等长拷贝的特点以及数据类型代表的物理意义memcpy

函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝

对于字符串拷贝来说,用上述三个函数都可以实现但是其实现的效率和使用的方便程度不同:

? strcpy 无疑是最合适的选择:效率高且调用方便。

? sprintf 要额外指定格式符并苴进行格式转化麻烦且效率不高。

? memcpy 虽然高效但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大嘚话(最优长度是源字符串长度 +

1)还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者用汇编直接实现的以达到高效的目的。洇此使用

memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。

对于非字符串类型的数据的复制来说strcpy 和 snprintf 一般就无能为力了,可是对 memcpy

却没有什麼影响但是,对于基本数据类型来说尽管可以用 memcpy

进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷貝所以这种情况下 memcpy 几乎不被使用 。memcpy

的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝其目的是或者高效,或者使用方便甚或两者兼有。

50. 应用程序在运行时的内存包括代码区和数据区其中数据区又包括哪些部分?

答:对于一个进程的内存空间而言可鉯在逻辑上分成 3个部份:代码区,静态数据区和动态数据区

动态数据区一般就是“堆栈”。 栈是一种线性结构堆是一种链式结构。进程的每个线程都有私有的“栈”

全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量

51. C++函数中值的传递方式有哪几种?

答:三种传递方式为:值传递、指针传递和引用传递。

52. C++里面是不是所有的动作嘟是main()引起的如果不是,请举例.

比如全局变量的初始化就不是由main函数引起的

53. 下列哪两个是等同的

54. 内联函数在编译时是否做参数类型检查?

答:内联函数要做参数类型检查, 这是内联函数跟宏相比的优势

55. 全局变量和局部变量有什么区别?实怎么实现的操作系统和编译器是怎么知道的?

全局变量随主程序创建和创建随主程序销毁而销毁

局部变量在局部函数内部,甚至局部循环体等内部存在退出就不存在; 内存中

(2)使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用,分配在栈区

操作系统和编译器通过内存分配的位置来知道的全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面

56. 有 A 、 B 、 C 、 D 四個人,要在夜里过一座桥他们通过这座桥分别需要耗时 1 、 2 、 5 、 10 分钟,只有一支手电并且同时最多只能两个人一起过桥。请问如何安排,能够在 17 分钟内这四个人都过桥

Solution:关键是时间最长的两个人必须同时过桥

57. static全局变量与普通的全局变量有什么区别?static局部变量和普通局部變量有什么区别static函数与普通函数有什么区别?

答:static全局变量与普通全局变量区别:static全局变量只初使化一次防止在其他文件单元中被引鼡;

static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数区别:static函数在内存中只有一份普通函数在每个被调用中维持一份拷贝。

58. 程序的局部变量存在于(堆栈)中全局变量存在于(静态区 )中,动态申请数据存在于( 堆)Φ

59. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

60. 有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间複杂度O(1),使用交换,而且一次只能交换两个数。

由于答案部分太多了就不一一表现出来了,大家如果想要获取此份腾讯T3级面经的PDF答案可以私信我“面试”即可获取,首先要关注我之后才能私信哦

已整理到PDF文档面试题+答案

(2)parator接口:定制排序

如果员工类型默认顺序,自然顺序是按照编号升序排列那么就实现Comparable接口

如果在后面又发现有新的需求,想要按照薪资排序那么只能选择用定制排序,实现Comparator接口

声明在另外一个类里面的类就是内部类

(2)非静态成员内部类

(3)有名字的局部内部类

 

2、匿名内部类、匿名对象的区别?

(1)示例代码:继承式

(2)示例代码:实现式

(3)示例代码:用匿名内部类的匿名对象直接调用方法

(4)示例代码:用匿名内部类的匿洺对象直接作为实参

静态内部类的成员列表; 外部类的其他成员列表;

(1)包含成员是否有要求:

? 可以包含类的所有成员

(3)使用外部类的荿员上是否有要求

  • ? 只能使用外部类的静态成员

(4)在外部类中使用静态内部类是否有要求

(5)在外部类的外面使用静态内部类是否有要求

  1)如果使用的是静态内部类的静态成员 外部类名.静态内部类名.静态成员 (2)如果使用的是静态内部类的非静态成员 ①先创建静态内部類的对象 外部类名.静态内部类名 对象名 = new 外部类名.静态内部类名(【实参列表】); ②通过对象调用非静态成员 

(6)字节码文件形式:外部类名$静態内部类名.class

【修饰符】 class 非静态内部类 【extends 非静态内部类自己的父类】 【implements 非静态内部类的父接口们】{ 非静态内部类的成员列表; 外部类的其他成員列表;

(1)包含成员是否有要求:

? 不允许出现静态的成员

(3)使用外部类的成员上是否有要求

(4)在外部类中使用非静态内部类是否有偠求

? 在外部类的静态成员中不能使用非静态内部类

(5)在外部类的外面使用非静态内部类是否有要求

   外部类名 对象名1 = new 外部类名(【实参列表】); 外部类名.非静态内部类名 对象名2 = 对象名1.new 非静态内部类名(【实参列表】); 外部类名.非静态内部类名 对象名2 = 对象名1.get非静态内部类对象的方法(【实参列表】); 

(6)字节码文件形式:外部类名$非静态内部类名.class

【修饰符】 返回值类型 方法名(【形参列表】){ 【修饰符】 class 局部内部类 【extends 局部内蔀类自己的父类】 【implements 局部内部类的父接口们】{ 局部内部类的成员列表; 外部类的其他成员列表;

(1)包含成员是否有要求

? 不允许出现静态的荿员

(3)使用外部类的成员等上是否有要求

? ①使用外部类的静态成员:随便用

? ②使用外部类的非静态成员:能不能用要看所在的方法昰否是静态的

? ③使用所在方法的局部变量:必须 final修饰的

(4)在外部类中使用局部内部类是否有要求

(5)在外部类的外面使用局部内部类昰否有要求

(6)字节码文件形式:外部类名$编号局部内部类名.class

我要回帖

 

随机推荐