1.面向对象的特征有什么?
面向对象的三大特征:
1.继承:
通过继承允许复用已有的类,继承关系是一种"一般到特殊"的关系,比如苹果类继承水果类,这个过程称为类继承.
派生出来的新类称为原有类的子类(派生类),而原有类称为新类的父亲(基类).
子类可以从父类那里继承得到方法和成员变量,而且子类可以修改或增加新的方法以适应子类的需要
2.封装:
封装是把对象的状态数据隐藏起来,再通过暴露合适的方法来允许外部程序修改对象的状态数据.Java的封装主要通过private,protected,public等访问权限修饰符来实现
3.多态:
多态指的是当同一个类型的引用的变量在执行相同的方法时,实际上会呈现出多种不同的行为特征.
比如程序有Animal a1 = new Animal(); Animal a2 = new Dog(); 虽然a1,a2两个对象的类型都是Animal,但是当他们调用同一个run()方法时,如果Dog()类重写过Animal的run()方法,这就会导致a1,a2两个对象执行run()方法时呈现出不同的行为特征,这就是多态.多态增加了编程的灵活性,实际上大量设计模式都是基于多态类实现的.
2.Java中实现多态的机制是什么?
多态就是指一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
*特点:*
- 指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。
- 若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
Java实现多态有三个必要条件:继承、重写、向上转型(父类引用指向子类对象)
3.一个.java源文件中是否可以包括多个类?(不是内部类)有什么限制?
可以有多个类,但是只能有一个public的类,并且public的类名必须与文件的主文件名相同
包含多个类的java源文件在编译之后会生成多个.class文件,每个类(包括内部类,外部类)都会生成一个对应的.class文件
4.String是基本数据类型吗?
基本数据类型有byte,short,int,long,char,long,double,boolean
String不是基本类型,String是引用类型
java.lang.String类是final的,因此无法通过String类派生子类
String类也是一个不可变类(它所包含的字符序列不可改变的),因此如果程序需要使用的字符串所包含的字符序列需要经常改变,建议使用StringBuffer(线程安全,性能略差)类或StringBuilder类
5.int和Integer有什么区别?
Java提供两种不同的类型:引用类型和基本数据类型
int是基本数据类型,Integer是Java为int提供的包装类
Java为所有的基本类型提供了包装类
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean
基本类型的变量只能当成简单的直接量,参与表达式运算,不具备面向对象的特征,基本类型的变量不能被赋null;但包装类的变量则完全可以当成对象使用,它具有面向对象的特征,包装类的变量可以被赋为null
因为Integer具有面向对象的特征,所以Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况
另外,Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer 中还定义了表示整数的最大值和最小值的常量。
6.Java有没有goto?
goto 是 Java 中的保留字,Java 程序的标识符不允许使用 goto。但 Java 也不支持使用 goto进行跳转。
7.String,StringBuffer和StringBuilder的区别
String 代表了字符序列不可变的字符串;而 StringBuffer、StringBuilder 都代表了字符序列可变的字符串。
StringBuffer、StringBuilder 的区别是 StringBuffer 是线程安全的、性能略低,而StringBuilder 是线程不安全的,适合单线程环境使用,性能较好。
8.Collection和Collections的区别
Collection是集合类的根接口(List,Set,Queue)的根接口
Collections是针对集合类的一个工具类,它提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作
9.说说&和&&的区别
&和&&都可以用作逻辑与的运算符,当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于 if(a >8 && b > 5),当 a 小于等于 8 时,由于&&之前的表达式已经为 false 了,因此&&之后的表达式根本不会执行;
10.重载(Overload)和重写(Override)的区别
重载 总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
重写 总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
Overload方法名相同,参数列表不同(参数的个数类型顺序),重写方法名,参数列表,必须相同(访问权限修饰符大于等于父类被重写方法)
11.java如何跳出当前的多层嵌套循环?
在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句,即可跳出外层循环。
12.String s = new String(“xyz”);创建了几个String对象?
两个。一个是直接量的"xyz"字符串对象,该字符串将会被缓存在字符串常量池中,以便以后复用这个字符串;另一个是通过 new Sting()构造器创建出来的 String 对象,这个 String对象保存在堆内存中。通常来说,应该尽量使用直接量的 String 对象,这样具有更好的性能。
13.数组有没有length()方法?String有没有length()这个方法?
数组没有length()这个方法,有length属性,String有length()方法
14.short s1 = 1;s1 = s1+1;有什么错?short s1 = 1;s1+=1;有什么错?
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。
对于 short s1 = 1; s1 += 1;由于 +=运算符里已经包括了一个隐式的强制类型转换,因此Java 会把 s1+=1 计算后的结果进行隐式的强制类型转换,因此它不会有任何错误。
15.char型变量中能不能存储一个中文字符?为什么?
char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,因此char型变量中也存储汉字.不过,如果某个特殊的汉字没有包含在Unicode编码字符集中,那么char类型变量就不能存储这个汉字.
16.用最有效率的方法计算出2乘以8等于多少
2<<3
因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左
移 3 位即可,而位运算 CPU 直接支持的,效率最高,所以,2 乘以 8 等于几的最效率的方
法是 2 << 3
17."=="和equals方法究竟有什么区别?
==操作符的作用有两种:
A.如果==的两边都是基本类型变量、包装类对象所组成的表达式,==用于比较两边的
表达式的值是否相等——只要两边的表达式的值相等,即使数据类不同,该运算符也会返回
true。例如’a’ == 97.0,将会返回 true。
B.如果==的两边是引用类型的变量,==用于判断这两个引用类型的变量是否引用同一
块内存,只有当它们引用同一块内存时,==才会返回 true。
引用类型比较时:
==比较地址是否相同
equals比较内容是否相同
18.静态变量和实例变量的区别
在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于一个对象,必须先创建实例对象,它的实例变量才会被分配空间,才能使用这个实例变量。静态变量则属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
19.是否可以从一个static方法内部调用非static方法?
不可以,静态成员不能调用非静态成员。
非 static 方法属于对象,必须创建一个对象后,才可以在通过该对象来调用 static 方法。而 static 方法调用时不需要创建对象,通过类就可以调用该方法。
20.请说出访问权限修饰符public,private,protected,以及不写时的区别
作用域 当前类 同一 package 子类 全局
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
21.外部类能用private,protected修饰吗?内部类可以用private,protected修饰吗?
外部类不能用 private、protected 修饰。内部类能用 private、protected 修饰。
22.has-a和is-a的区别
is-a是关联关系,也就是典型的继承关系,例如apple is a fruit,那么apple是一种特殊的fruit,也就是说apple继承了fruit
has-a是依赖关系,比如human has a leg,也就是leg组成了human
23.简述synchronized和java.util.concurrent.locks.Lock的异同
主要相同点:Lock 能完成 synchronized 所实现的所有功能
主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会
自动释放锁,而 Lock 一定要求程序员手工释放,并且必须在 finally 从句中释放。Lock 还有
更强大的功能,例如,它的 tryLock 方法可以非阻塞方式去拿锁
24.抽象类和接口的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
-
抽象类中可以包含静态方法,接口中不能包含静态方法
-
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
-
一个类可以实现多个接口,但只能继承一个抽象类。