ToB企服应用市场:ToB评测及商务社交产业平台

标题: JAVA底子 [打印本页]

作者: 美食家大橙子    时间: 2024-10-13 04:28
标题: JAVA底子
1.数据类型


变量就是申请内存来存储值。也就是说,当创建变量的时间,需要在内存中申请空间。
内存管理体系根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。


1.1 基本数据类型


Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。基本数据类型通常变量申请的内存空间都在栈中申请。
byte:

short:

int:

long:

float:

double:

boolean:

char:


可以通过相应的包装类的内置属性,打印出最大值以及
  1. public class PrimitiveTypeTest {  
  2.     public static void main(String[] args) {  
  3.         // byte  
  4.         System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);  
  5.         System.out.println("包装类:java.lang.Byte");  
  6.         System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);  
  7.         System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);  
  8.         System.out.println();  
  9.   
  10.         // short  
  11.         System.out.println("基本类型:short 二进制位数:" + Short.SIZE);  
  12.         System.out.println("包装类:java.lang.Short");  
  13.         System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);  
  14.         System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);  
  15.         System.out.println();  
  16.   
  17.         // int  
  18.         System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);  
  19.         System.out.println("包装类:java.lang.Integer");  
  20.         System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);  
  21.         System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);  
  22.         System.out.println();  
  23.   
  24.         // long  
  25.         System.out.println("基本类型:long 二进制位数:" + Long.SIZE);  
  26.         System.out.println("包装类:java.lang.Long");  
  27.         System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);  
  28.         System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);  
  29.         System.out.println();  
  30.   
  31.         // float  
  32.         System.out.println("基本类型:float 二进制位数:" + Float.SIZE);  
  33.         System.out.println("包装类:java.lang.Float");  
  34.         System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);  
  35.         System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);  
  36.         System.out.println();  
  37.   
  38.         // double  
  39.         System.out.println("基本类型:double 二进制位数:" + Double.SIZE);  
  40.         System.out.println("包装类:java.lang.Double");  
  41.         System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);  
  42.         System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);  
  43.         System.out.println();  
  44.   
  45.         // char  
  46.         System.out.println("基本类型:char 二进制位数:" + Character.SIZE);  
  47.         System.out.println("包装类:java.lang.Character");  
  48.         // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台  
  49.         System.out.println("最小值:Character.MIN_VALUE="  
  50.                 + (int) Character.MIN_VALUE);  
  51.         // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台  
  52.         System.out.println("最大值:Character.MAX_VALUE="  
  53.                 + (int) Character.MAX_VALUE);  
  54.     }  
  55. }
复制代码

类型默认值:




1.2 引用数据类型


引用类型是指存储对象或数组的引用(地址),而不是存储实际的值。通过引用,程序可以访问对象或数组的属性和方法。

在 Java 中,主要有以下几种引用类型:


对象或者数组的默认值是NULL。



1.3 基本数据类型之间的转换


整型、实型(常量)、字符型数据可以肴杂运算。
运算中,差别类型的数据先转化为同一类型,然后进行运算。


1.3.1 自动类型转换(隐式转换)


自动类型转换通常发生在如下几种情况中:
例如:
  1. byte b = 10;
  2. short s = b;  // 隐式转换,从 byte 到 short
  3. int i = s;    // 隐式转换,从 short 到 int
  4. float f = i;  // 隐式转换,从 int 到 float
复制代码
在自动类型转换中,你需要注意的是避免由于溢出或精度缺失导致的不精确效果。例如,将一个非常大的整数赋值给一个更小的整数类型可能会导致数据截断。


1.3.2 强制类型转换(显式转换)


显式类型转换通常需要用户明确指定转换的类型,即使用(目标类型)来包裹要转换的表达式或变量。
例如:
  1. float f = 10.5f;
  2. int i = (int) f;  // 显示转换,从 float 到 int,结果为 10
复制代码
在强制类型转换中,需要注意的是可能会引起数据丢失。例如,将一个浮点数转换为整数时,浮点数的小数部分会直接被忽略。

隐含强制类型转换




1.4 引用数据类型之间的转换


1.4.1 类类型之间的转换


1. 向上转型(Upcasting)


向上转型是指将子类引用赋值给父类引用。这个过程是安全的,由于子类是父类的扩展,父类引用能够包含子类对象。
  1. class Parent {
  2.     void display() {
  3.         System.out.println("Parent");
  4.     }
  5. }
  6. class Child extends Parent {
  7.     void display() {
  8.         System.out.println("Child");
  9.     }
  10. }
  11. Parent parent = new Child(); // 向上转型
  12. parent.display(); // 输出 "Child"
复制代码

在向上转型时,请注意以下几点:



2. 向下转型(Downcasting)


向下转型是指将父类引用赋值给子类引用。这个过程是可能不安全的,由于如果父类引用实际上指向的是一个差别的类型(而不是目标子类的对象),将会引发ClassCastException。
  1. Parent parent = new Child(); // 向上转型
  2. Child child = (Child) parent; // 向下转型
复制代码

在向下转型时,需要注意:

  1. if (parent instanceof Child) {
  2.     Child child = (Child) parent; // 安全的转换
  3. }
