java基础之一 对象,接口

来源:互联网 发布:python库中文 编辑:程序博客网 时间:2024/06/03 05:18

一、==和equals的区别

==:

  • 基本类型,值相等即返回true
  • 引用类型:比较栈(stack)内存地址是否相等,相等即可返回true(string和integer除外,由于两个对象在jvm中存储不同)

equals:

  • 不能比较基本类型,只能比较两个对象,堆(heap)内存中的值是否相等,如果相等返回true
  • 一般需要自定义,重写该方法,主要有业务决定
int t1=1;int t2=2;Person p1=new Person();Person p2=new Person();t1==t2 //truep1==p2 //falsep1.equals(p2) //true

此处重点说明string和integer对象

String内存位置说明

  • 显式的String常量
    详解string内存空间
    String a1 = “holten”;
    String b1 = “holten”;
    第一句代码执行后就在常量池(java7前在方法区中,java7后移至对堆里)中创建了一个值为holten的String对象;
    第二句执行时,因为常量池中存在holten所以就不再创建新的String对象了。
    此时该字符串的引用在虚拟机栈里面。
    另外:
    String s1=”a”;
    String s2=s1+”b”;
    System.out.println(s2==”ab”);//输出false
    这里s2地址和”ab”地址不一致,所以输出false

String对象
String a2 = new String(“holtenObj”);
String b2 = new String(“holtenObj”);
Class被加载时就在常量池中创建了一个值为holtenObj的String对象,第一句执行时会在堆里创建new String(“holtenObj”)对象;
第二句执行时,因为常量池中存在holtenObj所以就不再创建新的String对象了,直接在堆里创建new String(“holtenObj”)对象。

此时:a1==b1  //true  常量池值不变a2==b2 //false 比较栈内存地址a1.equals(b1) //true 比较string对象值a2.equals(b2) //true 比较new string()对象在堆内存中的值

integer:
在interger类中,为了初始化方便,提供-128-127之间的数创建对象时直接创建在常量池中,其他对象会建立堆内存中

integer t1=new integer(1);integer t2=new integer(1);integer t3=new integer(128);integer t4=new integer(128);Integer c = 3;    Integer d = 3;c==d //true jvm底层在常量池建立一个integer对象c.equals(d) //true 值相等t1==t2 //truet1.equals(t2) //truet3==t4  //false 地址不一致t3.equals(t4) //true 堆内存中对象值相等int i=2017Integer j=2017;i==j  //true  i.equals(j) //true  实际对象值相等

接口和抽象类的区别

共同点:
都不能创建实例化对象,且可包含抽象方法
不同点:
第一:从接口和类的角度

  1. 中可以有静态方法普通方法的实现,静态变量普通变量构造器普通代码块,而接口都没有
  2. 接口可以支持实现多个接口,类不能多继承。

第二:从设计思想的角度

  1. 接口体现一种规范,系统的总览,规定了实现者向外提供的服务,规定了调用者可以调用的方法和如何访问该方法
  2. 抽象类体现一种模板式设计,即多个子类调用同一个父类,可以作为系统实现过程中的中间产品,这个产品已经实现了部分功能,但是又有部分功能没有实现,即这个产品不是最终产品。