我的细节错误总结

接口

1.在 Java 中,接口中声明的变量默认就是 publicstaticfinal 的,这意味着它们是常量,且可以直接通过接口名称来访问。

// 定义一个接口
public interface Car {
    // 声明一个常量
    String BRAND = "Toyota";
}

// 在另一个类中访问接口常量
public class Main {
    public static void main(String[] args) {
        // 通过接口名称直接访问常量
        System.out.println(Car.BRAND);
    }
}

在上面的代码中,接口 Car 中声明了一个常量 BRAND,并且在另一个类 Main 中可以直接通过接口名称 Car 来访问这个常量。因为是常量,所以BRAND不能再改变。

2.接口本身不能被实例化,因为它们没有构造函数或具体的实现代码。但是,接口可以通过接收继承了接口的类的实例化对象来使用。

在Java中,接口是一种约定,它规定了实现类需要遵循的方法和行为。因此,当一个类实现了接口中定义的所有方法,我们就可以将这个类的实例赋给接口类型的变量。

例如,假设有一个接口 Animal 定义了方法 makeSound()

public interface Animal {
    void makeSound();
}

然后有一个实现类 Dog

public class Dog implements Animal {
    public void makeSound() {
        System.out.println("Woof!");
    }
}

那么我们就可以这样使用:

Animal animal = new Dog();
animal.makeSound(); // 输出 Woof!

 在这个例子中,Animal 接口定义了动物应该有的叫声,Dog 类实现了 Animal 接口,所以我们可以用 Dog 类的实例来赋值给 Animal 类型的变量。和继承和类似。

3.当编写代码时,有时可能需要将一个对象强制转换为接口类型。在Java中,可以通过强制类型转换将一个类转换为接口类型。但是,由于接口是抽象的,不能直接实例化一个接口。相反,需要将一个已有的类实例转换为接口类型。

以下是一个简单的示例,演示如何将一个类强制转换为接口类型:

public interface MyInterface {
    void myMethod();
}

public class MyClass implements MyInterface {
    @Override
    public void myMethod() {
        // 实现接口中的方法
    }

    public void otherMethod() {
        // 其他方法的实现
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.myMethod(); // 调用类中实现的接口方法

        // 强制转换为接口类型
        MyInterface myInterface = (MyInterface) myClass;
        myInterface.myMethod(); // 仍然可以调用接口方法

        // 无法实例化接口
        // MyInterface interface = new MyInterface(); // 会导致编译错误
    }
}

在上面的示例中,MyClass实现了MyInterface接口。在Main类中,我以先实例化MyClass,然后将其强制转换为MyInterface类型。

然而,请注意,由于接口是抽象的,不能直接实例化一个接口对象。因此,不能使用new关键字来实例化一个接口。

PNG和JPG的区别

png支持透明和半透明效果,jpg不支持。png适合保存需要透明背景的图片,如屏幕截图、图标等。jpg适合保存照片,如风景或人物图片。

线程

不能重复使用同一个线程对象,很可能会在已启动的线程上再次调用start方法,

 而在 Java 中,一旦线程启动(通过调用 start 方法),就无法再次启动该线程。

如果尝试重复启动同一个线程,就会抛出 IllegalThreadStateException 异常

拷贝文件

创建字节数组来读文件可以加快读取速度,如果创建的数组足够大,

一次就读完了且剩余了数组空间,剩余空间的值默认为0,在写出数据时,

如果没有规定写出的长度,数组所有的数据都会写出,被写入的文件的大小就会和被拷贝的文件的大小一致


        //拷贝文件  核心思想:边读边写

        //创建文件输入流对象
        FileInputStream fs=new FileInputStream("D:\\game\\h游\\下载\\world02.png");

        //创建文件输出流对象
        FileOutputStream fs2=new FileOutputStream("untitled\\copy.png");

        //读数据  一次读5mb
        // int n=fs.read(bytes)  返回值是读取的个数  没读到数据就返回-1
        byte[] bytes=new byte[1024*1024*5];
        int len;
        while((len=fs.read(bytes))!=-1){

            //写出数据
            /*fs2.write(bytes,0,len);*/
            fs2.write(bytes);

        }


结果:

原文件大小

拷贝文件大小

窗口

1.窗口大小的设置要放在窗口位置的设置之前,不然,窗口位置的不能正确放置。 

    //窗口大小
     setSize(FrameWidth,FrameHeight);
    //窗口位置置中
     this.setLocationRelativeTo(null);

2.取消默认的居中放置,只有取消了才会按照xy轴方式添加组件

