Java初学者都必须知道的六大问题

合集下载

Java面试中最经常被问到的问题

Java面试中最经常被问到的问题

Java面试中最经常被问到的问题1. What is the difference between an Applet and an Application?2. What are java beans?3. What is RMI?4. What gives java it's "write once and run anywhere" nature?5. How does Java inheritance work?6. What are native methods? How do you use them?7. Class A subclass B subclass C. All override foo(). I cast C to A and call foo(). What happens? C an C call A->foo()?8. What does the "static" keyword mean in front of a variable? A method? A class? Curly braces {}?9. How many different types of JDBC drivers are present? Discuss them.10. Does Java have "goto"?11. Why "bytecode"? Can you reverse-engineer the code from bytecode?12. How does exception handling work in Java?13. Does Java have destructors?14. What does the "final" keyword mean in front of a variable? A method? A class?15. Access specifiers: "public", "protected", "private", nothing?3. What is RMI?4. What gives java it's "write once and run anywhere" nature?5. How does Java inheritance work?6. What are native methods? How do you use them?7. Class A subclass B subclass C. All override foo(). I cast C to A and call foo(). What happens? C an C call A->foo()?8. What does the "static" keyword mean in front of a variable? A method? A class? Curly braces {}?9. How many different types of JDBC drivers are present? Discuss them.10. Does Java have "goto"?11. Why "bytecode"? Can you reverse-engineer the code from bytecode?12. How does exception handling work in Java?13. Does Java have destructors?14. What does the "final" keyword mean in front of a variable? A method? A class?15. Access specifiers: "public", "protected", "private", nothing?1. What is the difference between an Applet and an Application?A Java application is made up of a main() method declared as public static void that accepts a string array argument, along with any other classes that main() calls. It lives in the environment that the host OS provides.A Java applet is made up of at least one public class that has to be subclassed from java.awt. Applet. The applet is confined to living in the user's Web browser, and the browser's security rules, (or Sun's appletviewer, which has fewer restrictions).The differences between an applet and an application are as follows:1. Applets can be embedded in HTML pages and downloaded over the Internet whereas Applicatio ns have no special support in HTML for embedding or downloading.2. Applets can only be executed inside a java compatible container, such as a browser or appletvie wer whereas Applications are executed at command line by java.exe or jview.exe.3. Applets execute under strict security limitations that disallow certain operations(sandbox model security) whereas Applications have no inherent security restrictions.4. Applets don't have the main() method as in applications. Instead they operate on an entirely diff erent mechanism where they are initialized by init(),started by start(),stopped by stop() or destroye d by destroy().2. What are java beans?JavaBeans is a portable, platform-independent component model written in the Java programming language, developed in collaboration with industry leaders. It enables developers to write reusable components once and run them anywhere -- benefiting from the platform-independent power of Ja va technology. JavaBeans acts as a Bridge between proprietary component models and provides a seamless and powerful means for developers to build components that run in ActiveX container ap plications.Java beans is very powerful tool you can use in your servlet/JSP bridge. You can use the servlets t o build the bean and can be passed over to the JSP for reading. This provides tight encapsulation o f the data while preserving the sanctity of servlets and JSP.3. What is RMI?RMI stands for Remote Method Invocation. Traditional approaches to executing code on other ma chines across a network have been confusing as well as tedious and error-prone to implement. The nicest way to think about this problem is that some object happens to live on another machine, an d that you can send a message to the remote object and get a result as if the object lived on your lo cal machine. This simplification is exactly what Java Remote Method Invocation (RMI) allows yo u to do.4. What gives java it's "write once and run anywhere" nature?Java is compiled to be a byte code which is the intermediate language between source code and m achine code. This byte code is not platorm specific and hence can be fed to any platform. After bei ng fed to the JVM, which is specific to a particular operating system, the code platform specific m achine code is generated thus making java platform independent.5. How does Java inheritance work?A class can only directly extend one class at a time. Multiple inheritance is only allowed with rega rd to interfaces. A class can implement many interfaces. But a class can only extend one non-interf ace class.6. What are native methods? How do you use them?Native methods are used when the implementation of a particular method is present in language ot her than Java say C, C++.To use the native methods in java we use the keyword nativepublic native method_a()This native keyword is signal to the java compiler that the implementation of this method is in a la nguage other than java.Native methods are used when we realize that it would take up a lot of rework to write that piece o f already existing code in other language to java.7. Class A subclass B subclass C. All override foo(). I cast C to A and call foo(). What happens? C an C call A->foo()?An instance of Class C is of type Class B and A (both). SO you can cast C to A. You CANNOT ca st an instance of A to C.8. What does the "static" keyword mean in front of a variable? A method? A class? Curly braces {}?-- static variables: These are class level variable whose value remain same irrespective of the num ber of instances of the class.-- static methods:These are those methods that can be called without the need for creating the objects of the class i.e . they are class level methods. They can call only static methods. They cannot refer to "this" as the y are not associated with any particular instance.-- static block: These are called before the main is called and are called only once. Subsequent inv ocation of the java program containing static block would not call it again. Hence, they can be use d to load libraries say in native function call.-- Only Inner class could be declared as a "static". This declaration suppress the generation of the r eference to the outer class object. 这意味着:1)为创建一个static内部类的对象,我们不需要一个外部类对象;2)不能从static内部类对象访问一个外部类对象。

java中遇到的问题和解决方案

java中遇到的问题和解决方案

java中遇到的问题和解决方案
目录
1. Java中遇到的问题
1.1 内存溢出问题
1.2 死锁问题
2. 解决方案
2.1 内存溢出问题的解决方案
2.2 死锁问题的解决方案
Java中遇到的问题
在Java编程过程中,经常会遇到各种各样的问题,其中两个比较常见的问题是内存溢出和死锁问题。

内存溢出问题是指程序在运行过程中申请的内存超过了系统能够分配给它的内存大小,导致程序崩溃。

这种问题通常发生在程序中频繁创建大量对象或者持续运行时间过长的情况下。

死锁问题则是指多个线程互相持有对方所需要的资源,导致彼此无法继续执行,进而导致程序无法正常运行。

死锁问题通常发生在多线程编程中,处理不当时很容易出现。

解决方案
针对内存溢出问题,可以通过一些方法来解决,比如增加堆内存大小、优化程序代码以减少内存占用、及时释放不再使用的对象等。

另外,可以使用一些工具来监控程序内存使用情况,及时发现并解决潜在的内存溢出问题。

对于死锁问题,可以通过合理地设计程序逻辑、避免使用过多的同步代码块、避免嵌套锁等方法来预防死锁的发生。

此外,可以使用一些工具来帮助检测程序中潜在的死锁问题,并及时处理。

综上所述,如果在Java编程过程中遇到内存溢出或死锁问题,可以通过上述方法来解决,确保程序的稳定运行。

JAVA基础知识重难点

JAVA基础知识重难点

JAVA基础知识重难点声明:以下内容为个⼈期末对JAVA基础知识的总结,来源于各种资料搜索和个⼈理解整理⽽出,也许有不妥的地⽅,欢迎学习指教1.Java语⾔具有可移植性、可跨平台运⾏特点的原因是什么?Java——编译器——jvm——平台Java⽤编译器编译成.class的字节码⽂件,字节码类似于机器指令,同⼀字节码可以在任何带jvm虚拟机的平台运⾏,从⽽实现java的跨平台性。

所谓语⾔的跨平台性并不是说是源⽂件的跨平台性(如果要这么定义那么任何的语⾔都是跨平台性的),⽽是指源⽂件编译⽣成的⽂件的跨平台性。

因为Java字节码是结构中⽴的,所以Java 的程序是可移植的。

他们可以不经过重新编译⽽在任何⼀个机器上运⾏。

2.为什么说Java语⾔具有健壮、安全的特性?Java 编译器检测出许多别的语⾔只有在⾸次执⾏的时候才会指出的问题。

Java 已经清除了⼏种在其它语⾔中被发现易于出错的编程结构。

Java具有运⾏时异常处理特性,垃圾回收机制,它为健壮性提供了编程⽀持。

Java 实现了⼏种安全机制以保护你的系统遭受危险程序的破坏。

3.简述Java虚拟机(JVM)的作⽤是什么?JVM就是Java虚拟机,它是⼀个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。

JVM有⾃⼰完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。

JVM是java字节码执⾏的引擎,还能优化java字节码,使之转化成效率更⾼的机器指令。

Java程序的跨平台特性主要就是因为JVM 实现的。

在编译java程序时会将写好的源程序通过编译器编译⽣成.class⽂件(⼜称为字节码⽂件),不同的平台对应着不同的JVM,之后就是通过JVM内部的解释器将字节码⽂件解释成为具体平台上的机器指令执⾏,所以就可以实现java程序的跨平台特性。

4.简述JVM的垃圾回收机制。

确保被引⽤对象的内存不被错误的回收。

当⼀个对象不再有任何⼀个引⽤变量指向它时,这个对象就被应⽤抛弃。

Java面试宝典(2020版)

Java面试宝典(2020版)

Java⾯试宝典(2020版)⼀、Java 基础1. JDK 和 JRE 有什么区别?JDK:Java Development Kit 的简称,java 开发⼯具包,提供了 java 的开发环境和运⾏环境。

JRE:Java Runtime Environment 的简称,java 运⾏环境,为 java 的运⾏提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的⼯具。

简单来说:如果你需要运⾏ java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

2. == 和 equals 的区别是什么?== 解读对于基本类型和引⽤类型 == 的作⽤效果是不同的,如下所⽰:基本类型:⽐较的是值是否相同;引⽤类型:⽐较的是引⽤是否相同;代码⽰例:1 String x = "string";2 String y = "string";3 String z = new String("string");4 System.out.println(x==y); // true5 System.out.println(x==z); // false6 System.out.println(x.equals(y)); // true7 System.out.println(x.equals(z)); // true代码解读:因为 x 和 y 指向的是同⼀个引⽤,所以 == 也是 true,⽽ new String()⽅法则重写开辟了内存空间,所以 == 结果为 false,⽽equals ⽐较的⼀直是值,所以结果都为 true。

equals 解读equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals ⽅法,把它变成了值⽐较。

Java初学者的30个常见问题

Java初学者的30个常见问题

Java初学者的30个常见问题Java初学者的30个常见问题大家在学习Java语言时都遇到过哪一些问题呢?本文回答了30个Java入门级初学者的常见问题。

希望可以帮助到大家!我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么Java库不用随机pivot方式的快速排序?1.2 基本数据类型Q. 为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号)A. 在Java里,整数是用补码表示的。

