Java面试题

是什么 有什么作用 优点 缺点 应用场景 和其他的异同

在同一个类中可以有多个main方法。

八种基本数据类型的大小,以及他们的封装类。

八种基本数据类型,int ,double ,long ,float, short,byte,character,boolean

对应的封装类型是:Integer ,Double ,Long ,Float, Short,Byte,Character,Boolean

基本型别 大小 最小值 最大值
boolean —– —– ——
char 16-bit Unicode 0 Unicode 2^16-1
byte 8-bit -128 +127
short 16-bit -2^15 +2^15-1
int 32-bit -2^31 +2^31-1
long 64-bit -2^63 +2^63-1
float 32-bit IEEE754 IEEE754
double 64-bit IEEE754 IEEE754
i
自动转换:位数小的转为位数大的,比如int转为double
强制转换:位数大的转为位数小的

i++i++i
int i=0;
System.out.println(i++);//0
System.out.println(++i);//1
i++先赋值再自增,下次引用i时再增
++i和i++相反

finally
finally块会被执行无论是否抛出异常,就算try里面有return也会执行,除非在try中写System.exit(1) 或 System.exit(0),,就会终止程序,不执行finally.

在java 中退出程序,经常会使用System.exit(1) 或 System.exit(0)。
  当 status为0 时正常退出程序, 当status为非0数字时异常退出。 终止当前的Java虚拟机。

在Mybatis中,有两种占位符
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号

  • mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值

  • $ {}对传递进来的参数原样拼接在SQL中

  • #{}是预编译处理,$ {}是字符串替换。

  • 使用#{}可以有效的防止SQL注入,提高系统安全性。

**ps:**预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

Mybatis中传递多个参数的4种方法总结

1、@Param注解传参法
#{}里面的名称对应的是注解 @Param括号里面修饰的名称。
这种方法在参数不多的情况还是比较直观的,推荐使用。

2、Map传参法
#{}里面的名称对应的是 Map里面的key名称。
这种方法适合传递多个参数,且参数易变能灵活传递的情况。

 try{
            //映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL


            /**
             * 由于我们的参数超过了两个,而方法中只有一个Object参数收集
             * 因此我们使用Map集合来装载我们的参数
             */
            Map<String, Object> map = new HashMap();
            map.put("start", start);
            map.put("end", end);
            return sqlSession.selectList("StudentID.pagination", map);
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    <!--分页查询-->
    <select id="pagination" parameterType="map" resultMap="studentMap">

        /*根据key自动找到对应Map集合的value*/
        select * from students limit #{start},#{end};

    </select>

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

如果配置了namespace那么当然是可以重复的,因为我们的声明实际上就是namespace + id

如果没有配置namespace的话,那么相同的id就会导致覆盖了。

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?(mybatis和hibernate的区别)

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和查找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理代理对象,代理对象代理会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

关联绑定有两种实现方式:

一种是通过注解绑定,就是在接口的方法上面加上@ Select @ Update等注解里面包含Sql语句来绑定

另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的名称空间必须为接口的全路径名。

Java中==与equals的区别及理解

区别:

1、对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2、对于equals方法,注意:equals方法不能作用于基本数据类型的变量

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

equals()是对字符串的内容进行比较

String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1==str2); //true

因为String是用final修饰的,所以会放在常量池。
解释:先在栈中创建一个对 String类的对象引用变量str1,然后通过引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池。如果已经有”abc” 则直接令str2指向“abc”。这里我们在第三行代码中已经将“abc”这个字符串存储进了常量池。所以str2和str1指向的是同一个“abc”,返回true。

面向对象的四大基本特性?
抽象 继承 封装 多态
多态的三个要素:继承、重写和父类引用指向子类对象。

& 与 && 的区别?
&运算符是:逻辑与;&&运算符是:短路与。
&和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达式是一定会执行的。这就是他们俩的本质区别。

访问修饰符public、private、protected、以及不写(default默认)时的区别?
在这里插入图片描述
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public)。外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。一个Java文件中,如果有多个类,只能有一个类被修饰为public,类名必须和文件名相同

float f=3.4;是否正确?
不正确。3.4是双精度数,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F。

java 重载与重写是什么?有什么区别?

重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。

构造方法可以重载,不可以重写

重写和重载
Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的

Super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。

重写与重载之间的区别
方法重载:
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关
方法重写:
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关

class Animal{
 public void move(){
  System.out.println("动物可以移动");
 }
}
class Dog extends Animal{
 public void move(){
  System.out.println("狗可以跑和走");
 }
 public void bark(){
  System.out.println("狗可以吠叫");
 }
}
public class TestDog{
 public static void main(String args[]){
  Animal a = new Animal(); // Animal 对象
  Animal b = new Dog(); // Dog 对象
  a.move();// 执行 Animal 类的方法
  b.move();//执行 Dog 类的方法
  b.bark();
 }
}
//以上实例编译运行结果如下:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
    b.bark();  

向上转型和向下转型

转型基础:有继承关系。

向上转型(upcasting):将子类对象转为父类对象。父类对象可以是接口。(儿子当爸爸)向上转型时,子类的新有的方法都会遗失掉。此处父类对象可以是接口

向下转型(downcasting):父类引用的对象转换为子类类型,需要强转。(爸爸当儿子)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值