<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、abstract class 和 interface的区别</span>
interface是抽象类的一种特例,接口中所有的方法都必须是抽象的。接口中方法的定义默认为public abstract类型,接口中的成员变量类型默认为public static final
package com.pp;
/*
* 变量初始化的顺序
* 静态方法和变量先加载且只加载一次
*/
public class Cc {
int radius = prt("初始化radius");
int t= prt("初始化t");
static int s = prt("初始化s");
{System.out.println("初始化块");}
static{
System.out.println("静态初始化块");
}
public Cc(){
System.out.println("构造方法加载");
}
private static int prt(String string) {
System.out.println(string);
return 0;
}
public static void main(String[] args) {
Cc cc1= new Cc();
Cc cc2= new Cc();
}
}
打印结果为
初始化s
静态初始化块
初始化radius
初始化t
初始化块
构造方法加载
初始化radius
初始化t
初始化块
构造方法加载
2、构造方法不一定是public
package com.shape;
import com.oo.tuXing;
public class Circle implements tuXing{
private double radius;
private static Circle circle;
public Circle() {
}
//
// private Circle(){
//
// }
//
//
public static Circle getInstance(){
if(null==circle)
circle = new Circle();
return circle;
}
@Override
public double cacuArea() {
return Math.PI*Math.PI*radius;
}
@Override
public double cacuCircle() {
return 2*Math.PI*radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
}
这里getInstance是只创建了一个对象,存在线程上的不安全
3、String和StringBuffer的区别
package com.test;
import java.util.Date;
/**
* 用StringBuffer的append方法效率高于字符串连接+
*
*/
public class Test02 {
public static void main(String[] args) {
//
Date date1 = new Date();
long begin1 = date1.getTime();
String str = "0 ";
for (int i = 1; i < 10000; i++) {
str += i+" ";
}
// System.out.println(str);
Date date1_2 = new Date();
long end1 = date1_2.getTime();
System.out.println("时间1:"+(end1 - begin1 )+" ");
Date date2 = new Date();
long begin2 = date2.getTime();
StringBuffer stringBuffer = new StringBuffer();
for(int i=0;i<10000;i++){
stringBuffer.append(i+" ");
}
Date date2_2 = new Date();
long end2 = date2_2.getTime();
// System.out.println(stringBuffer);
System.out.println("时间2:"+(end2 - begin2 )+" ");
}
}
运行结果如下
时间1:469
时间2:0
由此可见,StringBuffer的效率更高些,那原因是什么呢。很简单,因为只创建了一个StringBuffer
对象,而str被创建了10000次,每次用+连接时,str都被创建因为指向了不同的对象。
4、面向对象的一些理解
如下表达式: A a1 = new A();
它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。 在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。 再如: A a2;
它代表A是类,a2是引用,a2不是对象,a2所指向的对象为空null; 再如: a2 = a1;
它代表,a2是引用,a1也是引用,a1所指向的对象的地址传给了a2(传址),使得a2和a1指向了同一对象。
综上所述,可以简单的记为,在初始化时,“=”语句左边的是引用,右边new出来的是对象。 在后面的左右都是引用的“=”语句时,左右的引用同时指向了右边引用所指向的对象