在补码中0只有一种表示方法。

另一方面,浮点数则是用IEEE 标准表示的, 对于0有两种表示方法, 0 和 -0。

Q. 我可以用 % 除以一个小数吗?A. 当然可以。

比如,如果 angle 是一个非负数,那么 angle % (2 * Math.PI) 就会把 angle 转换到 0 到2 π 之间。

Q. 当 a b 都是基本类型变量时,a += b 和 a = a + b 的效果有区别吗?A. 当 a 和 b 的类型不同时,那两条语句的效果就可能有区别。

a += b 等同于 a = (int) (a + b),这种情况下可以是 a是int型,b是float型。

但是同等情况下 a = a + b 就会编译报错。

1.3 条件语句和循环语句Q. 为什么判断字符串相等不能使用 == ?A. 这反映了基础类型(int, double, boolean)和引用类型(String)的区别。

Q. 有没有在什么情况下,一条语句块的花括号不能省略的?A. 在下面的例子中,第一段代码是合法的,第二段代码会引发编译错误。

从技术角度说,那一条语句是一个变量声明,而不是语句,所以会报错。

// legal for (int i = 0; i <= N; i++) { int x = 5; } // illegal for (int i = 0; i <= N; i++) int x = 5;Q. 在下面的两段代码里,有没有情况,它们的效果不一样?for ( ; ) { } ; while () { }A. 有的。

