Java 基础(1)

一、Java基础
1、java基本数据类型和引用类型
1.基本数据类型:

整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean

其中:

byte占一个字节
short、char占两个字节
int、float占四个字节
double、long占8个字节
boolean只有true和false。

2.引用数据类型:
类、 接口、 数组、 枚举、 注解

例如,String类型就是引用类型,还有Double,Byte,Long,Float,Char,Boolean,Short(注意这里和基本类型相比首字母是大写),简单来说,所有的非基本数据类型都是引用数据类型。

3.基本数据类型和引用数据类型区别
3.1 存储位置

  • 基本数据类型:在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的

  • 引用数据类型:引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址

public class Main{
   public static void main(String[] args){
       //基本数据类型
       int i=1;
       double d=1.2;
       //引用数据类型
       String str="helloworld";
   }
}

3.2 传递方式

  • 基本数据类型:在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的
  • 引用数据类型:调用方法时作为参数是按引用传递的

4.自动装箱,自动拆箱

  equals 和 ==
equals和==的区别

==:基本类型比较值,引用类型比较对象的地址。

equals:是object自带的对比方法,基本类型无法使用,只能用于对象。默认也是用的==,比较两个对象的地址值。但是equals可以重写,例如String类就已经改写了equals方法,只要字符串内容相同,就返回true。

// Object 的 equals方法
public boolean equals(Object obj) {
    return (this == obj);
}

// String 的 equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
            if (v1[i] != v2[i])
                return false;
            i++;
        }
        return true;
    }
}
return false;

代码1:

int a =1 ;
int b =1 ;
System.out.println(a == b);

String s1 ="123";
String s2 ="123";
System.out.println(s1 == s2);

String s3 = new String("123");
System.out.println(s2 == s3);

运行结果:true,true,false
解析:对于基本数据类型来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的"123" 都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。

代码2:

Integer a =127 ;
Integer b =127 ;
System.out.println(a == b);

Integer m =128 ;
Integer n =128 ;
System.out.println(a == b);

运行结果:true,false
解析:对于基本数据的包装类型(Byte, Short, Character, Integer, Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。
因为Integer在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。

equals和hashcode的关系?
默认情况下,equals相等,hashcode必相等,hashcode相等,equals不是必相等。hashcode基于内存地址计算得出,可能会相等,虽然几率微乎其微。

3、static关键字

在类中,用static声明的成员变量为静态成员变量,也成为类变量。static修饰的成员方法为静态方法。静态变量的生命周期和类相同。

这里要强调一下:

普通成员变量和成员方法,从属于对象

静态成员变量和静态方法,从属于类

3.1.static关键字的用途

一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。

被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

3.2.static方法
由于静态方法不依赖于任何对象就可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,既然都没有对象,就谈不上this了,并且由于此特性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。反之,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。
特别说明:static方法是属于类的,非实例对象,在JVM加载类时,就已经存在内存中,不会被虚拟机GC回收掉,这样内存负荷会很大,但是非static方法会在运行完毕后被虚拟机GC掉,减轻内存压力。

3.3.static变量

静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化。非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

3.4.静态变量和成员变量的区别
(1)所属不同:静态变量属于类,为类变量;成员变量属于对象,称为对象变量
(2)内存中位置不同:静态变量位于方法区中的静态区,成员变量存储于堆内存
(3)生命周期不同:成员变量随着实例对象创建而存在,随着实例对象被回收而消失。静态变量随着类的加载而存在,随着类的消失而消失。
(4)调用不同:静态变量可以通过类名调用,也可以通过对象名调用,成员变量只能通过对象名调用

所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

3.5. static代码块
     static{
        System.out.println("静态代码块");  
	}      

执行时机:静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,就会按照书写的顺序执行。

静态代码块的作用:一般情况下,如果有些代码需要在项目启动的时候执行,这时就需要静态代码快,比如一个项目启动需要加载很多配置文件等资源,就可以都放在静态代码块中。

执行顺序:.静态代码块>构造代码块>构造函数

4、final关键字
可以声明成员变量、方法、类以及本地变量
final 成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误
final 变量是只读的
final 申明的方法不可以被子类的方法重写
final 类通常功能是完整的,不能被继承
final 变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销
final 关键字提高了性能,JVM 和 Java 应用都会缓存 final 变量,会对方法、变量及类进行优化
方法的内部类访问方法中的局部变量,必须用 final 修饰才能访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值