Java面试题记录第四天

Java面试题记录第四天

1.Java的作用域有哪些?
答:在Java语言中,作用域是由花括号决定的,它决定变量名的可见性与生命周期。(个人看法,他的花括号意思是{},也就是方法中的作用域,一个方法一个作用域,对应的是局部变量,如果声明在一开始,或者是static模块中是全局变量)又会涉及到前几天的知识,在Java语言中,变量类型主要有3中:成员变量,静态变量,局部变量。

  • 成员变量,在第四天的学习中,可以了解到,成员变量可以是Java语言中任意的基本数据类型或引用数据类型(类,数组等),举个例子:int i=0;或者是:private User user;**类的成员变量的作用范围是,是在类中,方法之外。只有当类被实例化后,成员变量才会在内存中分配空间并初始化,直到这个实例化对象的生命周期结束,成员变量的生命周期才结束。
    **
public class Test1 {
    private int a=0;
    public int b=1;
    public static void main(String[] args) {
        Test1 t=new Test1();
        int a=t.a;
        System.out.println(a);
        System.out.println(b);//这里是IDEA报错的,红色
    }
}

分析一下代码:在一开始,就声明了private int a=0;public int b=1;两个成员变量,
然而,没有去实例化对象,直接调用成员变量会报红,例如代码中的b,然而,实例化一个对象后,比如t1,通过t1去调用a,就会输出

同样的成员变量由4中作用域:
在这里插入图片描述
Java语言提供public,protected,private和默认等4种访问权限。其中public修饰的成员变量作用域最广,允许被任何程序包种的类访问;protected修饰的成员变量允许被本类自身,子类及相同包的类访问;private修饰的成员变量只能被本类访问,如果成员变量之前没有显示声明访问权限,则该变量为默认访问权限,允许类自身和同一个包内的类访问。

  • 静态变量是static修饰的成员变量,静态变量不依赖于特定的实例,而是被所有实例共享,只要一个类被加载,JVM就会给静态变量分配空间。
  • 局部变量:作用域是在花括号内。方法内的变量。
    注意:private和protected不能修饰外部类,但可以用来修饰内部类。

2.一个Java文件中是否可以定义多个类?
答:一个Java文件中可以定义多个类,但是最多只有一个类可以被public修饰,并且这个类的类名必须与文件名相同。需要注意的是,当使用javac指令编译这个.Java文件时,他会给每一个类生成一个对应.class文件,例如:

class TestClassFather{
    public void tellFather(){
        System.out.println("You are my son");
    }
}
public class TestClass extends TestClassFather{
    public static void main(String[] args) {
        TestClassFather testClassFather=new TestClass();//在子类中去实例化父类的对象
        testClassFather.tellFather();
    }
}
结果为:
You are my son
分析一下:去继承父类的方法,用到了extends,注意这句话TestClassFather testClassFather=new TestClass();
会发现,结尾的时候不是TestClassFather,当子类继承了父类以后,他同样继承了方法,这个方法就是指public修饰的,所以结尾使用了子类的类名,当然也可以直接使用子类的类名去创建对象,然后调用父类的方法。TestClass testClass=new TestClass();testClass.tellFather();也可以实现

但是如果使用javac TestClass.java指令编译上述代码,会生成两个字节吗文件:TestClass.class 和 TestClassFather.class
文件。
3.什么是构造函数?
答:首先了解构造函数是一种特殊的函数,用来在对象实例化时,初始化对象的成员变量。也就是说,当你在实例化一个对象时,会自动去调用构造方法,这个时候,调用哪一个方法取决于参数的不同,就会选择不同的方法重载。构造函数有以下特点:

  • 构造函数必须与类的名字相同,并且不能有返回值
  • 每个类可以有多个构造函数,当程序员没有提供构造函数时,编译器会自动加载一个默认的无参构造方法,如果程序员提供了构造方法,编译器不会自动创建默认的构造方法
  • 构造函数的参数可以有0;1;一个以上,上不封顶,记住参数的形式→类型,参数名
  • 构造函数总是伴随着new操作(实例化)一起调用,不能由程序员去操作,而且只能执行一次(一次实例化)
  • 构造方法不能被继承,因此,它不能被覆盖,但是构造函数能够重载,可以使用不同的参数的个数或者类型定义多个构造方法
  • 子类可以通过super关键字来显示的调用父类的构造函数。(需要了解super和this关键字的用法,以及继承。把这个疑惑放在后面面试题说。)
    4.什么是重载?
    答:首先,了解了构造方法以后,直接可以说,构造方法的实现就是重载,但是要记住重载不止局限于构造方法。特点如下:
  • 方法名称相同。在构造方法中,方法名称要求必须与类名相同,同时,多个构造方法也就意味着方法名是相同的,但在这,普通的方法也可以名称相同。
  • 参数列表必须不同。包括个数,类型或者是(参数排列顺序不同,一般不用)。以下是代码分析:
