面向对象/传值和传引用/java字符串长度限制因素

一.面向对象程序设计
定义:把现实世界中的事物抽象为 “对象” 进行程序设计
面向过程到面向对象的转变:编程的终极目标是解决问题,解决现实生活中的问题,人们一开始编程是对 基本数据类型 进行操作,但是有时候需要将几个数据项进行统一操作,例如一个学生的姓名,学号等数据,人们希望对每个学生的姓名学号进行统一操作,于是出现了C语言中的结构体,这相对于单纯的操作基本数据类型方便了许多,但是这还不够方便,人们不但把多个数据项集成在一起,而且还把对这些数据项的操作结合起来,这样极大的提高了代码的可重用性,也极大地降低了代码的耦合。
面向对象/传值和传引用/java字符串长度限制因素_第1张图片

何为对象? 对象是指有自己特性的任何事物,是类的一个实例,例如A的女朋友是一个对象,B的女朋友也是一个对象。

何为? 类是一个模板,它描述了一类对象的行为和状态。例如,女朋友就是一个类,这个类的属性有身高,体重等(数据域),特有的操作有吃饭,睡觉等(成员方法)。
类的结构:

class GirlFriend{
     
    private double height;   //数据域
    private double weight;
    static{
             //静态代码块
    }
    {
           //代码块
    }
    public GirlFriend(double height,double weight){
         //构造方法
         this.height = height;
         this.weight = weight;
    }
   public void eat(){
            //成员方法
   }
   public void sleep(){
     
   }
}

我们知道创建对象的操作为:类名 变量名 = new 类名();
但是在创建对象的过程中类代码的执行顺序是怎样的呢?

class GirlFriend{
     
    private double height;
    private double weight;
    static{
     
        System.out.println("静态代码块");
    }
    {
     
        System.out.println("代码块");
    }
    public GirlFriend(){
     
        System.out.println("构造方法");
    }
    public void eat(){
     
        System.out.println("成员方法");
    }
}
public class Test {
     
    public static void main(String[] args){
     
        new GirlFriend().eat();
    }
}
运行结果
========================================================
静态代码块
代码块
构造方法
成员方法
GirlFriend g = new GirlFriend();
1.GirlFriend.class加载入内存
2.声明一个GirlFriend类型引用g
3.在堆内存创建对象
4.给对象中的数据域默认初始化值
5.属性进行显式初始化
6.构造方法进栈,对对象的属性赋值,构造方法弹栈
7.将对象的地址赋给g

二.传值和传引用
传值:对于一些简单的基本数据类型参数传递应选择值传递

传引用实质上是将对象在堆内存中的地址赋给引用变量):对于一些比较复杂的对象参数传递应选择引用传递,因为对象的数据复杂且有不可预知性。但是在有些情况下需要传递对象,而不能单纯的传递对象的引用,比如接受参数的主体对于该对象所在的堆内存没有访问权限,这时候就需要进行对象传递。
三.基本数据类型的自动装箱和拆箱机制

如果一个基本类型值出现在需要对象的环境中,编译器会将基本类型值进行自动装箱;如果一个对象出现在需要基本类型值的环境中,编译器会将对象进行自动拆箱。

Integer intObject = new Integer(2);  <=>  Integer intObject = 2;(自动装箱)



Integer[] intArray = {
     1,2,3};
System.out.println(intArray[0] + intArray[1] + intArray[2]);(自动拆箱)

四.字符串
①字符串长度受什么限制
从源代码可以看出字符串类型底层是一个byte类型数组

private final byte[] value;
面向对象/传值和传引用/java字符串长度限制因素_第2张图片
String类中有很多个重载的构造方法,其中有几个是允许用户传入length来定义长度的
面向对象/传值和传引用/java字符串长度限制因素_第3张图片
由于length是int类型的,那么字符串长度限制是不是就是Integer.MAX_VALUE?我们通过一个例子来看
面向对象/传值和传引用/java字符串长度限制因素_第4张图片
这个用例的字符串长度大约是47万,远小于 2^31-1(Integer.MAX_VALUE),但是仍然报错“字符串长度过长”

常量池限制: 之所以会出现这个结果,是因为JVM规范对常量池有所限制。常量池中的每一种数据项都有自己的类型。其中string_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一组Unicode码点序列,这组码点序列最终会被初始化为一个String对象

CONSTANT_Utf8_info{
     
   u1 tag;
   u2 length;
   u1 byte[length];
}

u2表示长度为两个字节(16位)的无符号数, 所以字符串常量的长度不能超过2^15 - 1 = 65535. 最大值为65534

你可能感兴趣的:(类,编程语言,字符串,java)