this.setLayout(null);

        //创建按钮
        JButton jb1 = new JButton("点击");
        jb1.setBounds(0,0,100,100);

        //取消默认的居中放置,只有取消了才会按照xy轴方式添加组件
        this.setLayout(null);


        //将组件添加进界面
        this.getContentPane().add(jb1);

设置前:

设置后:

java画笔

getGraphics() 方法用于获取当前界面的画笔对象。在 Java 中,当调用某个组件的 getGraphics() 方法时,会返回一个用于绘制在该组件上的 Graphics 对象。通过这个 Graphics 对象,可以进行各种绘图操作,比如绘制图形、文本或图片等。

需要注意的是图片绘制一次后就会自动清除,所以通常需要循环来保持图片的持续绘制。

琪露诺酱

意外发现    10120-->➈

 异或

一个数与1异或两次得到的数不一定是这个数本身 

spilt

在Java中,使用 split 方法将空字符串分割成一个空数组时,会得到长度为1的字符串数组,因为空字符串会被认为是一个元素。

以下是一个演示这种情况的示例:

public class SplitExample {
    public static void main(String[] args) {
        String s = "";
        String[] str = s.split("-");
        System.out.println(str.length); // 输出 1,即使s的长度为0
    }
}

尽管字符串 s 是空的,但由于 split 方法会将空字符串作为一个元素,所以 str 的长度依然为1。

字节流和字符流

字符输入流(如FileReader)相当于字节输入流(如FileInputStream)和字符编码的结合。

当使用字符输入流时,实际上是将字节输入流包装在字符输入流内,这样可以按照指定的字符编码将字节流转换为字符流。

char

在 Java 中,一个 char 类型占用 2 个字节(16 位)。这是因为 Java 中使用的是 Unicode 字符编码,且固定用UTF-16的编码方式,每个字符都可以表示为一个 16 位的 Unicode 码单元。因此,char 类型在 Java 中始终占用 2 个字节的内存空间。一个char类型的字母 a 占两个字节,而一个中文字符通常占用 2 个 char 类型的字节,即 4 个字节的内存空间。

public class CharSizeExample {
    public static void main(String[] args) {
        char c = 'a';
        System.out.println("char 类型占用的字节数:" + Character.BYTES);
    }
}

 在这个示例中,可以通过 Character.BYTES 获取 char 类型的字节数,输出结果是 2 。

public class ChineseCharSizeExample {
    public static void main(String[] args) {
        char chineseChar = '中'; // 中文字符
        System.out.println("中文字符占用的字节数:" + Character.charCount(chineseChar) * Character.BYTES);
    }
}

在这个示例中,可以通过 Character.charCount(chineseChar) * Character.BYTES 获取中文字符所占用的字节数,输出结果是 4。 

需注意在Java中,一个String中的字符占用的字节数是不固定的,而取决于字符所采用的编码和具体的字符。

String.split()

使用String.split()切割字符串时需要注意转义字符:String.split()方法接收的是正则表达式,而 . 在正则表达式中是特殊字符,代表匹配除换行符之外的任意字符。因此,需要使用split("\\.")来切割

public class SplitExample {
    public static void main(String[] args) {
        String str = "apple.orange.banana";
        String[] parts = str.split("\\."); // 使用点来分割字符串 要转义
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

 Graphics对象

在Java Swing中,需要先设置窗口可见,才能够获取当前窗口的画笔(Graphics对象)。

mybatis

1,Java 反射机制:当 MyBatis 从数据库结果集中创建对象时,它使用 Java 的反射机制。无参数构造函数是实例化对象的一种必要条件,以便 MyBatis 能够正确地创建对象。如果没有无参数构造函数,Java 反射机制就无法实例化该对象。

2.在 MyBatis 中,如果结果映射的 Java 对象没有默认的构造方法(无参构造函数),但有全参构造方法,MyBatis 将会在创建对象实例时使用全参构造方法。如果没有默认构造方法或全参构造方法,会导致 MyBatis 在结果映射时出现错误。

因此,为了确保 MyBatis 能够正确地映射查询结果到指定的 Java 对象类型,建议在对象中提供无参构造方法(默认构造函数)或全参构造方法(最好两者都提供)。这样可以确保 MyBatis 在创建对象实例时能够正确地初始化对象。

以下是一个示例,展示了一个带有全参构造方法的 Java 对象,用于 MyBatis 的结果映射:

public class User {
    private Long id;
    private String username;
    private String email;

    // 全参构造函数
    public User(Long id, String username, String email) {
        this.id = id;
        this.username = username;
        this.email = email;
    }

    // 省略无参构造函数

    // 省略 getter 和 setter 方法
}

通过提供全参构造函数,MyBatis 在进行结果映射时将能够正确地使用该构造函数来创建对象实例。

  • 16
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值