Java 重点总结
封装性: 设置属性是private ; 对属性设置get、set方法,实现封装; 好处:保护属性 ,规范数据的内容
继承性:父子类 extends
好处:父类中包含的非私有的属性和方法,子类直接可以继承使用,减少了程序的代码,提供了程序的效率 (如果父类中有一个方法,子类可以覆盖它,该方式java中叫重写)
Java是单一继承 ,多实现(接口)
多态性:重载 和 重写 都是 java多态性 的典型体现
父类引用指向子类对象 (向上转型)
Dog d=New Dog(); //标准写法
Chongwu p = new Dog(); //多态性写法
ArrayList<String> list=New ArrayList<String>(); //标准写法
List<String > list1 = new ArrayList<String>(); //多态性写法
List<String > list1 = new LinkedList<String>(); //多态性写法
多态性(向下转型)
如果需要调用子类的特有方法,我们就需要使用多态的向下转型了 ,向下转型之前 ,需要先使用关键字instanceOf判断 是不是该子类类型 ,如果是,再强制类型转换 ,如果不是 ,则不能转换
Chongwu类是父类 ,可能具有 吃饭,睡觉,玩耍
Dog 类中包含了一个careHome的方法 ,现在想用p对象,调用careHome方法,不能实现的 Cat 类 包含一个 zhuaMouse的方法,
Chongwu p = new Dog();
If(p instanceOf Dog){
Dog d1=(Dog)p;
d 1.careHome();
}
//向下转型时必须判断对象的类型 ,
杜绝: 不能让一个本来是dog的对象 ,向下转型成cat 或者其他对象 ,
dog对象向下转型只能转回到dog对象本身。
构造函数 构造器:简便对象初始化的一种方式
- 类中不写构造函数 , java会在类编译阶段默认做一个无参数构造器
- 类中如果写一个构造器, java就不会再为它默认增加无参数构造器了
- 写一个类时, 通常加个构造器 ,一个是无参数构造器 ,另一个是自定义的构造器
- 构造函数是典型的重载形式 (重载性:一个类中,实现了方法的多样性)
- 构造函数中 this 和super的用法
This.age = age; //this指代类的当前对象
Super 指代的是父类中的某些属性或方法
This(name,age); 或者 super(name,age ) 这两种方法要写在构造函数的第一行 ,表示
This(name,age) 调用当前类的某个构造函数
super(name,age )调用父类的某个构造函数
重载性 和 重写性
重载
- 重载性发生在一个类中 ,体现一个类中方法的多样性
- 方法名相同 ,参数不同(类型 ,顺序 ,个数 )
- 重载性 并不关心 方法的 访问修饰符和返回值类型
重写
- 重写发生在具有继承关系的父子类中 ,是父子类中方法多样性的体现
- 要求与父类中方法名,参数(类型 ,顺序 ,个数 )相同
- 访问修饰符和返回值类型也相同 ,或者访问修饰符不能严于父类 ,返回值类型不能大于父类
- 当子类调用同名方法时, 会自动调用子类特有的方法体,而不会再调用父类的那个同名方法了
抽象和常量
Abstract 常用于修饰类 和方法
抽象类 :抽象类是一个模板 ,不能实例化,作用:抽取共性
抽象方法:抽象出所有子类共有的方法 ,但是并不实现,交给继承的那个子类来实现
属性 和 构造函数 不能使用abstract修饰
抽象类中既包含抽象方法,也可以包含实现了的方法 ,子类如果继承抽象类 ,必须重写抽象类中所有的抽象方法 , (如果子类不重写所有抽象方法,那么子类也要定义成抽象类)
常量 final 可以修饰类 ,属性 ,方法 ,对象 ,他与abstract是相反的,对比存在的
修饰类 , 最终类 ,不会再有子类
修饰属性 ,常量 ,值一旦定义后 ,在程序运行阶段不会被改变
修饰方法, 最终方法 ,特点不能被子类所重写
修饰对象 ,最终对象,该对象不能再接受新的指向
Final User u1 = new User(“zhangsan”,”stuo1”);
User u2 = new User(“zhangsanfeng”,”stuo2”);
U1=u2; //error ,常量问题
U1.setName(“张三”); //没有错误 ,虽然对象的指向不能变 ,但是对象中的属性值是可以改变的 。
接口
接口是特殊的类 ,为了类的多继承而发明的 , 可以间接的实现java的多继承
接口是一个规范 ,例子 :瓶盖 usb接口 打印机(墨盒 , 纸张)
接口作用:表示具有什么功能的类
Class FangDaoMen extends Men implements Suo , menling
- Public interface 接口名 ,public是默认关键字,不写也是public
- 接口中可以定义定义变量(常量),方法(抽象方法)
Int pi=3.14; //编译时 会在前面默认加入
public static final int pi=3.14;
接口中方法只声明,而不实现 ,交给实现了该接口的那个具体类去重写接口中的方法。
Void Fly(); //编译时 会在前面默认加入 public abstract void fly();
接口不能实例化接口 可以多继承 接口
Interface A extends B,C,D ( BCD都是接口)
接口是团队开发最经常用到的组件 (分层开发)
异常处理
作用 :捕获程序中事先判断好的可能出现的错误 ,当捕获到该错误时,程序并不会非法终止,而是抛出该错误信息 , 进入 catch ,最终进入finally ,程序正常终止 。
Try
Catch
Finally
Java.lang.Exception ;--所有异常的父类
编译异常 : 文件找不到异常 ,遇到该异常时 ,需要手动添加trycatch 来捕获该异常 或者在方法上声明throws Exception ,不处理异常 ,只声明有异常存在,交给下一个调用我的方法去捕获
运行异常 : 空指针异常 ,数组下标越界 , 类型转换异常 ,参数异常 ,除数非0异常
Throws Exception //声明有异常存在,交给下一个调用我的方法去捕获
Throw new Exception(“这是自定义的异常哦”);//表示在代码的某处 抛出一个自定义的新异常
基本数据类型 引用数据类型 包装类
8个 基本数据类型
Byte 1字节 -128 ~127
Short 2字节
Int 4字节 21亿
Long 8 字节 数字长度在19位 的整数 ,具有正负值
Float 4字节
Double 8字节
Boolean TRUE false
Char 使用单引号定义的单字节变量
引用数据类型
String
数组和集合
对象
包装类型
把8个基本数据类型转换为引用类型 ,就是其包装类 ,作用:提供一些常用方法,方便调用 ,或者方便数据类型之间的转换
Int -- Integer
Char -- Character
Boolean -- Boolean
Double -- Double
自动装箱
List<Object> list1 = new ArrayList<Object>();
List1.add( 11 );
List1.add( ‘ 男’ );// 11 和 ‘男’本身都是基本数据类型,这里首先将其升级为Integer和Character类型 ,再装载到list1里
自动拆箱
Integer I = new Integer( “123” );
Int newi = i.intValue(); //自动拆箱是将对象转换成基本数据类型
数组
指明数组的数据类型 ,再指明 数组的容量
Int【】 成绩={1,2,3,4,5} ; 容量是5
另一种写法
Int【】 成绩2= new int[]{1,2,3,4,5} ;
Java.util.Arrays 数组的工具类
Arrays.sort() ; //升序排列 ,只对数值和英文字符有效 ,对汉字无效
如果想实现数组的降序排列 ,需要先sort(),然后再从后先前输出
求最大,最小值 ,都是sort()后,访问数组的头和尾实现
数组的默认值 int数组 默认值是0 ,String数组默认值是null
二维数组
Int [] [] qipan = new int [15][15];
Qipan[5][7]=”*”;
字符串
String 定义完毕后 ,内容是不可变化的 。虽然我们看到内容变化了 , 相当于重新创建一个新的String对象,再将这个对象指向当前变量,对于频繁变化的字符串 ,我们使用StringBuffer对象代替它
String == 比较内存地址 equals()比较具体内容 (常用的)
“张三”.equals( name ) //这么书写 ,避免nullpointException异常
Name.equals(“张三”)
EqualsIgnoreCase()
toLowwerCase()
toUpperCase()
trim() -- 展示时,不展示字符串左右空格 ,但是实际字符串内容并不改变
split()
indexOf( String s)
lastIndexOf( String s)
substring(int i);
substring ( int I ,int j);
charAt(int I ) ;
StringBuffer
具有拼接功能的字符串 ,通常拼接sql语句时使用
Append( ) 再后面追加内容
Insert( ) 再中间最近内容
toString() 将StringBuffer对象转换为字符串对象
集合
Collection 集合的总接口
List Set Map 接口
List 接口 (可重复的 有序的)
- ArrayList 连续的 ,可以重复的 ,对查询比较方便
- LinkedList 链表 , 可以重复 , 对修改和删除更方便
- Stack 堆栈 ,后进先出
- Queue 队列 ,先进先出
Set 接口 (无序的 不可重复的)
1.HashSet ,无序的 不可重复的
2.TreeSet ,特殊的有序性 , 依然不可重复
Map (键值对的形式 存放数据 ,key 是不可重复 ,value可重复的)
- HashMap key是无序的
- TreeMap key可以实现特殊的有序性 ,
遍历map可以使用迭代器
还可以使用 for循环实现
for (Map.Entry<Integer, String> m : map.entrySet()) {
System.out.println(m.getKey()+"||"+m.getValue());
}
New HashMap < String , List<String>>();
{ “沈阳市” ,{“浑南区”,“大东区”,“铁西区”} }
集合工具类 Collections (api 方法 ,操作集合更方便)
数组工具类 Arrays
泛型 ----- 具体集合要装载哪种类型
< > ,指定了某个类型的集合 ,就不能再装载其他数据类型的数据 ,否则会抛出参数类型不匹配异常
jdbc
Class.forName();//加载某个驱动
Java的反射 forName( ) 通过一个包名.路径名.类名 ,找到该类,并且实例化该类,做一个对象出来 。
创建链接 (url ,username ,password )
通过链接 再创建数据库操作对象 statement 或者preparedStatement
Sql注入攻击:
Select * from user where name=’hh’ or 1=1 And password =’ ss’ or 1=1 ;
Ligaopeng
123456
Hh’ or 1=1
Ss’ or 1=1
为了解决sql注入攻击问题 ,jdbc提供了 preparedStatement对象 ,再对象创建时,就预编译一条sql语句 , 接下来 使用 pstat.setObject() 拼接?对应的参数 ,最后用ResultSet接受数据库返回的结果集 ,进行迭代器的迭代操作
Class.forName("fdfdsfsfd");
Connection con = DriverManager.getConnection("", "", "");
PreparedStatement pstat = con.prepareStatement("select * from user where username=? and password=?");
pstat.setObject(1, "ligaopeng");
pstat.setObject(2, "123456");
ResultSet rs = pstat.executeQuery();
Jdbc中的事务操作
Jdbc默认是自动提交事务 ,可以使用con.setAutoCommit(false);将自动提交事务设置为false。接下来实现多个sql语句的数据库操作后 , 最后在使用con.commit()方法一次性提交所有sql操作 ,手动提交事务就结束了,jdbc 又变回自动提交事务方式
Jdbc工具类 BaseDao.java
该工具类通常 包含以下方法
- 获得con对象的方法
- 关闭各个对象 ,(con stat rs)方法
- 公用的增删改方法
- 公用的查询方法
java的输入输出流
输入流 : 文件 输入到内存中的过程
输出流 : 内存中的数据 输出的 文件的过程
File 类 实例化 具体的某个文件夹 或 文件的
字节类型的 io 流 (文字 ,图片 ,视频 ,音频 )
文本
FileInputStream (”c://新建文本文件.txt”) FileOutputStream(”d://新建文本文件.txt”)
图片,音频 ,视频
DataInputStream(”c://image01.jpg”) DataOutputStream (”d://image02.jpg”)
字符类型的 io 流 (纯文字)
FileReader FileWriter
BufferedReader BufferWriter( 大文本 )
常用的类
Math 数学运算类 java.lang.Math
Calendar 日历类
SimpleDateFormat 格式化日期类型
NumberFormat 格式化数组类型
BigInteger (比long类型还大的整形数值 )
BigDecimal (针对超大整数和超大浮点数的运算类 )
System 类 (java的lang包 并不需要手动import ,系统自带lang包下的所有类 ,System,Math类)
Object 类 (toString() ,hashcode() , 所有类都具有的9个共性方法 )
Class类 (getClass() getName() getMethods() 得到属性() forname())
分层思想 (三层架构)
- 展示层 ( html app , mvc 模式 )
- 业务逻辑层(service层)
- 数据访问层 (dao 模式 )
分布式开发概述
前端 (页面展示 ,js效果)
后端 (业务逻辑处理) 两个项目通过接口访问前后台的方法 ,输入某些参数,得到具体的返回值,展示在页面
前端服务器 ngix
后端服务器 tomcat
数据库分离 主数据库 做增删改 从数据库 查询 , 主数据库通过数据库复制技术将变化及时更新到从数据库上
分布部署 :分散服务器压力 ,降低宕机风险 ,模块化的部署 ,目的解决高并发访问的问题