Java Study Notes for Beginners
Java 数组
int[] a = new int[3];
int[] a = new int[]{1, 2, 3};
int[] a = {1,2,3}
冒泡排序算法
for(int i = 0; i < arr.length - 1; i ++) {
// 每趟确定一个元素的最终位置
for(int j = 0; j < arr.length - i - 1; j ++) {
if(arr[j] > arr[j+1]) {
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
Java 字符串
String str = "abc"; // 字符串是常量,它们的值不能被创建后改变
// 等价
char str[] = {'a', 'b', 'c'};
String str = new String(str);
Java 多态
1、多态的三个必要条件:继承;重写;向上转型。
2、
public class A {
}
public class B extends A {
}
A a = null; // 声明一个对象(例如员工对象)
a = new B(参数1, 参数2); // 向上转型,例如创建一个技术员工对象(子类)
// 参数1, 参数2 直接传入 B 的构造方法
super(参数); // 在调用父类的构造方法时,传入该参数
super.func(); // 调用父类的构造方法
Java 抽象类和接口
1、万物皆对象,所有的对象都是借助于类来描绘的。但是反过来讲,也不是说所有的类都是用来描绘对象的。如果一个类中并没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。
2、抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类” —— 接口。
3、抽象类的相关代码实现
public abstract class Animal{
// Define abstract method
public abstract void shout();
}
public class Cat extends Animal() {
@Override
public void shout() {
System.out.println("Hello World");
}
}
public class Test {
public static void main(Sting[] args) {
// Abstract classes cannot be instantiated
// Animal animal = new Animal();
Animal animal = new Cat();
}
}
4、抽象类的语法约束
(1)抽象类不能背包实例化,也就是不能用 new 关键字去产生对象。
(2)抽象类中不一定包含抽象方法。
(3)抽象类中的抽象方法只是声明,并不给出方法的具体实现(功能)。
(4)构造方法和用 static 修饰的方法不能声明为抽象方法。
(5)抽象类的子类必须给出抽象类中的抽象方法的具体实现,但是若该子类也是抽象类,则不必如此。
(6)子类继承父类(抽象类)时,必须重写父类的所有抽象方法。
5、接口的代码实现
public interface USB {
int L = 10;
int W = 24;
void service();
}
public class UDisk implements USB {
pubic void service() {
System.out.println("Hello World");
}
}
// 默认
[修饰符] interface 接口名 {
[public] [static] [final] 数据类型 常量名 = 常量值;
[public] [abstract] 返回值类型 方法名 ([参数列表]);
[public] default 返回值类型 方法名 ([参数列表]) {};
[public] static 返回值类型 方法名 ([参数列表]) {};
}
public interface B {
public default void c(){};
}
public class A implements B {
}
// 向上转型
B b = new A();
b.c();
6、接口的语法约束
(1)当类实现接口的时候,类要实现接口中的所有抽象方法。否则,必须把这个声明为抽象类。
(2)允许一个类实现多个接口。
(3)接口中的方法除了包含抽象方法外,还包含默认方法和静态方法,默认方法和静态方法都可以拥有方法体。并且,静态方法可以直接通过 “接口.方法名” 来调用。因为接口同样不能被实例化。
关于默认方法:简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们即只需在方法名前面加个 default 关键字即可实现默认方法。
(4)一个类在继承一个类的同时,还可以实现接口。但是,此时 extends 关键字必须位于 implements 关键字之前。
7、为什么 Java 制定了接口?
接口的出现可以很好的解决 Java 不支持多重继承的问题。多重继承指的是一个类可以同时继承多个类,比如A类继承自B类和C类。
public class a implements b,c
8、抽象类和接口的不同
(1)抽象类中可以定义构造方法,接口中不能定义构造方法。
(2)接口中的成员全都是 public。
(3)抽象类中可以定义成员变量,接口中定义的成员变量实际上都是常量(只能被赋值一次,常量多大写)。
(4)一个类只能继承一个抽象类,一个类可以实现多个接口。
9、内存分布
Java 常用 API
1、API:Application Programming Interface.
2、使用 String 对象存储字符串
String s = new String("amber");
s.length(); // 获取字符串的长度
s.equals("ambow"); // 比较存储在两个字符串对象中的内容是否一致
s.concat(str) // 将一个字符串连接到另一个字符串后
s.toUpperCase() // 将字符串中的所有字符全部转换成大写
s.toLowerCase() // 将字符串中的所有字符全部转换成小写
s.trim() // 去除字符串中首尾的空格
s.substring(0,1); s.substring(1); // 提取字符串
s.replace("source", "target"); // 替换字符串
s.indexOf("select"); // 用于返回字符串中在指定字符中首次出现的索引位置,若能找到,则返回索引值,否则返回 -1
// StringBuffer 是线程安全的
StringBuffer str = new StringBuffer("HelloWorld");
StringBuffer str = new StringBuffer();
Scanner input = new Scanner(System.in);
str.append(input.next());
StringBuilder str = new StringBuilder("HelloWorld");
StringBuilder str = new StringBuilder();
str.toString(); // 转换为 String 类型
str.append(); // 追加字符串
str.insert(0,"str"); // 插入字符串
equal() 方法和 == 的差别?
在引用数据类型中, == 的作用用于比较其内存地址,而 equal() 方法用于比较其内容。
String str1 = "mendax"; // 引用,指针指向同一个地址
String str2 = "mendax";
String str3 = new String("mendax");
String str4 = new String("mendax");
// 结果
str1 == str2
str1 != str3
str3 != str4
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
String time = dateFormat.format(date);
String str = Integer.toString(x); // 整型转换成字符串
Striing str = x + ""; // 整型转换成字符串
int x = Integer.parseInt(str); // 字符串转化成整型
double x = Double.parseDouble(str); // 字符串转化成double类型
// 自动拆箱
Integer x = new Integer(1024);
int y = x;
// 自动装箱
int x = 1024;
Integer y = x;
集合框架快速入门
1、Java 集合类型有 Collection 和 Map。Collection 有 List(ArrayList、LinkedList) 和 Set(HashSet、TreeSet)。Map 有HashMap和TreeMap。
2、List 接口存储一组不唯一、有序的对象。Set 接口存储一组唯一、无序的对象。例如向 Set 集合中添加两个相同的元素,而后添加的元素会覆盖前面添加的元素,即在 Set 集合中不会出现相同的元素。
3、ArrayList 实现了长度可变的数组,在内存中分配连续的空间。LinkList采用链表存储方式。
4、HashSet 是按照 Hash 算法来存取集合中的元素,因此具有很好的存取和查找性能。除此之外,不保证元素的排列顺序,现排列顺序可能与添加顺序不同,现排列顺序也有可能会发生变化。HashSet 是不同步的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其同步。
5、Map 是一种键值集合,用于保存具有映射关系的数据。HashMap 同样不保证顺序。键不允许重复,但是值可以重复。若存入了两个相同的键,则保存最后一个存入的键值对。
6、泛型本质上是提供类型的“类型参数”,也就是参数化类型。泛型集合可以约束集合内的元素类型。
T:代表这是一个类型 Type
E:代表这是一个元素 Element
K:代表这是一个键 Key
V:代表这是一个值 Value
Java 文件流
// 图片拷贝
import java.io.*
File srcPath = new File("srcPath");
File destPath = new File("destPath");
FileInputStream fis = new FileInputStream(srcPath);
FileOutputStram fos = new FileOutputStream(destPath);
Byte[] bt = new Byte[1024];
while(fis.read(bt) != -1) {
fos.writer(fos);
}
fos.close;
fis.close;
// 文件写入
import java.io.*
File f = new File("Path");
FileOutputStream fop = new FileOutputStream(f);
OutputStreamWriter writer = new OutputStreamWriter(fop);
writer.append("Hello WOrld.");
writer.close();
fop.close();