关于Java的语言问题汇总

第一章

1.面向对象程序设计的基本特征有哪些?

1.封装
指将对象相关的状态信息和行为捆绑为一个逻辑单元,通过封装可以隐藏一个类的实现细节。
2.继承
通过类之间的继承,实现了代码的复用,在子类中可以新增属性和方法,并且可以重写父类方法的具体实现方式。
3.多态
多态在java中是指对象变量是多态的,一个类型为A的变量既可以指向类型为A的对象,又可以指向A的任何子类的对象。一个接口类型的变量也可以指向该接口实现类的对象。

2.java语言的运行机制如何?

计算机高级编程语言按其程序的执行方式可以分为编译型语言解释型语言

编译型语言是指使用专用的编译器,针对特定的操作系统将源程序代码一次性翻译成计算机能识别的机器指令。例如C,C++等都属于编译型语言。

解释型语言是指使用专门的解释器,将源程序代码逐条地解释成特定平台的机器指令,解释一句执行一句,类似于“同声翻译”。例如ASP,PHP等都属于解释型语言。

java既不是编译型语言也不是解释型语言,它是编译型和解释型语言的结合体。首先采用通用的java编译器将java源程序编译成与平台无关的字节码文件(class文件) ,然后由java虚拟机(JVM)对字节码文件解释执行。即:

java源代码–>java bytecode(.class file)–>经过JVM解释执行。

编译型和解释型语言都有各自的优缺点。
编译型语言会在程序第一次执行时将其全部编译成与当前系统平台相对应的机器指令,在后续执行时,直接运行第一次编译的结果,减少了编译次数,提高了程序运行效率,但是程序在第一编译时与系统平台相对应,因此移植性特别差。
解释型语言在程序每次运行时都要将源程序解释成当前系统平台相对应的机器指令,因此每次运行都需要解释并执行,运行效率较低,但是移植性强。

java采取了折中的方案。java首次运行时采取编译机制将源程序编译为java字节码文件,该字节码与系统平台无关,是介于源代码和机器指令之间的一种状态。在后续运行时,采取解释机制将java字节码解释成与系统平台对应的机器指令。这样既减少了编译次数,又增强了程序的可移植性,因此被称为“一次编译,多处运行”。因为.class文件并不是所有机器都能够识别的,所以才加一层虚拟层-虚拟机嘛。

提示:java字节码具有平台无关性,可以在各种不同系统平台中运行,但是,需要有不同版本的java虚拟机,不同系统平台的java运行环境其java虚拟机是不一样的。

其实,现在将编程语言分为“编译型”和“解释型”已经不够严谨了,更多资料参考:
1.Java 是编译型语言还是解释型语言?-知乎
2.R大的干货
3.程序的编译与解释有什么区别?-知乎

3.什么是JVM?有什么用?工作机制如何?

JVM是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机功能。JVM有自己完善的硬件架构,例如处理器,堆栈和寄存器等,还有相应的指令系统。

JVM屏蔽了与具体操作系统平台相关的信息,从而实现了java程序只需生成在JVM上运行的字节码文件,就可以在各种平台上不加修改地运行。JVM是java运行环境的最核心部分,是运行java程序的最基本环境。

4.什么是JRE?

JRE是java runtime environment的简称,即java运行时环境,它是java程序运行所必须的环境集合,主要由java虚拟机,java平台核心类和若干支持文件组成。JRE不包括编译器,调试器以及其他工具。

5.什么是JDK?

JDK是java development kit的简称,即java开发工具包。JDK提供了java的开发环境和运行环境。

JDK中除了包含JRE的全部内容外,还包括开发者用以编译,调试和运行java程序的工具。比如:
javac,jar,javadoc,jdb(debugger,查错工具)等。

6.JDK,JRE,JVM之间有什么区别?

它们是一种包含关系,范围由大到小是JDK,JRE,JVM。

7.什么是GC?GC的工作原理如何?

java语言没有提供释放以分配内存的显示操作方法,资源回收工作全部交由GC来完成,程序员不能精确地控制垃圾回收的时机。java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。

8.JDK安装时设置PATH和CLASSPATH环境变量有何作用?

PATH的设置已经非常熟悉了。CLASSPATH环境变量的作用是,让java执行环境找到指定的java程序对应的class文件以及程序中引用的其他class文件。

JDK在默认情况下会到当前工作目录下以及JDK的lib目录下寻找所需的class文件。

9.如何将程序中的文档注释提取出来生成说明文档?

