第三章:面向对象(上)
1.对象的比较,即“==”和equals()方法,”==“用于比较两个变量的值是否相等,equals()用于比较两个对象的内容是否一致。
public
class
StringDemo4 {
public
static
void
main(String[] args) {
String s1 =
new
String(
"hello"
);
String s2 =
new
String(
"hello"
);
System.out.println(s1==s2);
//false
System.out.println(s1.equals(s2));
//true
String s3 =
new
String(
"hello"
);
String s4 =
"hello"
;
//在方法区有这个常量值
System.out.println(s3==s4);
//false
System.out.println(s3.equals(s4));
//true
String s5 =
"hello"
;
String s6 =
"hello"
;
System.out.println(s5==s6);
//true
System.out.println(s5.equals(s6));
//true
}
}
public
class
StringDemo5 {
public
static
void
main(String[] args) {
String s1 =
"hello"
;
String s2 =
"world"
;
String s3 =
"helloworld"
;
System.out.println(s3==s1+s2);
//false(s1和s2是两个变量是先开空间再拼接在一起,所以不和s3地址值一直)
System.out.println(s3.equals(s1+s2));
//true
System.out.println(s3==
"hello"
+
"world"
);
//true(因为"hello"和"world"是常量,所以先拼接再去找有没有这个拼接后的常量,发现有,s3所以相等)
System.out.println(s3.equals(
"hello"
+
"world"
));
//true
//通过反编译看源码,我们知道这里已经做好了处理
// System.out.println(s3=="helloworld");
// System.out.println(s3.equals("helloworld"));
}
}
2.A a=new A(”tom“);具体过程: 栈内存中定义句柄a,堆内存中创建A的对象,属性使用默认初始化的值,然后调用A的构造方法,进行属性的赋值(所以构造方法被调用时,对象已经产生),然后a指向A对象。
3.finalize()方法是在对象被当成垃圾从内存中释放前调用,而不是对象变成垃圾前调用。由于java的垃圾回收器不定时启动,所以不能确定什么时候调用finalize()方法。如果不启动,就不会调用finalize()。为此,java中提供了一个
System.gc()方法来强制启动垃圾回收器。
4.
所以我们不能在任何方法体内的变量声明为静态。
5.类是在第一次被使用的时候才被装载的,而不是在程序启动时就装载程序中所有可能要用到的类。static修饰的变量,方法,代码块都是和class绑定的,和对象的创建无关,所以无论创建几个对象,他们都只被执行一次。
6.当A类中的程序代码要用到B类的实例对象,而B类中的程序代码又要访问A类中的成员,将B当做A的内部类是很有效的解决办法。一个内部类可以访问它的外部类的成员,反之不成立。
class Outer
{
int out_i=100;
void test()
{
Inner in=new Inner();
in.display();
}
class Inner()
{
void display()
{
System.out.print(out_i);
}
}
}
class Demo
{
public static void main(String [] args)
{
Outer out=new Outer();
out.test();
}
}
(这里笨小葱想起一道笔试题,启动4个线程,对于整数i,2个线程每次+1操作,2个线程每次-1操作。当时就是使用的内部类的程序代码)
7内部类如何被外部引用,只需将内部类申明为pulic。
class Outer
{
private int size=10;
public class Inner
{
public void test()
{
System.out.print(size);
}
}
}
class Demo
{
public static void main(String [] args)
{
Outer out=new Outer();
Outer.Inner in=out.new Inner();
in.test();
}
}