目录
Java
1.静态内部类
2.关于String,StringBuilder以及StringBuffer
3.java语言特性
4.非抽象类实现接口的问题
5.互斥锁
6. Socket 通信编程
7.类的初始化顺序
8.变量的存储区
9.jvm线程共享问题
10.java内存回收问题
11.关于java concurrent包四个类的区别
12.Statement在JDBC中相当于SQL语句的载体
Java
1.静态内部类
静态内部类可以访问外围类的静态数据,包括私有数据,但不能访问非静态数据;
非静态内部类可以直接访问外围类的数据,包括私有数据
- package test;
-
- public class test {//外部类
- int a = 1;
- static int b = 9;
- private String str = "test";
- private static int c = 33;
-
- class innerClass {//非静态内部类
- void method(){//可直接访问外部类数据,包括静态数据,私有数据
- System.out.println(a);
- System.out.println(b);
- System.out.println(str);
- System.out.println(c);
- }
- }
-
- static class staticInnerClass {//静态内部类
- void method(){
- System.out.println(a);//default访问不了
- System.out.println(b);//可以访问静态数据
- System.out.println(c);//也可以访问私有的静态数据
- System.out.println(str);//但是非静态的访问不了
- }
- }
- }
2.关于String,StringBuilder以及StringBuffer
- 对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
- java中的字符串存储在字符串常量区,不会改变,发生改变是会新创建一个对象
- StringBuffer是线程安全的
- StringBuilder是线程不安全的
- 可以修改StringBuffer和StringBuilder的内容
- StringBuilder和StringBuffer底层都是以字符数组存放的,可以修改内容
3.java语言特性
- java致力于检查程序在编译和运行时的错误
- java能运行虚拟机实现跨平台
- java自己操作内存减少了内存出错的可能性
- java还实现了真数组,避免了覆盖数据的可能性
- ps:内存连续就是真数组,内存不连续就是假数组
4.非抽象类实现接口的问题
- 非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头不一定一致
- 方法名相同,参数类型相同
- 子类返回类型小于等于父类方法返回类型
- 子类抛出异常小于等于父类方法抛出异常
- 子类访问权限大于等于父类方法访问权限
5.互斥锁
- synchronized关键字是同步代码块关键字,对对象加互斥锁
笔记:
- final关键字在多线程中的作用表现为:1.创建过程保证不可给其他线程访问;2.构造函数退出时,final域的值对其他线程可见
6. Socket 通信编程
- 服务端通过new ServerSocket()创建
- 服务器端通过TCP连接对象调用accept()方法创建通信的Socket对象
- 客户端通过new Socket()方法创建通信的Socket对象
Socket套接字
就是源Ip地址,目标IP地址,源端口号和目标端口号的组合
服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号)
客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)
7.类的初始化顺序
- 初始化父类中的静态成员变量和静态代码块
- 初始化子类中的静态成员变量和静态代码块
- 初始化父类中的普通成员变量和代码块,在执行父类中的构造方法
- 初始化子类中的普通成员变量和代码块,在执行子类中的构造方法
8.变量的存储区
- class A {
- private String a = "aa";//类的成员变量
- public boolean methodB() {
- String b = "bb";//局部变量
- final String c = "cc";//局部变量
- return false;
- }
- }
- 类中的成员变量,存放在堆区
- 堆区:只存放类对象,线程共享;
- 方法中的局部变量,存放在栈区
- 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
- 方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
9.jvm线程共享问题
- 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行 到了第几行,是线程隔离的
- 原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的
- Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
- 方法区:
- 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
- 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
10.java内存回收问题
- java的内存回收是自动的,Gc在后台运行,不需要用户手动操作
- java中不允许使用指针
- 内存回收线程可以释放无用的对象内存
- 内存回收线程负责释放无用内存
11.关于java concurrent包四个类的区别
- Semaphore:类,控制某个资源可被同时访问的个数(与并发编程的锁机制相关)
- ReentrantLock:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大(与并发编程的锁机制相关)
- Future:接口,表示异步计算的结果(线程任务的返回结果的‘欠条’)
- CountDownLatch: 类,可以用来在一个线程中等待多个线程完成任务的类(与并发编程的锁机制相关)
12.Statement在JDBC中相当于SQL语句的载体
- Statement是最基本的用法,采用字符串拼接的方式,存在注入漏洞
- PreparedStatement对Statement中的SQL语句进行预编译,同时检查合法性,效率高
- CallableStatement接口扩展 PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持
- BatchedStatement不是标准的Statement类
转载声明:https://blog.csdn.net/zzxzzxhao/article/details/82893167#1.