javaDoc从源代码中抽取类,方法,成员等文档注释形成一个与源代码配套的API帮助文档。javadoc -help试试,在看别人的代码时,可以注释一些,然后生成javadoc,方便查看。

10.怎样制作双击就运行的jar文件?

java文件编译后会生成class文件,一个java类对应一个class文件,为了避免class文件过多,方便用户使用,开发者在为用户发布部署之前需要将class文件压缩。jar工具的主要用途是可以完成一系列相关的程序文件压缩为一个文件。

在windows下可以写一个bat文件,内容为java -jar hello.jar。双击即可运行。

第二章

1.用public,protected,private修饰方法有什么区别?

可以总结出访问控制的限制程度由高到低为:

private->default->protected->public,权限等级差别为:
类内部,同一包中,子类中,其他

2.this关键字有什么含义?在哪些情况下应用?

java中为了解决变量的命名冲突和不确定性问题,引入了关键字this。this代表当前类的一个实例,它经常出现在方法和构造方法中,具体使用情况有以下3种:

1.返回调用当前方法的对象的引用
2.在构造方法中调用当前类中的其他构造方法
3.当方法参数名和成员变量名相同时,用于区分参数名和成员变量名

3.final关键字有什么含义?具体如何应用?

分三种情况:

1.final修饰类

表示该类不能再被其他类继承

2.final修饰成员变量

表示该变量是一个常量,在需要使用常量的场合,可以使用final关键字定义。如果final修饰的是一个简单类型的变量,那么变量值一旦初始化后,将不能修改。如果final修饰的是一个引用类型的变量,那么该变量的引用不可以改变,但可以通过该引用修改引用对象的属性值。

3.final修饰方法

表示该方法不可以在子类中重写(覆盖)

4.instanceof关键字有什么含义?如何应用?

当instanceof左操作数是右操作数指定的类型或者子类类型时返回true,反之则返回false。

instanceof关键字主要作用是判断一个对象是否为指定类型。在变量使用多态时,可以使用instanceof关键字进行变量的类型判断,然后执行不同的操作。

5.java中有哪些数据类型?

java语言数据类型分为两种,一种是简单数据类型,另一种是引用数据类型。简单数据类型都有着固定的长度。如下:
这里写图片描述

注意:char类型为两个字节采用unicode编码,因此,无论是简单的字母还是汉字,在java中都是占用两个字节。

除了8种简单数据类型之外的所有数据类型都被称为引用数据类型,引用数据类型的大小统一为4字节,记录的是其引用对象的地址

java属于强类型语言,在定义变量时必须严格指定变量类型。java类型主要分为简单类型和引用类型,简单类型变量直接存储变量值,而引用类型变量存储的却是地址。

6.如何解决double和float精度不准的问题?

实验下列代码:

System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);

输出为:

0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

并不是想要的结果。

一个原则:float和double只能用来做科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal。通过使用BigDecimal类可以解决上述问题。

通过JDK帮助文档的原文解释,我们指知道浮点数是无法在计算机中国准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对浮点数运算时具有不可预知性。如果两个浮点操作数的误差可以相互抵消,计算结果就能保持正确。

7.float f = 3.4语句是否正确?

先上回答,不正确。

java中的类型可分为基本类型和引用类型,不同类型之间的变量赋值时,首先需要先进行类型转换,然后再进行赋值。

java类型转换可分为自动转换和强制转换两种。自动转换过程不需要程序员使用代码进行干预,而强制转换则需要程序员显示指定要转换的类型。

自动转换需要满足一下基本条件:

1.转换双方的类型必须兼容
2.目标类型比源类型范围要大

java中整形变量默认为int类型,如果需要申明long类型的常量,应该在后面加”L”或”l”。

int i = 3;
long l = 3L;

java中浮点型常量默认为double型,如要申明一个float型,则需在数字后面加”F”或”f”。

double d = 3.14;
float f = 3.14f;

8.成员变量和局部变量有什么区别?

1.public,protected,private,static等修饰符可用于修饰成员变量,但不能修饰局部变量。两者都可以使用final修饰。
2.成员变量存储在堆内存中,局部变量存储在栈内存中。
3.作用域不同,成员变量在整个类中有效,局部变量在方法体中有效,在方法体之外不可见。
4.成员变量可以默认初始化,局部变量必须显示初始化。

9.变量之间传值时可分为值传递和引用传递,那么它们有何区别?

存储机制:

简单类型变量是直接在栈内存中开辟存储空间存储变量值。

