接口
1.在 Java 中,接口中声明的变量默认就是 public
、static
、final
的,这意味着它们是常量,且可以直接通过接口名称来访问。
// 定义一个接口
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 在进行结果映射时将能够正确地使用该构造函数来创建对象实例。