java开发坑点解析

java开发坑点解析

java开发坑点解析
Java开发中可能遇到的一些坑点包括但不限于以下几个方面:
1. 内存管理,Java使用自动内存管理,但是开发人员仍然需
要注意内存泄漏和内存溢出的问题。

特别是在处理大量数据或者长
时间运行的程序时,需要特别注意及时释放不再使用的对象,避免
内存泄漏。

2. 并发编程,Java中的多线程编程是一个常见的坑点。

开发
人员需要注意线程安全、死锁、竞态条件等问题。

合理地使用同步
机制和锁是避免这些问题的关键。

3. 性能优化,Java作为一种解释型语言,性能优化是一个常
见的挑战。

开发人员需要注意避免过多的对象创建、避免不必要的
循环和递归等,以提升程序的性能。

4. 异常处理,Java中的异常处理是一个需要特别注意的地方。

合理地捕获和处理异常,避免出现未捕获的异常导致程序崩溃是非
常重要的。

5. 版本兼容性,随着Java的不断更新,不同版本之间可能存在一些API的改动,开发人员需要注意不同版本之间的兼容性,以免出现因为版本问题导致的程序不稳定或者不可用。

总的来说,Java开发中的坑点需要开发人员具备扎实的编程基础和丰富的经验,同时需要不断学习和积累,保持对新技术的关注和学习,以应对各种挑战。

同时,良好的编码习惯和团队协作也是避免坑点的重要手段。

希望以上内容能够对你有所帮助。

java面试问题及回答

java面试问题及回答

java面试问题及回答java面试问题及回答一1.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。

