Java学习笔记

1、类对象obj.getClass()和类的对象obj的区别

 2、

方法多态里:只能调用调用子类里重写父类的方法或者是继承父类的方法,不能是子类独有的方法

 

 3、

 基本数据类型转换

 基本数据类型:

  byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128(-2^7)~127(2^7-1),默认值0

  short:短整型,在内存中占16位,即2个字节,取值范围-32768(-2^15)~32767(2^15 - 1),默认值0

  int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围--2,147,483,648(-2^31)~2,147,483,647(2^31 - 1),默认值0

  long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

  float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

  double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

  char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

  boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

  默认转换:byte,short,char--int--long--float--double

                    byte,short,char 相互之间不转换,他们参与运算首先转换为Int类型

Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

参考地址:https://www.cnblogs.com/zwakeup/p/7420142.html

Animal animal = new Dog();
Dog dog = (Dog) animal;
dog.eat();

 上面这个例子就是引用类型里的强制类型转换,因为animal的引用本身就是指向子类Dog

4、

抽象类规定子类必须实现哪些方法,但它不关心如何实现

5、

Java世界中,类是单继承的,接口是可以多继承的

使用接口的时候,还可以用匿名内部类的方法

5、Java异常

   异常的作用和意义:对于异常的正确处理,可以将异常提交给编程人员,使本来中断的程序可以继续运行或者退出,并且保存用户的当前操作

 运行时异常,应该是代码逻辑有问题

检查异常:这部分需要我们手动添加捕获和处理语句

处理异常我们用try-catch或者try-catch-finally

如果try里面的语句或出现多个异常,该怎么处理?

可以使用多个catch,捕获不同的异常,进行不同的处理

编写多个catch块要注意的问题:先小后大,先从子类异常开始

我们还可以自定义异常,需要继承Java中相似的异常类或者是基类exception

6、String和StringBuffer

String是不可变对象,即对象一旦生成,就不能更改。对String对象的改变会引起新的String对象的生成。这容易浪费资源

StrinhBuffer:每次都对对象本身进行操作,而不是生成新的对象。所以在字符串内容不断改变的情况,建议使用StringBuffer。

public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();  // 使用构造函数StringBuffer创建一个StringBuffer对象
        System.out.println("sb.capacity():"+sb.capacity()); // 16 理论值
        System.out.println("sb.length():"+sb.length()); // 0 实际值
}

 StringBuffer转String  使用toString()方法

String转StringBuffer  使用new StringBuffer(string)

String和StringBuffer相互转换,是为了使用对方的方法

7、对象数组

 8、集合

已经有了数组,为什么还要集合?

因为数组的长度是固定的,而且只能存储同一类型,集合的话,长度不固定,同一个集合可以保存多种类型(ArrayList、HashSet)

参考地址:https://www.cnblogs.com/yangliguo/p/7476788.html

                  https://www.jianshu.com/p/a9fb4d26c2cd

 set集合里的数据是不重复的,当把对象添加到set中时,兼容可以保存重复的数据,这是为什么呢?

 public static void main(String[] args) {
        // 创建HashSet集合对象
        HashSet<Student> hs = new HashSet<Student>();
        //创建student对象
        Student s = new Student(20, "zb");
        Student s1 = new Student(21, "zb1");
        Student s2 = new Student(21, "zb1");

        //添加袁术对象
        hs.add(s);
        hs.add(s1);
        hs.add(s2);

        // 遍历集合
        for (Student student : hs) {
            System.out.println(student);
        }
    }

结果分析,原因出在add这块,源码里面显示:添加的时候,先通过hashCode值进行判断,如果值已经有了,就不保存

要解决这个问题,就需要重写类的hashCode和equals方法

9、IO流分类

  流向: 

          输入流:  读取数据放入内存中  FileReader

          输出流:  从内存中写出数据     FileWriter

  类型:

          字节流:(一些不能转换为字符的,就需要字节流:比如图片、视频)

                     字节输入流: InputStream

                     字节输出流:OutputStream

          字符流: (读中文、复制文本文件,用这个好)

                     字符输入流:Reader

                      字符输出流:Writer

下面这个例子是分别使用字节流和字符流复制图片

package 常用API_08.IO;

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import java.io.*;

/**
 * 使用字节和字符流赋值图片
 * 结论:二进制文件只能由字节流传输,包括:图片、视频、音频
 * 文本文件既可以使用字节流,也可以使用字符流
 * 为什么字节流不能复制二进制文件,因为字符流在复制的时候,会对字节进行合并,有的俩个字节
 * 合并成一个字符,有的三个字节合并成一个字符,在这个过程中,会丢失字节
 */
public class CopyImage {
    public static void main(String[] args) throws IOException {
        copyImageByByte();
    }


    // 使用字节流复制图片
    private static void copyImageByByte() throws FileNotFoundException, IOException {
        // 创建字节输入流对象
        FileInputStream fis = new FileInputStream("E:\图片\若菜奈央__02.png");
        // 创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("E:\若菜奈央__02.png");

        int len;
        byte[] bytes = new byte[1024];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }

        fos.close();
        fis.close();
    }

    // 使用字符流复制图片
    private static void copyImageByChar() throws FileNotFoundException, IOException {
        // 创建字符输入流对象
        FileReader fr = new FileReader("E:\图片\若菜奈央__02.png");

        // 创建字符输出流对象
        FileWriter fw = new FileWriter("E:\若菜奈央__02.png");

        // 一次读写一个字符数组
        int len;
        char[] chars = new char[1024];
        while ((len = fr.read(chars)) != -1) {
            fw.write(chars, 0, len);
            fw.flush();
        }

        // 释放资源
        fw.close();
        fr.close();
    }
}

 主方法是单线程的,但是主方法里面可以创建多个线程

多线程操作的时候,会出现数据错乱

 

 使用synchronized给代码块进行加锁,让代码变成同步(优点:安全性高;缺点:效率低)

 10、基本类型和包装类型

参考:https://www.cnblogs.com/zsswpb/p/6329417.html

在开发中,对于可能为空的参数,最好定义为包装类型,因为前端传的参数如果为空,基本数据类型会报错

比如int和Integer,如果定义了一个参数是int类型,如何不传这个参数,就会报错,如果是Integer类型,就不会报错

备注:如果配置了@RequestParam,就算是Integer,也必须传参数,因为@RequestParam有一个属性required,默认为true

11、

原文地址:https://www.cnblogs.com/zhaobao1830/p/10703687.html