JAVA笔记六:继承(二)

一、访问控制修饰符

1、private:仅对本类可见

2、public:对外部完全可见

3、protected:对本包与所有子类可见

4、对本包可见,不需要修饰符

二、hashCode方法

散列码(hash Code)是由对象导出的一个整型值

公式如下:

        s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

String类使用以下算法计算散列码

int hash = 0;
String Str;
for (int i = 0;i<Str.length();i++)
     hash = 31*hash +Str.charAt(i);
//charAt(int index)返回index索引处的字符

 hashCode方法定义在Object类,每一个对象都有一个默认的散列码,其值由对象的存储地址得出。

三、toString方法

toString方法是object中一个重要的方法,它会返回表示对象值的一个字符串。

例1、以数组为例

import cn.edu.abc.corejava.*;
import java.util.Arrays;
public class hello_world{
    public static void main(String[] args){
        int[] A ={1,2,3};
        String S = Arrays.toString(A);
        System.out.println(Arrays.toString(A)+"\n"+S.length());
      
    }
}

注意:字符串长度为9,而不是7,因为元素之间用逗号和空格(“, ”)分割。

 多维数组可以利用Arrays.deepToString方法

 四、泛型数组列表

 一般来说,数组必须在编译时确定整个数组的大小,难以动态的更改数组。使用Java中的另一个类,名为ArraysList,其类似与数组,但在添加或删除元素时,它能够自动的调整数组容量。

需要注意的一点是:<>中不能为基本数据类型

声明:

1、ArrayList<类名> 类对象名 = new ArrayList<类名>();

2、var 类对象名 = new ArrayList<类名>();//Java10中

方法:

  • ArrayList<E>()        //构造一个空数组列表
  • ArrayList<E>(int initialCapacity)    //构造一个指定容量的空数组列表
  • boolean add(E obj)  //在数组列表的末尾追加一个元素,永远返回ture
  • int size()                   //返回列表中的元素个数
  • void trimToSize()      //将数组列表存储容量削减到当前大小

访问数组列表元素的方法:

  • E set(int index,E obj)        //将值obj放在指定的索引位置,返回之前的内容
  • E get(int index)                 //得到指定索引位置存储的值
  • void add(int index,E obj)   //后移元素从而将obj插入到指定的索引位置
  • E remove(int index)          //删除指定位置的元素,并将后面的所有元素前移,返回删除的元素

注意:数组列表声明时的容量与数组大小(size()方法)的区别,实际元素个数不同实际元素个数可能超过容量。初始构造的数组列表的size为0。

import java.util.*;
public class AA12_21 {
    public static void main(String args[])
    {
        var list = new ArrayList<Employee>(10);
        while(list.size()<17)
        {
            var x = new Employee("员工"+list.size());
            list.add(x);
        }
        System.out.println(list);
        System.out.println(list.get(16).getName());
    }
}

虽然构造的list的容量为10,初始时size为0,add追加1个元素后list.size()=1,最终size值为17,即list中有17个元素。注意:list.get()、set()索引从0开始。

五、对象包装器与自动装箱

有时候需将int等基本数据类型转换为对象。所有的基本类型都有一个对应的类。

(1)、包装器

如Integer对应int,而这些类(Integer)被称为包装器(wrapper)。

包装器类是不可改变的,即一旦构造的包装器,就不允许更改包装在其中的值。同时,包装器类是final,因此无法派生其子类。

//因为其<>中无法使用基本数据类型,所有要使用包装器

var list = new ArrayList<Integer>();

应当注意:由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远低于int[]数组。

(2)、自动装箱

虽然数值被包装在对象中,但可以使用add的方法,向ArrayList<Integer>添加int类型的元素

 自动装箱:

        list.add(3);

将自动的变换成

        list.add(Ineger.valueOf(3));

 形如以上的变换方式称为自动装箱。

当将一个Integer对象赋给int值时,将会自动拆箱

自动拆箱:

        int n = list.get(i);

转换为

        int n = list.get(i).valueOf();

 需要强调的是:装箱与拆箱只是编译器的工作,而不是虚拟机。编译器在生成类的字节码时会插入必要的方法调用。虚拟机只是执行这些字节码。

使用数值包装器的好处是,可以将一个数字字符转换为数值。

//将字符串转换为整形

int x = Integer.parseInt(s);

int x = Integer.valueOf(s);

//将整形转换为字符串

String s = Integer.toString(x);

String s = Integer.valueOf(x);

 这里的parseInt与Integer对象没有任何关系,parseInt是一个静态方法。而Integer是放置该方法的好地方。

六、参数数量可变的方法

Java使用省略号来声明可变参数。“...”是Java代码中的一部分,它表明这个方法可以接收任意数量的变量。

 double n = (max(1,2,3,4,5,6,7,88));  
 public static double max(double...value)
    {
        double x = Double.NEGATIVE_INFINITY;//负无穷
        for(double element:value)
            if(element>x)
                x = element;
                return x;

    }

七、枚举类

使用关键字enum定义枚举类。

public enum Size{SMALL,MEDIUM,LARGER};

//这个声明定义的类型是个类,刚好有三个实例,不能构造新的对象

 比较两个枚举类的值时,使用"=="比较,并不需要调用equals。

如果需要的话,可以为枚举类型增加构造器、方法、字段。枚举的构造器总是是私有的,构造器只能在构造枚举常量时调用。在构造器前的修饰符private可以省略。

public enum Size
    {
        SMALL("S"),MEDIUM("M"),LARGER("L");//调用构造器构造的三个枚举常量
        private String abb;
        private Size(String abb)//私有
        {
            this.abb = abb;
        }
        public String getAbb()
        {
            return abb;
        }
    }

所有枚举类都是Enum的子类,他们继承了这个类的许多方法: 

values方法:返回一个包含全部枚举值的数组。

static Enum valueOf(Class enumClass,String name):返回给定类中指定名字的枚举常量。

String toString():返回枚举常量名。

int ordinal():返回枚举常量在enum声明的位置,位置从0开始。

int compareTo(E other):如果枚举类出现在other之前,返回一个负整数,若this==other,返回0,否则返回一个正整数。枚举常量的出现次序在enum声明中指出。

 Size.SMALL.toString();        //返回字符串“SMALL”

 Size s = Enum.valueOf(Size.class,"SMALL");        //将s设置成Size.SMALL

Size[] values = Size.values();        //返回一个包含一个枚举值的数组Size.SMALL...
Size.SMALL.ordinal();        //返回SMALL常量的位置0

猜你喜欢

转载自blog.csdn.net/m0_61598337/article/details/128334164