与此相对,方法覆盖是说子类重新定义了父类的方法。

方法覆盖必须有相同的方法名,参数列表和返回类型。

覆盖者可能不会限制它所覆盖的方法的访问。

2.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?当新对象被创建的时候,构造函数会被调用。

每一个类都有构造函数。

在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

Java中构造函数重载和方法重载很相似。

可以为一个类创建多个构造函数。

每一个构造函数必须有它自己唯一的参数列表。

Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

3.Java支持多继承么?不支持,Java不支持多继承。

每个类都只能继承一个类,但是可以实现多个接口。

4.接口和抽象类的区别是什么?Java提供和支持创建抽象类和接口。

它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。

而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类类如果要实现一个接口,它必须要实现接口声明的所有方法。

但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java接口中声明的变量默认都是final的。

抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。

抽象类的成员函数可以是private,protected或者是public。

接口是绝对抽象的,不可以被实例化。

抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

Java Web开发中的常见问题汇总与解决方案

Java Web开发中的常见问题汇总与解决方案

Java Web开发中的常见问题汇总与解决方案Java Web开发是现在互联网行业中非常热门的技术方向之一,它的发展势头也是越来越迅猛。

然而,在开发Java Web应用程序的过程中,总会遇到各种各样的问题,有的是因为技术不够熟练导致的,有的是由于环境不同而产生的。

为了让大家更好地掌握Java Web开发,本文将为您汇总整理了一些Java Web开发中常见的问题,并提供相应的解决方案。

一、数据访问异常在Java Web开发中,我们经常会遇到与数据库相关的异常。

尤其是在开发大型系统时,访问数据库的错误可能会成倍地影响系统的性能和可靠性。

以下列举一些常见的数据访问异常和解决方案。

1、连接池过期连接池过期是一个非常常见的问题,尤其是在系统高并发的情况下,会造成系统性能的明显下降。

解决方法是通过合理的配置和优化连接池的使用,提高系统的吞吐量和稳定性。

2、防止数据库死锁死锁是在高并发系统中经常遇到的问题之一。

如果多个线程并发访问数据库的同一个资源,就有可能导致死锁的产生。

要解决这个问题,可以通过使用数据库的锁机制来避免死锁的产生。

3、被动连接关闭一些数据库和Java ORM框架对于空闲连接资源的回收策略不同,可能会导致被动关闭连接的情况发生。

解决方案是做好连接池的配置和优化,避免过度的空闲连接资源占用。

二、Web服务器异常Java Web开发中的Web服务器异常也是非常常见的问题。

以下列举一些常见的Web服务器异常和解决方案。

1、多线程并发处理异常在高并发的情况下,Web服务器可能会产生并发处理异常,这种情况下就需要通过合理的代码设计和服务器配置来保证系统的性能和稳定性。

2、内存溢出和内存泄漏内存溢出和内存泄漏是很多Java Web开发者常常碰到的问题。

要解决这个问题,可以通过调整JVM内存参数,优化代码的编写和设计,避免无意中创建了对象并长时间占用内存资源。

