文章目录
1.数据类型
2.java类的构成
成员变量+构造方法+成员方法
构造方法名与类名相同
常用方法
按alt+shift+s 可调用以下三种方法
都可以选择全部/部分属性来生成
Getter/Setter:生成私有属性的Getter/Setter方法
toString:打印类的属性值
Constructors using field:可直接生成带参的构造方法
光标移动到需要导包的代码处 按ctrl+shift+o然后回车选择 可快捷导包 并删除导入了无用包的语句
3.思想
封装
修饰符范围:public>protected>default>private
成员变量封装:将修饰符变成private 然后生成getter/setter方法 其他类通过getter/setter方法取值和设值
成员方法封装:将修饰符变成private 这样其他类就不能再使用该方法
构造方法封装:私有化构造方法,不能通过new的方式创建对象
可重写一个方法让外界访问来创建对象 并升级为静态方法 直接通过类名.方法名调用
其中还涉及到单例模式这一知识点
单例模式:一个类只允许创建一个实例对象,并提供访问其唯一的对象的方式。
目的:避免频繁创建和销毁系统全局使用的对象。
可以用饿汉和懒汉两种模式去实现 代码如下:
Student.Java:
package com.packageConstruct;
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造方法私有化
private Student(){
}
//懒汉:需要才创建
static Student student=null;//静态方法只能用静态变量
public static Student createStudent(){
if(student == null){
student=new Student();
return student;
}
else return student;
}
//饿汉:先创建直接返回
static Student stu=new Student();
public static Student createStudent2(){
return stu;
}
}
Main.java
public class Main {
public static void main(String[] args) {
//用饿汉模式
Student stu=Student.createStudent();
stu.setName("ah");
Student stu2=Student.createStudent();
stu.setName("ab");
//虽然名字不同 但两个对象是同一个 所以name的值都为ab且stu和stu2的地址一样
System.out.println(stu.getName()+" "+stu2.getName());
System.out.println(stu+" "+stu2);
//用懒汉模式
Student st=Student.createStudent2();
st.setName("ah");
Student st2=Student.createStudent2();
st.setName("ab");
System.out.println(st.getName()+" "+st2.getName());
System.out.println(st+" "+st2);
}
}
static关键字:
添加static可将变量或者方法升级为静态 挂载在类上
挂载在类上的可以使用对象的变量和方法
对象的不能使用类上的变量和方法
继承
继承是为了解决成员变量以及成员方法的重复编写问题
单继承 一个类最多只能继承自一个父类 extends
多实现 一个类可以实现多个接口 逗号隔开接口名即可 implements
子类可以直接使用父类的属性和方法 也可以重写父类的方法
一个类继承一个接口 则需要实现接口中的方法 或者自己也成为一个抽象类
多态
一个父类可以有很多个不同的子类 表现出不同的模样 核心:父类引用实例化子类对象
不同的三种类:
普通类:
类中包含成员变量以及成员方法 (必须实现)
继承之后可直接获取父类的所有东西
抽象类:
抽象类中包含成员变量以及成员方法,并且允许不实现成员方法
如果父类中有抽象方法,则其子类必须实现,或者子类也成为一个抽象类
接口:
只包含抽象方法,以及静态最终变量(常量)
4.异常
发生异常会使程序运行中断
如果使用try catch将会发生异常的代码包起来之后,不会阻断程序的运行
try{
}catch(){
}finally{
}
try 将会发生异常的代码
catch 发生异常之后做的事情
finally 不管程序是否发生异常 都会执行
5.常用工具类的常用方法
String类
char charAt(int index)//返回char数组指定下标的字符
int indexOf(String str)//返回字符串所在位置的下标
String replace(oldStr,newStr)//返回旧字符替换成新字符串之后的字符串
String[ ] split(String regex)//按照指定字符去分割字符串 得到字符串数组 作为分割的字符会消失
String substring(int beginIndex, int endIndex)//截取指定索引处的子字符串并返回(左闭右开 即不包含左端点)
注意:String类型的数据比较字符串是否相等时需要使用equals()判断
Arrays(排序)
static void sort(int[ ] a) //直接使a数组变得有序
静态方法 直接通过Arrays.sort( )即可使用
Date及相关类
Date
Date date=new Date();等价于Date date=new Date(System.currentTimeMillis());
date.before(Date d1) 如果date的时间比d1早 返回true 反之false
date.after(Date d2) 如果date的时间比d2晚 返回true 反之false
如果两个时间一样 before和after都返回false
SimpleDateFormat
SimpleDateFormat sdf=new SimpleDateFormat(“格式”);//SimpleDateFormat类可用来将date对象按照格式去转化
yyyy-MM-dd HH:mm:ss 表示的格式为年-月-日 时:分:秒
format()方法将日期按照给定格式转为字符串 date->String
parse()方法 根据格式将时间的字符串转为date类型 String->Date
Calendar
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);//calendar对象.setTime()方法 将日期注入到Calendar类
calendar.getTime();//calendar对象.getTime()方法 Calendar->Date
calendar.add(int field,int amount);calendar对象.add()方法可以对日期的年月日时分秒进行加减
- field参数:
* Calendar.YEAR 年
* Calendar.MONTH 月
* Calendar.DAY_OF_MONTH 日
* Calendar.HOUR 时
* Calendar.MINUTE 分
* Calendar.SECOND 秒
综合实例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateSummary {
public static void main(String[] args) throws ParseException {
//Date常用的就是before after方法 Date date=new Date()等价于Date date=new Date(System.currentTimeMillis())
Date date=new Date();
Date date2=new Date(System.currentTimeMillis()+10*1000);//相当于现在时间+10s后的时间
System.out.println(date);
System.out.println(date.before(date2));//现在时间比10s后时间要前 所以返回true
System.out.println(date.after(date2));
//SimpleDateFormat类可用来将date对象按照格式去转化
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//format()方法将日期按照给定格式转为字符串 date->String
String s=sdf.format(date);
System.out.println(s);
//parse()方法 根据格式将时间的字符串转为date类型 String->Date
Date d=sdf.parse(s);
System.out.println(d);
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);//calendar对象.setTime()方法 将日期注入到Calendar类
Date d2=calendar.getTime();//calendar对象.getTime()方法 Calendar->Date
System.out.println(d2);
calendar.add(Calendar.YEAR,1);//给年+1
calendar.add(Calendar.MONTH,-1);//给月-1
Date d3=calendar.getTime();
System.out.println(d3);
/* add(int field,int amount)
* field参数:
* Calendar.YEAR 年
* Calendar.MONTH 月
* Calendar.DAY_OF_MONTH 日
* Calendar.HOUR 时
* Calendar.MINUTE 分
* Calendar.SECOND 秒
* */
}
}
List/Set/Map
List :存储相同类型的数据 有序
Set:存储相同类型的数据 无序 且元素不可重复
Map:存储有对应关系的一组数据 无序 需要有序可用LinkedHashMap
List常用方法:
List可存储同一类型数据 类似数组
list.iterator()获得迭代器指针 .hasNext( )作为判断条件 .next( )取值
- 定义:
List<Integer> list=new ArrayList<Integer>();
- 增:
list.add(1);//在数组末尾添加数据 ------------------------ list.add(1,3);//在下标为1的元素后插入元素3
- 删:
list.remove(2);//删除下标为2的元素
- 改:
list.set(0, 0);//将下标为0的元素值修改为0
- 单个查:
list.get(1); //获取下标为1的元素值
- 迭代查:
Iterator it = list.iterator();//list.iterator()获得迭代器指针 .hasNext( )作为判断条件 .next( )取值
while(it.hasNext()){
System.out.print(it.next()+" ");}
Set常用方法:
set无序 元素不可重复
set.iterator()获得迭代器指针 .hasNext( )作为判断条件 .next( )取值
- 定义:
Set<Integer> set=new HashSet<Integer>();
- 增:
set.add(1); //在集合末尾添加数据
- 删:
set.remove(2); //删除元素值为2的元素
set只能指定元素去删除 - 迭代查:
Iterator it=set.iterator();//set.iterator()获得迭代器指针 .hasNext( )作为判断条件 .next( )取值
while(it.hasNext()){
System.out.println(it.next());} - 清空:
set.clear(); //set.clear() 清空set集合
Map常用方法:
Map存储有对应关系的一组数据 key可以唯一确定一个(一组)value
通过map.keySet().iterator得到迭代器 .hasNext( )作为判断条件 .next( )得到key
- 定义:
Map<Character,Integer> map=new HashMap<Character,Integer>();
- 增:
map.put(key,value);
- 单个查:
map.get(key); //得到对应的value;
- 迭代查:
//Iterator的泛型和key的泛型保持一致 value自动与Map中value的类型匹配
Iterator it=map.keySet().iterator();//通过map.keySet().iterator得到迭代器 .hasNext( )作为判断条件 .next( )得到key
while(it.hasNext()){
Character key=it.next();//迭代对象.next得到key
Integer value=map.get(key);//map.get(key)得到value
System.out.println(key+"\t"+value);}
List实例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(1);//在数组末尾添加数据
list.add(2);
list.add(1,3);//在下标为1的元素后插入元素3
System.out.println(list);
list.remove(2);//删除下标为2的元素
System.out.println(list);
list.set(0, 0);//将下标为0的元素值修改为0
System.out.println(list);
Integer i=list.get(0);//得到下标为0的元素值
Iterator it = list.iterator();//迭代输出数组里的值
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}
Set实例:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest {
//set是集合 有互异性 不能存放相同值
public static void main(String[] args) {
Set<Integer> set=new HashSet<Integer>();
//set.add(元素值)添加元素
set.add(1);
set.add(2);
set.add(3);
System.out.println(set);
//set.remove(元素值)删去固定元素
set.remove(1);//set只能指定特定元素值然后去删除
System.out.println(set);
//set.iterator()生成迭代器
Iterator<Integer> it=set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
set.clear();//set.clear() 清空set集合
System.out.println(set);
System.out.println(set.isEmpty());//set.isEmpty()判断set集合是否为空
//set没有get方法 只能转成其他类型去get
}
}
Map实例:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
//统计字符串中每个字符出现的次数
public class MapTest {
public static void main(String[] args) {
String str1="aduhakjfihnioalkfmdszs";
char[] str=str1.toCharArray();
Map<Character,Integer> map=new HashMap<Character,Integer>();
for(char c:str)
{
if(null == map.get(c)){
map.put(c,1);
}
else{
int sum=map.get(c);
sum++;
map.put(c,sum);
}
}
//Iterator的泛型和key的泛型保持一致 value自动与Map中value的类型匹配
Iterator<Character> it=map.keySet().iterator();//通过map.keySet().iterator得到迭代器
while(it.hasNext()){
Character key=it.next();//迭代对象.next得到key
Integer value=map.get(key);//map.get(key)得到value
System.out.println(key+"\t"+value);
}
}
}
Map+List实例:发牌
规则:52张扑克牌 每个人发三张并打印出来 玩家人数不固定
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
public class GoldenFlower {
public static void main(String[] args) {
//创建牌 洗牌 发牌 打印出每个人所拥有的牌
//创建牌
List<String> poker=new ArrayList<String>();
for(int i=1;i<14;i++){
String size=String.valueOf(i);
if(size.equals("1"))
size="A";
else if(size.equals("11"))
size="J";
else if(size.equals("12"))
size="Q";
else if(size.equals("13"))
size="K";
poker.add("黑桃"+size);
poker.add("红心"+size);
poker.add("方块"+size);
poker.add("梅花"+size);
}
System.out.println(poker);
//洗牌
for(int i=0;i<100;i++){
Random random=new Random();
int one=random.nextInt(52);
int two=random.nextInt(52);
String onePoker=poker.get(one);
String twoPoker=poker.get(two);
poker.set(one,twoPoker);
poker.set(two,onePoker);
}
System.out.println(poker);
//发牌
LinkedHashMap<String,List<String>> map=new LinkedHashMap<String,List<String>>();
int peopleNum = 15;
for(int i=0;i<peopleNum;i++)
map.put("赌王"+i,new ArrayList<String>());
System.out.println(map);
for(int i=0;i<peopleNum*3;i++)
{
//先取出这个人手里的牌 然后加上发的牌
List<String> pokerOwn=map.get("赌王"+i%peopleNum);
String pokerGiveOut=poker.get(i);//获取现在要发的牌
pokerOwn.add(pokerGiveOut);
}
Iterator<String> it=map.keySet().iterator();
while(it.hasNext()){
String key=it.next();
System.out.println(key);
List<String> list=map.get(key);
System.out.println(list);
}
}
}
运行结果:
分别是创建牌结果、洗牌结果、创建每个人所拥有牌的Map结果、给每个人发三张牌之后结果
6.jdbc对数据库进行增删改查
1.下载mysql-connector-java.jar包
2.打开myeclipse 复制jar包到项目下 任何一个目录都可以 然后右击jar包 bulid path->add to bulid path 结果如下:
3.理论步骤:
注:PreparedStatement类中可以?来传参 Statement类只能执行静态sql语句 且PreparedStatement是预编译的 对于批量处理可以大大提高效率所以用PreparedStatement即可
4.常用代码
实际操作中前两句是固定的 所以一般被作成工具类 其他类直接调用即可
工具类代码://这里有一个数据库名需要改
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil{
public static Connection getCon(){
try {
//1.加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8", "root", "root");
return con;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
调用方法:
需要获取数据库的类中直接输入以下代码即可获得连接:
Connection con = JdbcUtil.getCon();
java操作数据库常用代码:
查询类:
步骤:
1.获取数据库连接 Connection con = JdbcUtil.getCon();
2.编写sql String sql = "select 列名1,列名2 from 表名 where name=?";
3.定义PreparedStatement和ResultSet对象分别为ps和res并设置为空:
4.ps向数据库发送sql语句 ps = con.prepareStatement(sql);
5.sql有参就用ps传参 ps.setString(参数序号, 参数值);
6.数据库查询的结果发给res 然后res.next()去迭代 res.getString( )或者res.getInt( )去获取值
查 代码:
Connection con = JdbcUtil.getCon();
//不要写select * 以防后期打印出结果却不知道对应哪个属性
String sql = "select 列名1,列名2 from 表名 where name=?";
PreparedStatement ps = null;
ResultSet res = null;
try {
ps = con.prepareStatement(sql);
ps.setString(1, name);//表示给sql的第一个参数赋值name
res = ps.executeQuery();
if(res.next()){//这里查询结果应该是一条数据用if 多条应该用while
res.getString(1);//获得第一列的数据
res.getString("name");//获得第二列的数据 第二列列名为name
}
} catch (SQLException e) {
e.printStackTrace();
}
}
增删改类:
步骤:
1.获取数据库连接
2.编写sql
3.定义PreparedStatement对象ps并设置为空:
4.如果sql有参就传参 然后ps.execute()向数据库发送sql语句
5.没有异常则操作成功
增 代码:
Connection con = JdbcUtil.getCon();
String sql = "insert into 表名 (列名x,列名y) values(?,?)";
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
ps.setString(1,"想传的参数");
ps.setString(2,"想传的参数");
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
改 代码:
Connection con = JdbcUtil.getCon();
String sql = "update 表名 set 属性名=新属性值 where 条件;";
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
ps.setString(1,"想传的参数");//可有可无
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
删 代码:(关联表删除要考虑中间异常 编写回滚语句)
原理:
因为在删除时可能会有相关联的表 需要先删除副表(两个表的关系表) 再删除主表
而可能删除完副表数据之后发生异常导致主表数据未能被删除 此时应该执行回滚操作 恢复到副表被删除前
所以代码需要先关闭数据库操作自动提交 主表也删除后再手动提交 代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class delete {
public static void main(String[] args) throws SQLException {
Connection con = JdbcUtil.getCon();
PreparedStatement ps = null;
try {
con.setAutoCommit(false);//关闭自动提交
String sql = "delete from 副表名 where 副表属性 = (select 主副表皆有属性 from 主表名 where 主表属性=?)";
ps = con.prepareStatement(sql);
ps.setString(1, "要删除属性的参数");
ps.execute();
//假设两条sql中间会发生异常
sql = "delete from 主表名 where 属性=?";//删除主表
ps = con.prepareStatement(sql);
ps.setString(1, "要删除属性的参数");
ps.execute();
con.commit();//主表也删除成功 手动提交
} catch (Exception e) {
e.printStackTrace();
con.rollback();//回滚操作
} finally{
ps.close();
con.close();
}
}
}
注:异常有些多 就直接主函数那里抛出SQLException了
7.综合实例 学生选课
点这里跳转