1.一个源文件中只能有一个public类 一个源文件可以有多个非public类
2.java的引用数据类型:在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。 所有引用类型的默认值都是null。
3.静态变量(类变量,也叫全局变量):静态代码块是在类加载的时候就被加载进内存中。类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
4.访问控制修饰符:
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
5.instanceof运算符:用于操作对象实例,检查该对象是否是一个特定的类型。例如:String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
6.for循环:语法:for(初始化;布尔表达式;更新)
增强for循环(主要用于数组);语法:for(数组中值得类型 变量名:要访问的数组名)例如;String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
7.所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
8.静态方法中不能引用非静态的成员变量和非静态方法,要想调用,要创建对象来调用!
9.当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
10.静态方法可以直接类名.方法的形式引用方法
11.Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
12,方法名首字母小写,后边单词首字母大写,
类名是首字母大写,后边单词首字母大写
13、关于静态方法: A,静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。 非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
B,引用方便。直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法。
C,保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。有效减少多余的浪费。
D,static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。
声明为static的方法有以下几条限制: ·
A,它们仅能调用其他的static 方法
B,它们只能访问static数据
C,它们不能以任何方式引用this 或super(this涉及到对象,super 与继承有关)
14.不管你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。
一旦你定义了自己的构造方法,默认构造方法就会失效。
15.Reader和Write为字符输入输出流,InputStream和OutputStream为字节输入输出流。这四个类属于抽象流类,不能在程序中直接实例化使用,可以使用其派生的类。
16.Java输入输出流可以理解为:大脑是内存,屏幕文字是控制台文件,
通过阅读Reader或者Input知识进入大脑,大脑通过手写大脑想要说的,是Writer或者output.
17.错误(error)和异常(Exception)
前者代表错误类,由系统直接处理,后者是程序可捕捉到的异常,有应用程序处理或抛出
18.异常又分为:1.虚拟机内部异常 例如:JVM内存溢出
2.标准异常 例如:数组越界
3.自定义异常
19.继承的特性: 1.子类拥有父类非 private 的属性、方法。
2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。
4.Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
5. 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
20.构造器:1.子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
2.如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
3.如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
21.重写:override 返回值和形参都不能改变
子类重写的访问权限不能低于父类 声明为 static 的方法不能被重写,但是能够被再次声明。
声明为 final 的方法不能被重写。
重写注意事项:1.重写方法时子类不能降低父类的访问权限,可以扩大 2.由private或final修饰的方法都不能重写 3.重写方法时可以是父类抛出异常的全集,子集或空集 4.重写方法可缩小返回类型的返回,不能扩大
22.Java中的static方法不能被重写,static方法是同类一同加载到栈中的,无需对象来调用,个人理解:重写的目的是产生多种方法供实例对象来调用;
23.super关键字:当需要在子类中调用父类的被重写方法时,用这个关键字;
24.重载(Overload):在同一个类里边,方法名相同,参数列表不同
25.多态是同一个行为具有多个不同表现形式或形态的能力。
例如:动物的吃是行为,不同动物吃法不同,狗咬骨头,猫舔鱼肉、
26.多态存在的条件:1 继承 2,重写 3.父类引用指向子类对象
27,当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
28.多态的实现方式:一:重写 二:接口 三:抽象类和抽象方法
29.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
30.接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
31.抽象类和接口的区别:
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
32.从设计层面深入理解接口和抽象类:
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系
2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。 也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。 比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新,这就是辐射式-接口
33.Java中主要的三个内存区:
1.栈(stack):存放的是方法中的局部变量,且方法的运行一定在栈中
2.堆(Heap):凡是new出来的东西,都在堆里面,堆内存里面的东西都有一个16进制的地址值,堆内存里面的数据,都有默认值
3.方法区(Method Area):存储.class信息,包含方法的信息;
34.ArrayList<E>集合的的长度是可以随意改变的,后边的E代表泛型,指存放的是什么引用类型的值,且E必须是引用类型
35.在Java程序中,只要双引号,就是String类的对象,不管new没new
36.对于基本类型,==比较的是数值,对于引用类型,==比较的是地址值
37.字符串直接“”的是在字符串常量池中,new出来的不是,
38.静态代码块:static{//内容}
特点:第一次用到本类时,执行唯一一次 静态内容总是优先于非静态
用途:用于一次性的给静态成员变量赋值
39.Arrays类是有关数组的类,里面包含了大量的static方法,
40.多态的向上转型一定是安全的,向下转型
41.内部类分为:成员内部类 和局部内部类(包含匿名内部类)
注意:内用外,随意用,外用内,需要内部类对象
如何使用成员内部类?
1.间接调用:在外部类的方法当中使用内部类,main只是调用外部类的方法
2.直接调用:公式:外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
3.出现重名的话,里调用外,语法:外部类.this.外部类的成员变量名
42.局部内部类:定义在方法内的类
43.注意类的访问修饰符:外部类:default和public 成员内部类:四种都能写
局部内部类:什么都不能写 (理解记忆)
44.匿名内部类(重点):如果接口的实现类或者父类的子类只需要使用唯一的一次,这种情况可以省略该类的定义,改为匿名内部类
匿名内部类的定义格式:接口名称 对象名=new 接口名称{.....};
或者:父类名称 对象名=new 父类名称{.....};
注意:分号不能省
45.一个类如果不继承任何类,则默认继承Object类
46.向下转型一定要用instanceof关键字来判断,避免异常产生
47.Objects类是处理对象用的工具类,里面的equals方法可以防止空指针异常
48.String类的底层是用final修饰的字节数组,不可改变,而StringBulider类的底层没有被final修饰,是一个可变的数组,效率高,在内存中始终是一个数组
49.list接口的特点:1.有序(存储和取出的元素顺序相同)2.重复(允许重复元素)
3.有索引,可以使用普通for循环来遍历
set接口的特点:1.不重复 2.没有索引,不能使用普通for循环
50.Collection接口是list和set接口的父类接口,元素没有索引,要遍历,需要迭代器iterator
51.增强for循环实质原理就是iterator迭代器,也可以用于集合的遍历
52.Map接口和Collection接口相反,Collection接口是单列集合,Map是双列集合
53.Map集合的特点:1.是双列集合,有key和value 2.key不可以重复,value可以重复
3.key和value一一对应
54.进程:在内存中执行的应用程序,是程序的一次独立的执行过程 线程:线程是进程的组成部分,一个进程可以包含多个线程,线程是比进程更小的执行单位
55.线程的调度:1.分时调度:所有线程轮流使用CPU,平均分配每个线程使用CPU的时间
2.抢占式调度:优先让优先级高的线程使用CPU,如果优先级相同,则随机调度
56.创建多线程的第一种方式:继承Thread类
实现步骤:1.创建Thread类的子类
2.在子类中重写run方法,也就是线程要执行的任务
3.创建子类对象,调用start方法
创建多线程的第二种方法:1.定义实现runnable接口的实现类
2.重写run方法,线程要执行的任务
3.创建实现类的对象
4.创建Thread类对象,传入runnable实现类的对象
5.调用start方法
此方式的优点:1.避免了单继承,使得实现类还可以继承其他的父类和接口
2.增强了程序的扩展性
57.解决线程安全的方法是同步机制
第一种:同步代码块
synchronized(锁对象)
{ 代码块 }
注意:锁对象可以是任意对象 必须保证多个线程使用的是同一个锁对象
第二种:同步方法
public synchronized void method1()
{...}
第三种:Lock锁
1.创建其实现类对象 2.在可能出现安全的位置前调用lock方法 3,在安全结束的位置调用unlock方法
58.线程中的sleep方法可以自己醒,而wait方法需要notify方法来唤醒
举例:顾客买包子,告诉老板要什么,此时顾客调用wait方法等待,老板装好包子,使用notify方法唤醒顾客
59.在文件类中,\表示转义字符 \\表示反斜杠
60.输入输出相对于内存而言,输入是硬盘数据写入内存,输出是内存数据写入硬盘,内存数据是暂时存储的,硬盘数据是永久的,最后记得关闭流
61.字节流每次只能读取一个字节,但是对于中文,占多个字节,为此,字符流诞生
62.软件结构分为:1.c/s结构(client/server)客户端服务器
2.B/S结构(browser/server)浏览器服务器
63.网络编程:在一定的协议下,实现两台计算机通信的程序
64.UDP协议(User Datagram protocal)用户数据报协议:耗资小,效率高,发送端和接收端不建立连接,偶尔有数据丢失,不建议重要数据的传输,数据只能在64kb之间,大了不能发送
例如:QQ发送信息
TCP协议(Transmission Control protocal )传输控制协议:发送端和接收端必须建立连接才能发送数据,发送数据准确无误,不会偏差。
在TCP发送数据时,客户端和服务器进行三次握手,保证连接的可靠
例如:用QQ发送文件给朋友
65.网络编程三要素:1.协议(规则) 2.IP地址(电脑唯一标识) 3.端口号(门牌号)
66.当我们使用网络软件时,它们有的会向操作系统索要指定的端口号,有的是系统默认给一个随机的端口号
注意:1024之前的端口号已经被分配给已知的网络软件了,不能再使用。网络软件的端口号不能重复
理解端口号;当我们的主机1和主机2通过IP地址建立好连接,从主机1的QQ发送消息到主机2,这时,消息不知道是发送到主机2的QQ,飞秋还是微信,这就导致信息丢失,所以我们需要端口号来准确无误的发送到主机2的某个网络软件
67.表示客户端的类;java.net.Socket
实现步骤;1.创建一个客户端对象,构造方法绑定服务器的IP地址和端口号
2.使用对象中的方法getOutputStream来获取网络字节输出流OutputStream对象
3.使用网络字节输出流OutputStream对象中的write方法向服务器发送数据
4.使用对象中的方法getInputStream来获取网络字节输入流InputStream对象
5.使用网络字节输入流InputStream对象中的read方法来读取服务器写回的数据
5.关闭流
表示服务器端的类:java.net.ServerSocket
实现步骤;创建服务器ServerSocket对象,向系统要指定的端口号
2.利用对象的accept方法来获取发送请求的客户端对象Socket
3.使用Socket对象中的方法getOutputStream来获取网络字节输出流OutputStream对象
4.使用网络字节输出流OutputStream对象中的write方法向客户端发送数据
5.使用Socket对象中的方法getInputStream来获取网络字节输入流InputStream对象
6.使用网络字节输入流InputStream对象中的read方法来读取客户端写回的数据
7.关闭流
68.在客户端和服务器端通过i/o流对象的read方法进行数据的循环读取时,可能会发生循环阻塞,原因是read方法的:从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。在某些输入可用之前,此方法将阻塞。
产生原因:循环读取读取不到字符的结束标记,在另一主机上循环读取不到结束标记,进入死循环
解决方案:so1.shutdownOutput();使用Socket类中的shutdownOutput()方法
69.函数式接口,有且仅有一个抽象方法,你可以通过 Lambda 表达式来创建该接口的对象。Object的public方法除外。
Lambda表达式:允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
以下是lambda表达式的重要特征:
1.可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。例如:x->2*x
2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
例如:(x, y) -> x – y
3.可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
例如:(int x, int y) -> x + y
4.可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
70.使用方法引用的方式,和上面的输出是一样的,方法引用使用的是双冒号(::)list.forEach(System.out::println);
71.Lambda表达式中->将式子分成左右两部分,左边是参数,也就是函数式接口的参数,右边是所要执行的功能,也就是函数式接口的抽象方法的实现
语法格式一:五参数,无返回值 ()->System.out.println("hello");
语法格式二:有一个参数,无返回值 (x)->System.out.println(x);
语法格式三:只有一个参数,小括号可以省略不写 x->System.out.println(x);
语法格式四:有两个以上参数,有返回值,并且Lambda 体中有多条语句
Comparator<Integer> com=(x,y)->{System.out.println("hello");return Integer.comparator(x,y);};
语法格式五:若Lambda 体中只有一条语句,大括号和return可以省略不写
总结:上联;左右遇一括号省 下联:左侧推断类型省 横批:能省则省
注意:如果大括号写了,那么return就不能省,否则会报错
72.Java内置的四大核心式接口;1.Consumer<T>;消费型接口,与Supplier相反
void accept(T,t);
泛型是什么类型的参数,accept就消费(使用)什么数据
2.Supplier<T>:供给型接口 T get();用于获取泛型指定类型的参数
指定接口的参数类型,get方法就会返回什么类型的参数
3.Function<T t>;转换型接口,R apply(T t) 根据一个类型的数据,得到另一种类型的数据,将T类型转换成R类型
Function接口中的默认方法andThen()是将接口进行组合操作
4.Predicate<T>:断言型接口 boolean test(T t)
对某种数据进行判断,返回一个布尔值
74.Stream流是Lambda的衍生物,能够简化集合和数组的操作,关注的是做什么,而不是怎么做
获取流:对于Collection集合,有一个默认的方法stream方法获取流
Stream接口中也有方法of来获取流
Stream流的特点:属于管道流,只能被消费一次,第一个Stream流使用完毕,数据会流向下一个Stream流,前一个就会关闭;
Stream流中有延迟方法和终结方法(count,forEach...);
75.方法引用的前提是;对象和方法都已经存在
个人感悟:引用操作符是::,如果方法参数有函数式接口,就可以使用Lambda表达式,而Lambda表达式则可以用方法引用优化,使代码更简单。
例如:调用方法method(函数式接口); method(super::父类非静态方法);
76.方法引用:引用父类方法:super::父类方法
引用本类方法: this::本类方法
引用构造方法:本类名称::new
77.junit百盒测试:测试类:类名.test 测试方法:方法名.test
单独测试,不需要主方法:加上注解@Test
@Before
public void init()
{
System.out.println("所有方法执行前执行");
}可用于测试类中用于资源申请
@After
public void close()
{
System.out.println("所有方法执行后执行");
}可用于测试类中关闭资源
一般使用Assert类来处理结果,但是过时了
补充:@Before:修饰的方法会在测试方法之前被执行
@After:相反
78.反射:框架设计的灵魂 框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个部分封装成其他对象
个人总结:在反射中,字段(成员变量)->Filed 成员方法->Method 构造方法->Constructor
在Field类中,getDeclaredField()方法表示获取所有的成员属性,另外两种是获取公共的成员属性,在设置私有属性的值时,需提前设置setAccessible(true)暴力反射
在Method类中invoke方法是调用的意思
79.sql通用语法:1.语句以单行或多行书写,以分号结束
2.MySql数据库不区分大小写,但是关键字建议大写
80.查询数据库的字符集:show create database 数据库名;
创建数据库指定字符集:show database if not exists t_studeng chararcter set gbk;
改变数据库的字符集:alter database 数据库名 chararcter set gbk;
查询所有数据库:show databases; 查询指定数据库中的所有表:show tables from 数据库名; 展示表结构:desc 表名;复制一份表到另外一张表:create table 表名 like 表名;修改表名:alter table 表名 rename to 新表名;查看表的字符集:show table 表名 ;修改表的字符集:alter table 表名 character set gbk;
修改列:alter table 表名 change 列名 新列名 参数类型;或者 alter table 表名 modify 列名 参数类型;查看表中信息:select 字段 from 表名;*表示所有字段;
81.注意创建表最后一列不要写逗号;
82.客户端图像化工具:SQLYog