一、java基础语法
变量与常量
局部变量、成员变量(实例变量)、静态变量(类变量)static、常量final
数据类型
1)基本数据类型
数值型:byte(1)、short(2)、int(4)、long(8)、float(4)、double(8)
字符型:char(2)
布尔型:boolean(1或4)
2)引用数据类型
数组、接口、类(统一为4字节)
面向对象三大特征
1)继承extends
它让我们更加容易实现对于已有类的扩展、更加容易实现对于现实世界的建模。继承有两个主要作用:1.代码复用,更加容易实现类的扩展2.方便对事务建模
继承使用要点
1.父类也称作超类、基类、派生类等。
2. Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
3. Java中类没有多继承,接口有多继承。
4.子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法庄但不见
得可以直接访问(比如,父类私有的属性和方法)。
5.如果定义一个类时,没有调用extends,则它的父类是: java.lang.Object。
2)封装
对于程序合理的封装让外部调用更加方便,更加利于写作。同时,对于实现者来说也更加容易修正和改版代码。
封装4个访问控制符:public protected default private
3)多态
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
多态的要点
1.多态是方法的多态,不是属性的多态(多态与属性无关)。
2.多态的存在要有3个必要条件。继承,方法重写,父类引用指向子类对象。
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
JavaBean
是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
内部类
1)非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
1.非静态内部类对象必须奇存在一个外部类对象里。因此,如果有一个非静态内部类
对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
2.非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类
成员。
3.非静态内部类不能有静态方法、静态属性和静态初始化块。4.成员变量访问要点:
1.内部类里方法的局部变量:变量名。2.内部类属性: this.变量名。
3.外部类属性:外部类名.this.变量名。
2)静态内部类
1.静态内部类可以访问外部类的静态成员,不能访问外部类的普通成员。
2.静态内部类看做外部类的一个静态成员。
3)匿名内部类
适合那种只需要使用一次的类。比如;键盘监听操作等等。在安卓开发、awt、swing开发中常见。
4)局部内部类
定义在方法内部的,作用域只限于本方法,称为局部内部类。
局部内部类的的使用主要是用来解决比较复杂的问题想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。
局部内部类在实际开发中应用很少。
异常
Java的异常是 Java 语言中的一个重要特性,它可以在程序运行时捕获和处理错误,并防止程序崩溃。
Java 的异常体系结构是从 Throwable 类继承而来,Throwable 分为两个子类:Error 和 Exception。其中 Error 表示严重的程序错误,一般需要重新设计代码或者更换硬件等措施进行解决。而 Exception 则表示一般性的程序错误,在代码编写过程中需要考虑如何处理。
Java的异常处理使用 try-catch-finally 语句块。try 语句块用来放置可能出现异常的代码,如果代码抛出了异常,就会被 catch 语句块捕获并处理。catch 语句块用来处理该异常,并且可以根据需要抛出新的异常,它必须紧随在 try 语句块之后。finally 语句块用来放置必须执行的代码,它会在 try 或 catch 语句块结束后执行。
以下是一个简单的 Java 异常处理的示例:
public class ExceptionDemo {
public static void main(String[] args) {
try {
int a = Integer.parseInt("10");
int b = Integer.parseInt("0");
int c = a / b; // 此处会抛出算术异常
} catch (NumberFormatException e) {
System.out.println("数据格式错误");
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} finally {
System.out.println("程序结束");
}
}
}
二丶集合
集合体系结构
常用集合概念
1)Collection 是单例集合根接口,它是集中、收集的意思。Collection接口的两个子接口是 List、Set接口。
2)List接口特点:1)有序(元素存入集合的顺序和取出的顺序一致)。List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。2)可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2)的元素重复加入容器。
3)ArrayList是 List接口的实现类。是List存储特征的具体实现。ArrayList 底层是用数组实现的存储。特点:查询效率高。增蒯效率低,线程不安全。
4)Vector底层是用数组实现的,相关的方法都加了同步检查,因此“线程安全,效率低”。
5)Stack容器,是vector的一个子类,它实现了一个标准的后进先出(LIFO:Last In Frist Out)的栈。
6)LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
7)Set特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equalsO方法对比为true,则只能保留一个。Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。
8)HashSet是一个没有重复元素的集合,不保证元素的顺序。而且HashSet允许有null元素。HashSet 是采用哈希算法实现,底层实际是用HashMap 实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。
9)TreeSet是一个可以对元素进行排序的容器。底层实际是用TreeMap实现的。内部维持了一个简化版的TreeMap,通过 key来存储Set的元素。TreeSet内部需要对存储的元素进行排序,因此,我们需要给定排序规则。
排序规则实现方式:通过元素自身实现比较规则。通过比较器指定比较规则。
10)Map接口定义了双例集合的存储特征,它并不是Collection 接口的子接口。双例集合的存储特征是以key与value结构为单位进行存储。体现的是数学中的函数y=f(x)感念。
11)HashMap是 Map接口的接口实现类,它采用哈希算法实现。是Map接口最常用的实现类。由于底层采用了哈希表存储数据,所以要求键不能重复,如果发生重复,新的值会替换旧的值。HashMap在查找、删除、修改方面都有非常高的效率。
lterato迭代器接口
Collection接口继承了lterable接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的容器类对该疴法做了具体实现。iterator方法会返回一个lterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。
三、IO流
四、多线程
程序
“程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件,比如:我们要启动酷狗听音乐,则需要执行酷狗对应的的可执行程序。当我们双击酷狗的可执行程序后操作系统会将该程序加载到内存中,开始执行该程序,于是产生了“进程”。
进程
执行中的程序叫做进程(Process),是一动态的概念其实进程就是一个在内存中独立运行的程序空间。如正在运行的写字板程序就是一个进程。
线程
一个进程可以产生多个线程,同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级进程(lightweight process).
五、网络编程
Java 网络编程是指使用 Java 语言编写网络应用程序的开发技术和方法。Java 网络编程主要涉及两个方面:Socket 编程和网络协议编程。
Socket 编程:Java 提供了一套完整的 Socket API,可以用来实现客户端和服务端之间的通信。Socket 是指客户端和服务端之间的数据传输通道,Java Socket 可以实现不同主机之间的数据传输。
网络协议编程:Java 网络协议编程主要涉及到 HTTP、FTP、SMTP 等各种网络协议。Java 提供了一套完整的网络编程接口,可以方便地实现不同协议之间的数据传输与交互。
Java 网络编程的主要步骤如下:
- 创建服务端或客户端的 Socket 对象。可以使用 Socket 类或 ServerSocket 类创建一个 Socket
对象来表示客户端或服务端。 - 建立网络连接。可以使用 Socket 对象提供的 connect() 方法或 ServerSocket 对象提供的 accept()
方法来建立网络连接。 - 进行数据传输。可以使用 Socket 对象提供的 InputStream 和 OutputStream 来进行数据传输。
- 关闭 Socket 对象和网络连接。传输完成后,需要使用 Socket 或 ServerSocket 类提供的相关方法来关闭网络连接。
六、反射
反射是Java语言的一个重要特性,允许程序在运行时动态地获取对象的信息,并能够操作对象。反射提供了一种机制,使得 Java 代码可以检查自己的变量、方法和类型,并在运行时获取这些信息。简单来说,反射就是把Java类中的各种成分映射成相应的Java对象。
Java反射机制提供了以下功能:
- 获取类的构造方法、成员变量和方法信息
- 获取和设置类的私有成员变量的值
- 调用类的方法
- 创建类的对象
- 动态代理
优点:
- 动态性:反射机制允许在运行时动态地获取和操作对象的信息,使得Java程序具有更高的灵活性和动态性。
- 扩展性:反射机制支持程序员自定义类型和注解,可以让框架更容易扩展和维护。
- 增强性:反射机制可以使用动态代理技术来实现AOP(面向切面编程),从而增强程序的功能和可维护性。
缺点:
- 性能问题:反射机制的执行效率比较慢,因为它需要在运行时进行许多额外的操作,如检查类型、访问属性、调用方法等,这些操作需要较高的运行成本。
- 安全问题:反射机制可以访问和修改私有成员变量、方法和构造器等,如果在应用程序中滥用反射机制,可能会导致安全漏洞。
- 设计问题:反射机制可能会对设计造成影响,因为它允许开发人员在运行时修改和获取类的信息,可能会导致程序设计变得更加复杂和难以管理。
以下是一个使用反射机制获取类信息的示例:
public class Person {
private String name;
private int age;
public void sayHello() {
System.out.println("Hello! My name is " + name + ", I am " + age + " years old.");
}
}
public class Test {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
Class cls = Person.class; // 获取类对象
Field[] fields = cls.getDeclaredFields(); // 获取类的所有成员变量
for (Field field : fields) {
System.out.println(field.getName()); // 输出成员变量名
}
Method method = cls.getMethod("sayHello"); // 获取类的sayHello方法
Object obj = cls.newInstance(); // 创建类对象
method.invoke(obj); // 调用类方法
}
}
七、泛型
Java 的泛型是一种可以为类、接口或方法添加类型参数的机制,这种机制被广泛应用于 Java 集合框架中,可以让集合支持各种类型的数据。使用泛型可以让代码更加灵活、安全和可读性更好。
Java 泛型的主要特点如下:
- 提高安全性:Java 的泛型机制可以使程序更安全,编译器会在编译时检查代码中的泛型类型是否正确,从而在一定程度上避免了类型转换的错误。
- 提高可读性:通过泛型,代码看起来更加易读,可以明确指定方法和类的参数和返回值的数据类型。
- 提高代码重用性:泛型可以使代码更加通用,同一份代码可以适用于不同类型的对象,从而提高了代码的重用性和可维护性。
Java 泛型的使用如下:
定义泛型类:泛型类就是指在类声明的时候,使用类型参数来代表类中的一些属性或方法可以使用的数据类型。
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
定义泛型接口:泛型接口就是指在定义接口时使用类型参数,来表示接口中的方法可以使用的数据类型。
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
定义泛型方法:泛型方法就是使用类型参数的方法,无论是普通类还是泛型类都可以拥有泛型方法。
public static <T> void printArray(T[] array) {
for (T element : array)
System.out.println(element);
}