final
final 修饰一个变量,有很多种说法,比如不能改变等等。准确的描述是 当一个变量被final修饰的时候,该变量只有一次赋值的机会。
字面数值
对同一个数值来讲,16进制、8进制等不同进制只是代表表示形式,其数值是相同的。
例如:
long val = 26L; //以L结尾的字面值表示long型
int decVal = 26; //默认就是int型
int hexVal = 0x1a; //16进制
int oxVal = 032; //8进制
int binVal = 0b11010; //2进制
System.out.println(hexVal);
三元操作符
表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
int dayOfWork = 2;
String tag = dayOfWork <= 5 ? "workday" : "weekend";
System.out.println(tag);
注解
@Overwrite代表注解,有或者没有不影响使用。注解代表重写父类中或者接口中的方法,是个规范且严谨的表示方式。如果重写的方法不在父类或者接口中,那么就会报错。因此,注解的方式还有助于发现程序中的bug.
内部类
- 非静态内部类
非静态内部类可以直接在一个类里面定义
实例化时,必须建立在一个存在的对象基础上
非静态内部类,为了满足只有一个外部类对象存在的时候,才有存在意义的场景
public class Host {
private String address;
class Device {
int port;
}
public static void main(String[] args) {
Host host = new host();
host.address = "127.0.0.1";
Device d = host.new Device();
d.port = 3306;
}
}
输入输出流
当不同的介质之间有数据交互的时候,就需要使用流来实现。数据源可以是文件,还可以是数据库,网络甚至是其他的程序。
读取数据时使用输入流InputStream,写数据到硬盘时使用输出流OutputStream
> 通过输入流,将数据读取到Java的虚拟机中(内存)
> filename = "/opt/java/study/menu.txt";
> FileInputStream fileInput = new FileInputStream(filename);
(1) FileInputStream
FileInputStream是实体流,也就是真实做事情的流,用来读文件的。使用该类创建对象时,系统会自动将需要读的文件转换成该类的流对象,可以直接读取。
(2) DataInputStream
DataInputStream是装饰流,必须建立在其他实体流的基础之上。
(3) 对象流
对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘
一个对象以流的形式进行传输,叫做序列化。
把一个对象序列化的前提是该对象的类,必须实现了Serializable接口
泛型
设计支持泛型类,需要在类的声明上,加上一个,表示该类支持泛型。
T是type的缩写,也可以使用任何其他的合法的变量,比如A,B,X都可以,但是一般约定成俗使用T,代表类型。
public class Shape<T> {
LinkedList<T> values = new LinkedList<T>();
public void draw(T t) {
values.addLast(t);
}
public T () paint(T t){
return values.add(t);
}
public T shape() {
return values.getLast();
}
public static void main(String[] args) {
Shape<Car> car = new Shape<>();
car.paint(new Car());
}
}
try() {} catch{}
try()中可以包含实现Closeable的类声明,例如流操作、socket等;
不需要编写finally模块来手动关闭资源。
例如:
try(
//创建对象输出流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos =new ObjectOutputStream(fos);
//创建对象输入流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois =new ObjectInputStream(fis);
) {
oos.writeObject(obj);
Game gm = (Game) ois.readObject();
System.out.println(gm.version);
System.out.println(gm.numOfHouse);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
反射机制
反射机制可以通过将类名、属性、方法等参数放到配置文件中,然后通过反射来读取配置文件、调用方法。在Java程序中,可以屏蔽掉具体的类名和方法。类似于Spring框架的基本原理,反射可以令程序更加健壮、安全、灵活。
参考链接
(1) 面向接口编程
https://blog.csdn.net/weixin_30254435/article/details/99275435
Spring IOC 也是一个java对象,在某些特定的时间被创建后,可以进行对其他对象的控制,包括初始化、创建、销毁等。简单地理解,在上述过程中,我们通过配置文件配置了BookDaoImpl实现类的完全限定名称,然后利用反射在运行时为BookDao创建实际实现类,包括BookServiceImpl的创建,Spring的IOC容器都会帮我们完成,而我们唯一要做的就是把需要创建的类和其他类依赖的类以配置文件的方式告诉IOC容器需要创建那些类和注入哪些类即可。Spring通过这种控制反转(IoC)的设计模式促进了松耦合,这种方式使一个对象依赖其它对象时会通过被动的方式传送进来(如BookServiceImpl被创建时,其依赖的BookDao的实现类也会同时被注入BookServiceImpl中),而不是通过手动创建这些类。
(2) 了解Java开发中的volatile
https://www.jb51.net/article/140591.htm
(3) SpringMVC
springmvc 从入门到总结
SpringMVC 基础教程 简单入门实例