JavaStudy总结
总!
-
-
学习的整体框架:
-
Java 定义了 4 种整数类型变量:字节型(byte)、短整型(short)、整型(int)和长整型(long)。
常量:final 数据类型 常量名
-
重要规范:
-
{}大括号里要有四个空格的缩进
-
函数和函数中间应该有一个空行 空一行
-
if和else即使只有一句话,也要加上{}
-
类名首个单词的首字母大写StudentManager,一般是名词
-
函数首个单词的首字母小写printStudentInfo(),一般以动词开头 驼峰命名法
-
-
强制类型转换:
-
1个字节=8位
byte: 1个字节,不考虑负数能表示范围是:0255(2的八次方=256),考虑正负表示范围:-128127
short:2个字节,16位 65536 0~65535
int: 4个字节,考虑正负:-21亿~+21亿
long:8个字节
float: 4个字节
double:8个字节
char字符型:2个字节,采用的是Unicode编码每个字符在编码表里面都对应一个int整数
Boolean: 只有true和false两种情况
-
数据类型转换:
1、从小到大自动类型转换
2、从大到小需要强制类型转换,可能会丢失精度
byte->short(char)->int->long->float->double
-
&&:两边的结果都是true,结果才是true
||:两边只要有一个是true,结果就是true
-
在程序运行前进行判断,若有非法输入,则使用:System.exit();
-
三目运算符号:语法:boolean ? 数1 : 数2。
-
-
数组:int[] array = new int[4];
-
java.lang.Array Index OutOf Bounds Exception: 4
数组下标越界异常(Index:bounds:边界 OutOf:超出 Exception:异常)
-
数组的排序:冒泡排序 (双重For循环)
-
快捷键集合笔记链接:D:\思途笔记\笔记\快捷键集合.md
-
instanceof:是二元运算符
instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
-
OOP: Object Oriented Programming 面对对象编程
-
类和对象:抽象、封装、继承、多态
-
数据类型的默认值:
int类型默认值是:0
double类型默认值是:0.0
boolean类型默认值是:false
String类型默认值是:null
int[]类型默认值是:null
Student[]类型默认值是:null
boolean[]类型默认值是:null
-
属性私有,通过get、set方法访问。
-
构造方法:
特点:1、方法名和类名一样 2、没有返回值
//无参构造方法
//如果不写,Java默认提供这样一个无参构造方法.
//如果你写了,Java就不会再提供这个无参构造方法
-
this代表当前对象,把通过构造方法传递过来的值,赋值给当前对象的id。
继承,重载,重写,抽象,多态
-
你继承谁你就是谁,继承是一种严格的父子关系(在父类里面抽取的属性和方法一定是所有子类所共有)
-
private:只在当前类里面可以访问(子类也不能访问)
public:任何地方都可以访问
protected:提高代码复用性。
![707_0 (1)](C:\Users\xuezihan123\AppData\Local\Temp\707_0 (1).png)
-
super();
-
重载(overload):
在同一个类里面,允许存在一个以上同名方法,只要他们参数类型和参数个数不同即可。
同一个类中看同名方法的参数列表。(构造方法重载)
-
重写/覆盖(@Override):
1、子类覆盖父类,必须保证子类权限大于父类权限才可以覆盖,否则会编译失败。
2、如果父类是private的方法,子类是默认方法,那么子类是不知道这个方法的,不是覆盖。
-
多态:
在子类中重写父类方法,在测试类中创建方法时,声明写父类 如Cal cal;
-
抽象类:
1、抽象方法是没有方法体(method),如果这个类里面有抽象方法,这个类必须变成抽象类。
2、如果这个类是抽象类,并不要求这个类一定要有抽象方法
3、抽象类里面可以有普通方法,也可以有抽象方法。
4、如果一个类是抽象类,那么这个类就不能被new实例化,只能被其他类继承。
5、抽象方法可以理解为父类(抽象类)定义的一个模板或者规范(自己本身不实现),子类必须实现这个抽象方法,如果子类不想实现这个方法,那么这个子类也必须要变成抽象类。
-
接口interface:
1.接口是一个纯粹的抽象类(接口里面所有的方法都是抽象方法),接口里面的方法都是抽象方法 public abstract。
2.接口里面所有的属性public static final
-
接口与抽象类的区别:🤕
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。另外,接口和抽象类在方法上有区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中可以有普通成员变量,接口中没有普通成员变量
-
抽象类中的抽象方法的访问类型可以是public,protected和默认类型
-
抽象类中可以包含静态方法,接口中不能包含静态方法
-
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
-
一个类可以实现多个接口,但只能继承一个抽象类。
-
-
final:(最终的意思)
final变量:这个变量就不能被修改,常量 ,接口里面: public static final double PI = 3.1415;
final类:这个类就不能被继承
final方法:这个方法就不能被重写
-
static静态属性、静态方法:(经常被写成静态类Math,ArrayUtil)
1、静态方法:如果一个static方法则最好使用【 类名 点 方法 】Student.print(),此静态方法属于这个类。静态方法中没有实例时,不能调用this super 。
2、静态属性:
3、静态的方法只能访问静态的方法和静态的属性(因为当前对象的实例可以没有创建,所以静态的方法是没办法调用非静态的方法和属性的)
4、静态的方法中不能写this、super关键字(因为当前的对象实例可能还没有创建,代表当前类对象的this还有代表父类对象的super可能都还没有创建)
5、非静态的属性和方法(实例属性和方法)必须通过new对象访问,而静态的属性和方法是属于类的,在类加载到内存中就可以访问,被所有对象所共享。
-
String:
-
== 比较的是地址 equals 比较的是内容
-
s1 = "aBC";
-
s1 = "AbC";
-
s1.equals(s2); // false 不忽略大小写
-
s1.equalsIgnorecase(s2); // true 忽略大小写
-
-
常量池问题:
-
String API:
startswith(String prefix/suffix) 以······开头 prefix 前缀 suffix 后缀
-
String、StringBuffer、StringBuilder异同点:
相同点:都是final类,都不能被继承。
不同点:1、String长度是不可改变的,StringBuffer、StringBuilder长度是可变的。
2、StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。
-
包装数据类型:
Java是纯面向对象语言,int、double都是基本数据类型。
int Integer
char Character
double Double
long Long
short Short
boolean Boolean
byte Byte
定义全局的变量是用Integer ,局部方面的话
-
🆘Static静态代码块知识点笔记 ⭐
链接:https://app.yinxiang.com/fx/31dc0cd8-c357-4674-b331-c77128ebd79e
-
ArrayList LineList HashMap HashSet:
Collecton接口常用的子接口有:List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类(链表)
Set接口常用的子类有:HashSet类、LinkedHashSet类
List允许有重复的元素,有序。
Set不予许有重复元素,无序。
-
值传递和引用传递:💖
又错了的人来回答一下:
String a = "a";
String b = "a";
这样定义的a和b指向的是字符串常量区变量,地址是一样的,即用equals为true,用==也为true。
但是
String a =new String( "a");
String b = new String( "a");
这样是定义了两个堆内存对象,只能equals,不能==
例题:
String s1=new String( ” xyz ” );
String s2=new String( ” xyz ” );//在堆中建了两个“xyz”,不是同一个
Boolean b1=s1.equals(s2);
Boolean b2=(s1==s2);
System .out.print(b1+ ” ” +b2);
答案:
TRUE FALSE
-
synchronized是Java中的关键字,是一种同步锁。
它修饰的对象有以下几种:
-
修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
-
修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
-
修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
-
修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
-
-
主键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一
标识一条记录,该属性组就可以成为一个主键 。
-
外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外
键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被
称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
-
字段属性设置:
1、not null: 不为空,表示该字段不能放“null”这个值。不写,则默认是可以为空
2、auto_increment: 设定int类型字段的值可以“自增长”,即其值无需“写入”,而会自动获得并增加
此属性必须随同 primary key 或 unique key 一起使用。primary key = unique key + not null
3、primary] key: 设定为主键。
是唯一键“加强”:不能重复并且不能使用null,并且可以作为确定任意一行数据的“关键值”,
最常见的类似:where id= 8; 或 where user_name=‘zhangsan’;
通常,每个表都应该有个主键,而且大多数表,喜欢使用一个id并自增长类型作为主键。
但:一个表只能设定一个主键。
4、unique [key] : 设定为唯一键:表示该字段的所有行的值不可以重复(唯一性)。Duplicate entry 'zhangsan' for key 'name'
5、default ‘默认值’: 设定一个字段在没有插入数据的时候自动使用的值。
6、comment ‘字段注释’
-
PRIMARY KEY 主键,不能重复,唯一确定一条记录 (unique+not null)
AUTO_INCREMENT 自动增长
varchar(10) char(10)区别:
同点:都可以最大放10个字符
不同点:char(10)不管输入的是多少都会占10个字符,例如输入名字“张三”只有两个字符,
但是使用char(10)在数据库里面还是占10个字符的空间。
使用varchar(10)最大支持是10个字符,但是实际长度就是输入字符长度,例如输入名字“张三”只有两个字符,
那么在varchar(10)里面就只占两个字符。
-
联合主键:
PRIMARY KEY(banji_id,course_id), -- 联合主键 FOREIGN KEY(banji_id) REFERENCES banji(id), -- banji_id既是联合主键又是外键 FOREIGN KEY(course_id) REFERENCES course(id) -- course_id既是联合主键又是外键);
-
多表查询:
SELECT * FROM student WHERE banji_id=2; SELECT id FROM banji WHERE `name`='java1812'; SELECT * FROM student WHERE banji_id=(SELECT id FROM banji WHERE `name`='java1812');
-
inner join(关联查询):
-
select查询:group by之后使用having
-- 4、查询该店每个栏目下挤压的货款 > 20000 SELECT cat_id,SUM(goods_number*shop_price) AS total_price FROM goods GROUP BY cat_id HAVING total_price>20000;-- having
-
模糊查找:like
1、like模糊查找用于对字符类型的字段进行字符匹配查找。
2、要查找的字符中,有两个特殊含义的字符:% , _:
2.1: %含义是:代表0或多个的任意字符
2.2: _含义是:代表1个任意字符
2.3: 这里的字符都是指现实中可见的一个“符号”,而不是字节。
3、语法:like '%关键字%'
SELECT * FROM student WHERE `name` LIKE '张%'; -- 以张开头 SELECT * FROM student WHERE `name` LIKE '张_'; -- 以张开头,而且名字是两个字 SELECT * FROM student WHERE `name` LIKE '%张%'; -- 名字里面只要有张就可以
-
分组查询:
-
范式:
第一范式:原子性
第二范式:唯一性(消除非主键依赖联合主键中的部分字段)
第三范式:独立性,消除传递依赖(非主键值不依赖于另一个非主键值,都应该依赖于主键)
-
异常:
-
ArrayIndexOutofBoundsException 数组下标越界异常
-
NullPointerException 空指针异常
-
StringIndexOutofBoundsException 字符串下标越界异常
-
ArithmeticException 算数异常
-
ClassCastException 类型转换异常
多重捕获块(多个catch)
try {
需要检测的代码(可能会抛出异常,也可能不会抛出异常)
} catch (异常的类型1 异常类型的变量1) {
捕获异常后处理异常
} catch (异常的类型2 异常类型的变量2) {
捕获异常后处理异常
} catch (异常的类型3 异常类型的变量3) {
捕获异常后处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行,例如数据库释放连接)
}
自定义异常:
1、所有的异常的都是Throwable的子类
2、如果写一个运行时异常,需要继承RuntimeException
3、如果要写一个编译时异常,继承Exception
案例:模拟银行转账,可以实现存钱和取钱的功能取钱时候如果余额不够就抛出异常
MeiQianException
-
-
JDBC:
-
JDBC开发步骤:😵
1、加载驱动Class.forName("");
2、获得连接对象Connection
3、写sql语句
4、创建Statement(一艘船)
5、执行sql语句
(1) 更新类(更改了表里面数据):delete/update/insert executeUpdate()
返回值:int,表示你影响的行数
(2)查询(没有改变表里面数据): select executeQuery()
返回值:结果集ResultSet6、关闭连接