3、负载均衡异常Java Web应用程序在高并发的情况下,可能会导致负载均衡的异常。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题四:final 关键字到底修饰了什么?
final 使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”, 使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象 不变。
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable"); final StringBuffer b=new StringBuffer("not immutable"); a=b;//编译期错误
String string = s;
我们是声明了另外一个只能指向 String 对象的引用,名为 string,并没有 第二个对象产生,string 还是指向原来那个对象,也就是,和 s 指向同 一个对象。
问题二:"=="和 equals 方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只 不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不 需要初始化。
问题六:instanceof 是什么东东?
instanceof 是 Java 的一个二元操作符,和==,> , <是同一类东东。由 于它是由字母组成的,所以也是 Java 的保留关键字。它的作用是测试 它左边的对象是否是它右边的类的实例,返回 boolean 类型的数据。 举个例子:
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable"); a.append(" broken!"); //编译通过
可见,final 只对引用的“值”(也即它所指向的那个对象的内存地址)有效, 它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译 期错误。至于它所指向的对象的变化,final 是不负责的。这很类似== 操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的 对象内容是否相等,==操作符是不管的。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都 new 一个 String。例如我们要在构造器中对一个名叫 s 的 String 引用变量 进行初始化,把它设置为初始值,应当这样做:
public class Demo { private String s; ... public Demo { s = "Initial Value"; } ... }
instanceof 有一些用处。比如我们写了一个处理账单的系统,其中有这样 三个类:
public class Bill {//省略细节} public class PhoneBill extends Bill {//省略细节} public class GasBill extends Bill {//省略细节}
int 类型变量默认初始值为 0
float 类型变量默认初始值为 0.0f
double 类型变量默认初始值为 0.0
boolean 类型变量默认初始值为 false
char 类型变量默认初始值为 0(ASCII 码)
long 类型变量默认初始值为 0
所有对象引用类型变量默认初始值为 null,即不指向任何对象。注意数组 本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是 null。
int a=10; int b=10;
则 a==b 将是 true。
但不好理解的地方是:
String a=new String("foo"); String b=new String("foo");
则 a==b 将返回 false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在 的内存地址,而不是对象本身。a 和 b 都使用了 new 操作符,意味着 将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自 然位于不同的内存地址。a 和 b 的值其实是两个不同的内存地址的值, 所以使用"=="操作符,结果会是 false。诚然,a 和 b 所指的对象,它 们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象 内容的比较。
String s = "I AM an Object!"; boolean isObject = s instanceof Object;
我们声明了一个 String 对象引用,指向一个 String 对象,然后用 instancof 来测试它所指向的对象是否是 Object 类的一个实例,显然,这是真的, 所以返回 true,也就是 isObject 的值为 True。
至于为什么要把 String 类设计成不可变类,是它的用途决定的。其实不 只 String,很多 Java 标准类库中的类都是不可变的。在开发一个系统 的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这 也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象 是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺 点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的 问题。所以 Java 标准类库还提供了一个可变版本,即 StringBuffer。
看一下一个极端的类:
Class Monster{ private String content; ... boolean equals(Object another){ return true;}
}
我覆盖了 equals 方法。这个实现会导致无论 Monster 实例内容如何,它 们之间的比较永远返回 true。
理解 final 问题有很重要的含义。许多程序漏洞都基于此----final 只能保证 引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的 操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的 修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法 就是在此对象新建的时候把它声明为 final,意图使得它“永远不变”。
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且
没有意义,因为 String 对象不可改变,所以对于内容相同的字符串, 只要一个 String 对象来表示就可以了。也就说,多次调用上面的构造 器创建多个对象,他们的 String 类型属性 s 都指向同一个对象。 上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java 认为它们代表同一个 String 对象。而用关键字 new 调用构造器,总是 会创建一个新的对象,无论内容是否相同。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为 String 的任何对象,目前指向"Hello world!"这个 String 类型的对象。这就是 真正发生的事情。我们并没有声明一个 String 对象,我们只是声明了 一个只能指向 String 对象的引用变量。所以,如果在刚才那句语句后 面,如果再运行一句:
条初始化语句会被执行,不会发生使用前未被初始化的事情。对于 try-catch 也是一样,如果只有在 try 块里才有初始化语句,编译部通过。 如果在 catch 或 finally 里也有,则可以通过编译。总之,要保证局部 变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们 的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的 默认值吧!
所以当你是用 equals 方法判断对象的内容是否相等,请不要想当然。因 为可能你认为相等,而这个类的作者不这样认为,而类的 equals 方法 的实现是由他掌握的。如果你需要使用 equals 方法,或者使用任何基பைடு நூலகம்于散列码的集合(HashSet,HashMap,HashTable),请察看一下 java doc 以确认这个类的 equals 逻辑是如何实现的。
对于这个系列里的问题,每个学 Java 的人都应该搞懂。当然,如果只是学 Java 玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些 问题,请将你自己重归初学者行列。
问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是: 一个 String,内容是“Hello world!”。这样模糊的回答通常是概念不清 的根源。如果要准确的回答,一半的人大概会回答错误。
对于两种不同的类属性,static 属性与 instance 属性,初始化的时机是不 同的。instance 属性在创建实例的时候初始化,static 属性在类加载, 也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不 再次进行初始化。这个问题会在以后的系列中进行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试 图使用它,编译器会抗议。如果初始化的语句在 try 块中或 if 块中, 也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始 化语句放在只有 if 块的条件判断语句中编译器也会抗议,因为执行的 时候可能不符合 if 后面的判断条件,如此一来初始化语句就不会被执 行了,这就违反了局部变量使用前必须初始化的规定。但如果在 else 块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一
对象内容的比较,正是 equals 方法做的事。
看一下 Object 对象的 equals 方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object 对象默认使用了==操作符。所以如果你自创的类没有覆盖 equals 方法,那你的类使用 equals 和使用==会得到同样的结果。同样也可以 看出,Object 的 equals 方法没有达到 equals 方法应该达到的目标:比 较两个对象内容是否相等。因为答案应该由类的创建者决定,所以 Object 把这个任务留给了类的创建者。
相关文档
最新文档