引用类型变量是由引用空间和存储空间两部分构成,引用空间在栈内存中,存储空间在堆内存中,存储空间负责存储变量值,引用空间负责存放存储空间的首地址。

引用类型变量和简单变量都属于值传递,不同的是简单变量传递的是内容本身,而引用变量传递的是引用地址。

10.x+=y和x=x+y两种方式有区别吗?

虽然x+=y和x=x+y在平时可以通用,还是有差别,差别在于+=除了实现功能之外还要进行一次类型的强制转换。

short ss = 3;
ss+=1;//编译通过
ss=ss+1//编译错误

11.”+”操作符在java内部是如何实现字符串连接的?

java不支持运算符重载,但在java内部提供了一些特殊运算符,他们具有重载的特征。例如”+”在实现字符串连接时,操作数可以是两个字符串,也可以是一个字符串和一个其他类型。示例:

String a = "a";
String b = "b";
String c = a+b;
String d = c+1;

将上述代码编译后再反编译,可以得到:

String a = "a";
String b = "b";
String c = (new StringBuilder(String.valueOf(a)).append(b)).toString();
String d = (new StringBuilder(String.valueOf(c)).append(1)).toString();

String类代表大小固定的字符串,一旦申明定义后,内容和大小将不可改变。String类中提供的所有字符串操作方法,都是操作结果创建了一个新的String对象并返回。

为了考虑效率问题,在底层java采用了StringBuilder类,该类代表大小可变的字符串,利用StringBuilder类的append和insert方法可以在原字符串基础上修改。

12.==和equals()有什么区别?

==是一个关系运算符,用于判断两个简单变量的值是否相等,或两个引用变量的引用地址是否相等。

equals()是一个方法,用于判断引用变量引用地址指向的存储内容是否相同。(该语义功能是通过重写equals方法来获得的)

13.使用String s = new String(“a”)和String s = “a”有什么区别?

java为String类型提供了缓冲池机制,当使用双引号定义对象时,java环境首先去字符串缓冲池中寻找相同内容的字符串,如果存在就直接拿出来使用,如何不存在则创建一个新的字符串放在缓冲池中,一般建议采用String s = "a"的方式,效率高。

14.如何实现数组的复制?

使用System类的一个静态方法arraycopy(),该方法定义如下:

static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

第三章

1.什么是类,对象,属性和方法?

类是对一类事物的抽象描述。
对象是类的一个具体实现,代表一个实实在在的个体。
属性是对一类相同特征的抽象。
方法是对一类相同行为的抽象。

2.什么是包?有什么好处?

为了避免类名重复的冲突,java引入了包机制,通过包可以组织程序的类,在不同的包中允许使用相同的名字。例如JDK提供的Date类就存在两个,分别在java.sql和java.util下。

3.什么是抽象类?有什么好处?

有abstract关键字修饰,允许包含未实现方法的类被称为抽象类。
有些情况下,在定义类时,可能有些方法需要具体实现,有些方法无法确定具体的实现方式,这时可以将该类定义成抽象类,无法具体实现的方法定义成抽象方法。

抽象类在使用时,注意几点:
1.抽象类不能实例化,即不能创建对象,只能作为父类用于被继承
2.子类继承一个抽象类后,必须实现父类中的所有抽象方法,否则子类也要定义为抽象类
3.抽象类中可以包含抽象方法,也可以不包含
4.如何包含抽象方法,必须定义为抽象类

4.什么是接口?有什么好处?

接口是方法声明和常量值定义的集合。定义成员变量时,会自动加上static和final关键字声明。

接口在使用时,需要注意以下几点:
1.接口只包含方法声明和常量定义,即使定义普通属性,该属性编译后也将变为常量
2.当其他类实现该接口时,接口中定义的所有方法都要求全部实现,否则需要定义成抽象类
3.一个类可以实现多个接口
4.定义接口时可以使用继承,接口之间允许多继承

5.什么是多态?

在java语言中,多态主要是指对象变量的多态,即一个A类型的变量可以既指向A类型的对象,又可以指向其子类的对象。

6.什么是内部类?有什么好处?

示例:

class A{
   
    private int age;
    class B{
   

    }
    public int getAge(){
        return age;
    }
}

在上述代码中,类A和B是并列关系,编译后会产生A.class和B.class两个字节码文件,它们是两个互不相同的类。

内部类主要有以下优点
1.内部类对象能访问其所处类的私有属性和方法。
2.内部类能够隐蔽起来,不被同一包中的其他类访问。如果一个类只对某个类提供使用,那么可以将其定义为内部类。
3.匿名内部类可以方便地用在回调方法中。