public class TestWrite {
    public String name;
    public String student_id;
    private String address;
    public String phone;
    protected String major;
    private float GPA;


    //get一般都是用来获取某一个值,set一般是用来修改某一个值
    //getGPA()是用来获取GPA,使用return来将值返回
    public float getGPA(){
        return GPA;
    }
    //setGPA()是用来修改GPA的,但是这里,只要调用该方法,就会将GPA改为固定的值3.5f
    public void setGPA(){      //void不需要返回值
        GPA=2.5f;
    }
    //该方法是用来设置个人信息的,将会使用重载,注意查看
    //对于刚开始学习Java的同学而言,这里会有些迷茫
    //set刚刚说过是用来修改信息的,那么就是将setInfo()方法的参数传入,
    public void setInfo(String n,String id){
        name=n;
        student_id=id;
    }
    //这里就是用到了重载
    public void setInfo(String n,String id,String addr){
        name=n;
        student_id=id;
        address=addr;
    }
    //这里就是用到了重载
    public void setInfo(float gpa,String id){
        GPA=gpa;
        student_id=id;
    }
    //这里将会使用get方法来获取数据,其实就是一个习惯,对应英语的翻译,如果将方法内容与set交换,
    //get就变成了修改信息了
    //这里也会用到重载,注意观察
    public void getInfo(float gpa){     //注意这里,没有返回值类型,是void,因为比较简单,直接输出
        System.out.println("学号:"+student_id+"\tGPA"+gpa);
    }
    public void getInfo(String addr){
        System.out.println("学号:"+student_id+"\t姓名"+name+"\t地址"+addr);
    }

    public static void main(String[] args) {
        TestWrite testWrite1=new TestWrite();
        TestWrite testWrite2=new TestWrite();
        //下面是修改信息,也可以说是设置信息
        testWrite1.setInfo("段桑","2017006185","嘉力顿");//注意声明的时候,姓名,id,地址都是字符串形式,需要引号
        testWrite2.setInfo(3.5f,"2017006185");//GPA在声明的时候是float形式
        //设置完以后,获得信息,并且输出
        testWrite1.getInfo("嘉力顿");
        testWrite2.getInfo(3.5f);
    }
}
结果为:
学号:2017006185	姓名段桑	地址嘉力顿
学号:2017006185	GPA3.5
这里涉及到get和set的具体知识,暂时先了解这么多

5.switch对于string类型的支持,基于什么(为什么switch可以去对字符串支持)?
答:通过对case后面的string对象调用hsahCode()方法,得到一个int类型的hash值,然后利用这个值来标识这个case,那么当进行匹配时(switch后的表达式与case后面的string类型比较时),首先会调用这个字符串的hashCode()方法,获得一个hash值,再用这个hash值去匹配case,如果匹配成功,,在这再调用string.equals()方法去进行匹配。(这里就可以联想到之前讲过的第四点。点我查看
6.

  1. 在Java语言中,当参与运算的两个变量的数据类型不同时,就需要进行隐式的数据类型转换,转换规则是:从低精度向高精度转换。
  2. char类型在转换时会对应相应的ASCLL码。在Java中一个汉字是占2个字节,而一个char也是两个字节,所以一个char可以存放一个汉字,当然前提是采用unicode编码(byte是1个字节,char是两个字节,但是char里可以存一个汉字,这么说汉字就占用两个字节?String类型里的汉字,按照编码格式的不同,分为2-4个字节的占用,UTF-8占用3个字节,特别的占用4个字节。GBK里汉字确实是占用2个字节。UTF-16里汉字一般占2个字节,特殊的是4个字节。综上所述,那要看汉字是以什么编码格式来存储了,以及汉字是否为特殊汉字。)
  3. 关于强制转换数据类型,从高到低,需要注意long所占字节比float的字节数小。在强制转换数据类型会损失精度。
  4. 在Java语言中,基本数据类型是不能与布尔型数据转换的。
  5. 例题:
int i=1;
if(i){
		System.out.println("true");
}else{
		System.out.println("false");
}
结果是:报错,原因是if条件语句中表达式是布尔型的,i的类型是int型,int类型不能被隐式的转换为boolean
  1. 在Java语句中涉及到byte,short,char类型运算时,首先会把这些类型的白能量强制转换为int类型(隐式的),然后对int类型的值进行运算,得到的结果也是int型的。首先short s1=1;s1=s1+1;由于在运行时,s1先转换为int型,因此s1+1会报错,正确的写法是:short s1=1;s1=(short)s1+1;
  2. 特殊情况:使用到+=时,Java编译器会对其进行特殊处理,short s1=1;s1+=1;会通过编译。

7.包的作用:第一:提供多层命名空间,每个包里面可以出现名字相同的类;第二:对类进行按功能划分,是组织更清晰一点。(在Java基础里面使用不到的,在项目中会有dao层,service层,controller层)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值