复制代码

使用instanceof:在进行向下转型之前,使用instanceof可以有效避免转换错误。


1.4.2 接口类型之间的转换


1. 实现接口的类之间的转换


Java答应类实现多个接口,可以在接口之间进行转换。确保实际对象实现了所转换到的接口。如果不实现,转换将失败。
  1. interface Animal {
  2.     void makeSound();
  3. }
  4. class Dog implements Animal {
  5.     public void makeSound() {
  6.         System.out.println("Woof");
  7.     }
  8. }
  9. Animal animal = new Dog(); // 向上转型
  10. Dog dog = (Dog) animal; // 向下转型
复制代码

在接口类型转换时的注意事项:

  1. if (animal instanceof Dog) {
  2.     Dog dog = (Dog) animal; // 安全的转换
  3. }
复制代码


1.4.3 数组类型转换


Java中的数组也是引用类型,数组类型之间的转换需要注意以下几点:

  1. String[] stringArray = new String[5];
  2. Object[] objArray = stringArray; // 向上转型
复制代码


  1. Object[] objArray = new String[5];
  2. String[] stringArray = (String[]) objArray; // 安全的转换
复制代码
如果尝试将差别类型的数组进行向下转型,会引发ArrayStoreException。


1.4.4 向上转型拿不到子类的特有成员


为何无法通过父类引用访问子类特有的方法?
因此只能通过向下转型来实现访问子类的特有成员。

那为什么访问子类和父类的共同方法,会优先调用子类的方法呢?


1.5 数组


Java 语言中提供的数组是用来存储固定巨细的同类型元素。

创建数组的三种方式:
  1. dataType[] arrayRefVar = new dataType[arraySize];
复制代码
  1. dataType[] arrayRefVar = {value0, value1, ..., valuek};
复制代码
  1. // new dataType[]{value0, value1, ..., valuek} , 这里的[]不要写大小
  2. // 因为编译器识别不出{}里面的数据占了多少
  3. dataType[] arrayRefVar = new dataType[]{value0, value1, ..., valuek};
复制代码


注意事项:


数组常用的方法:



1.6 String、StringBuffer、StringBuild


1. String

示例
  1. String str = "Hello";
  2. str += " World"; // 生成新的 String 对象
复制代码

2. StringBuffer

示例
  1. StringBuffer sb = new StringBuffer("Hello");
  2. sb.append(" World"); // 修改原有对象
复制代码

3. StringBuilder

示例
  1. StringBuilder sb = new StringBuilder("Hello");
  2. sb.append(" World"); // 修改原有对象
复制代码




2.Iterator(迭代器)


2.1 集合实现好的迭代器


Iterator(迭代器)是 Java 集合框架中的一种机制,是一种用于遍历集合(如列表、集合和映射等)的接口。
它提供了一种同一的方式来访问集合中的元素,而不需要相识底层集合的具体实现细节。
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。


迭代器接口定义了几个方法,最常用的是以下三个:


代码演示:
  1. // 引入 ArrayList 和 Iterator 类
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. public class RunoobTest {
  5.     public static void main(String[] args) {
  6.         // 创建集合
  7.         ArrayList<String> sites = new ArrayList<String>();
  8.         sites.add("Google");
  9.         sites.add("Runoob");
  10.         sites.add("Taobao");
  11.         sites.add("Zhihu");
  12.         // 获取迭代器
  13.         Iterator<String> it = sites.iterator();
  14.         // 输出集合中的所有元素
  15.         while(it.hasNext()) {
  16.             System.out.println(it.next());
  17.         }
  18.     }
  19. }
复制代码


2.2 自定义迭代器


有一个需求就是普通数据也想用迭代器,那必须得自己封装...

封装迭代器:
  1. package demo;
  2. import java.util.Iterator;
  3. public class MyDataStructure implements Iterable<Integer> {
  4.     private  int arr[];
  5.     public MyDataStructure(int[] arr) {
  6.         this.arr = arr;
  7.     }
  8.     @Override
  9.     public Iterator<Integer> iterator() {
  10.         return new MyIterator();
  11.     }
  12.     private class MyIterator implements Iterator<Integer>{
  13.         private int index = 0;
  14.         @Override
  15.         public boolean hasNext() {
  16.             return index < arr.length;
  17.         }
  18.         @Override
  19.         public Integer next() {
  20.             return arr[index++];
  21.         }
  22.     }
  23. }
复制代码

使用迭代器:
  1. package demo;
  2. import java.util.Iterator;
  3. public class TestIterator {
  4.     public static void main(String[] args) {
  5.         int arr[] = new int[]{11,22,33};
  6.         MyDataStructure mds = new MyDataStructure(arr);
  7.         // 增强for循环
  8. //        for (int num : mds) {
  9. //            System.out.println(num);
  10. //        }
  11.         Iterator<Integer> iterator = mds.iterator();
  12.         while(iterator.hasNext()){
  13.             System.out.println(iterator.next());
  14.         }
  15.     }
  16. }
复制代码

注意:由于增强For循环也是迭代器实现的,因此也可以使用增强For循环。。。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4