内部类的主要特征
1.内部类可以声明为抽象类,因此可以被其他的内部类继承,也可以声明为final的。
2.和外部类不同,内部类可以声明为private或protected,外部类只能用public和default。
3.内部类可以声明为static的,但此时就不能再使用外层封装的非static的成员变量
4.非static的内部类的成员不能声明为static的,只有在顶层类或static的内部类中才可以声明static成员。

7.使用抽象类和接口的场景?

区别:

1.定义格式不同

2.使用方式不同,一个子类只能继承一个抽象类,对于接口,一个类可以实现多个接口

3.设计理念不同,抽象类用于继承,表示”is a “的关系,而接口用于实现,表示”like a”的关系。例如具有报警功能的门,可以继承一个抽象的门类,实现一个报警器的接口

8.关于方法重载

方法的返回类型不是区分方法相同的标识,因此在方法重载时,同一个类中不能有两个方法名相同,参数相同,返回类型不同的方法。

在进行方法重载时,需要遵守以下几个重载规则:
1.方法名相同
2.参数列表必须不同
3.返回值类型可以不同
4.重载方法可以通过this关键字相互调用

9.static修饰的方法能否在子类中重写?

具有static修饰的父类方法是无法在子类中进行重写的,因为static关键字修饰的方法或者属性,表示该属性或方法与类相关。当JVM运行static修饰的方法时,解释器不会检查当前变量指向哪个类型实例,而是直接调用当前变量类型的方法。示例:

A test = new B();//结果为a
//        B test = new B();//结果为b
test.show();

class A{
   
    public static void show(){
        System.out.println("a");
    }
}
class B extends A{
   
    public static void show(){
        System.out.println("b");
    }
}

10.java中动态绑定是什么意思?

将一个方法调用同一个方法主体连接到一起称为“绑定”(binding)。如果在程序运行之前执行绑定,由编译器决定方法调用的程序,称为“早期绑定”或“静态绑定”。如果绑定过程在程序运行期间运行,以对象的类型为基础,则称为“后期绑定”或“动态绑定”

如果一种语言实现了后期绑定,同时必须提供一些机制,可以在运行期间判断对象的实际类型,并分别调用适当的方法,即编译器此时依然不知道对象的类型,但方法调用机制能够自己去调查,找到正确的方法主体。java方法的执行主要采用动态绑定技术,在程序运行时,虚拟机将调用对象实际类型所限定的方法。

java方法在调用过程中主要经历了以下过程
1.编译器查看对象变量的声明类型和方法名,通过声明类型找到方法列表
2.编译器查看调用方法时提供的参数类型
3.如果方法由private,static和final修饰或者是构造器,编译器就可以确定调用哪一种方法,即采取静态绑定技术。如果不是上述情况,就使用动态绑定技术,执行后续过程
4.虚拟机提取对象的实际类型的方法表
5.虚拟机搜索方法签名
6.调用方法

11.java中是如何实现多态的?实现机制是什么?

java是借助方法的重写和重载实现多态性的。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。

在JVM中,对象的引用其实是指向一个句柄(handle)的指针,该句柄包含一对指针,一个指针指向一张表格,实际上该表格也有两个指针(一个指针指向包含了对象的方法表,另外一个指向对象类型,表明该对象所属的类型),另一个指针指向一块从java堆中分配的内存空间,该空间用于存储对象数据

java通过将子类对象引用赋值给父类对象的引用变量来实现动态方法调用,这种实现方式遵循的原则如下:

1.如果a是类A的一个引用,那么a可以指向类A的实例,或者是类A的子类实例
2.如果a是接口A的一个引用,那么a必须指向实现了接口A的一个类的实例
3.当父类对象引用变量引用子类对象时,被引用对象的类型决定了调用的方法,而不是引用变量的类型决定,但是这个被调用的方法必须是在父类中定义过的,即被子类重写的方法。

12.创建类的对象时,类中各成员的执行顺序是什么?

顺序如下

1.父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3.父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
4.执行父类构造方法
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
6.执行子类构造方法

13.如何调用内部类中的方法?

内部类是指在一个外部类的内部再定义一个类,内部类作为外部类的一个成员,并且依附于外部类而存在的。可以在一个外部类中定义多个内部类,这些内部类在逻辑上是一个整体,与外部类之间是从属关系。在内部类中可以访问外部类定义的私有成员。示例代码:

class Outer{
    private int size;
    public class Inner{
        public void doStuff(){
            size++;
            System.out.println(size);
        }
    }
    public 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值