类与对象
Gary
驼峰命名规则
1、标识符(我们自己起的一个名字)
就是给类,接口,方法,变量等起名字时使用的字符序列
组成规则
英文大小写字母
数字字符
$和_
注意事项
不能以数字开头
不能是Java中的关键字(保留字)
区分大小写
2、包命名:
类似于在操作系统中,以文件夹的形式组织文件,
在Java文件中,以包来组织Java中的类,
为防止类的命名冲突,一个包下不可以定义同名的类,但是不同包可以定义同名的类。
如果不同的coder定义了相同的类名,只要保证同名的类不要出现在同一个包中就可以。
也就是说,我们通过定义包的不同解决类同名问题。
为了保证包名唯一,一域名反转的形式命名包
baidu.com
com.cskaoyan.name
com.zs.name
单级 test 一个全部小写的单词
多级包 com.cskaoyan.name 以域名反转的方式来命名,单词全部小写,单词之间以.分隔
3、类和接口命名
单个: 首字母大写,其余字母全部小写 Student
多个单词: 每个单词首字母大写,其余字母全部小写 JavaBasic MaxAge
4、变量和方法的命名:
单个: 所有字母小写 value
多个单词:第一个单词首字母小写,从第二个单词开始,每个单词首字母大写 intValue
5、常量的命名:所有字母全部大写
单个: 单词的所有字母全部大写即可 MAX IP NONE
多个单词: 每个单词全部大写,单词之间以_来分隔: MAX_AGE MAX_VALUE IP_ADDRESS
在实际开发当中,命名要遵循的一个核心原则:见名知意
Class(类)&Object(对象)
作为一种OO(面向对象)的编程的语言,Class and Object 是重要的概念
若你有C++的基础,这部分大同小异
定义
class 类名称 {
属性 (变量) ;
行为 (方法) ;
}
属性就是成员变量
方法就是操作对象的函数
Here is an example:
class Person { // 类名称首字母大写
String name ;
int age ;
public void tell() { // 没有static
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
}
实例化类
类名称 对象名称 = new 类名称 () ;
package com.wz.classandobj;
class Person {
String name ;
int age ;
public void get() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
public class TestDemo {
public static void main(String args[]) {
Person per = new Person() ;// 声明并实例化对象
per.name = "张三" ;//操作属性内容
per.age = 30 ;//操作属性内容
per.get() ;//调用类中的get()方法
}
}
内存分配
new 出来的东西,Java会通过JVM自动回收,不用像C++那样delete。
class Person {
String name ;
int age ;
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
}
public class TestDemo {
public static void main(String args[]) {
Person per1 = new Person() ; // 声明并实例化对象
per1.name = "张三" ;
per1.age = 20 ;
Person per2 = per1 ; // 引用传递
per2.name = "李四" ;
per1.tell() ;
}
}
对应的内存分配图如下:
class Person {
String name ;
int age ;
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
}
public class TestDemo {
public static void main(String args[]) {
Person per1 = new Person() ; // 声明并实例化对象
Person per2 = new Person() ;
per1.name = "张三" ;
per1.age = 20 ;
per2.name = "李四" ;
per2.age = 30 ;
per2 = per1 ;// 引用传递
per2.name = "王五" ;
per1.tell() ;
}
}
对应的内存分配图如下:
常用类
Java类库 (可参见官方的API文档)有中文的和英文的API文档
包名以java开头的包为核心包(Core Package),以javax开头的为拓展包(Extension Package)
Package | Introduction |
java.applet | applet所需要的所有的类 |
java.awt | 创建用户界面和图像的类 |
java.beans | 开发Java Bean的所有的类 |
java.io | 通过提供数据流,对象序列以及文件系统实现的系统输入和输出 |
java.lang | Java编程语言的基本库 |
java.math | |
java.net | 实现网络通信 |
java.nio | 实现nio应用 |
java.rmi | 远程方法调用相关的类 |
java.security | 网络设计安全 |
java.sql | 访问和处理来自于Java标准数据源的数据库的类 |
java.text | 自然语言处理 |
java.time | 日期,时间 |
java.util | 集和类,时间处理模式,日期时间工具等 |
要学会查看API文档来处理
数字相关的类
Short,Int,Long,Float,Double,BigInteger,BigDecimal,Random,Math(工具类)
//float a=0.12; error
float a=0.12f;
double b=0.130;
System.out.println("(1)生成随机数:"+Math.random());//[0,1]
System.out.println("(2)"+new Random().nextInt());//random
System.out.println("(3)"+new Random().nextInt(5));//[0,5)
System.out.println("(4)"+new Random().nextDouble());
IntStream ints = new Random().ints();
System.out.println(ints);
output:
(1)生成随机数:0.5745617632414949
(2)-833986099
(3)4
(4)0.3966811464700253
System.out.println("(1)"+Math.abs(5));
System.out.println("(2)"+Math.log(5));
System.out.println("(3)"+Math.round(5.5));//四舍五入
System.out.println("(4)"+Math.floor(0.1));//向下去整
System.out.println("(4)"+Math.ceil(0.1));//向下去整
output
(1)5
(2)1.6094379124341003
(3)6
(4)0.0
(4)1.0
BigInteger bigInteger = new BigInteger("515164804049");
BigInteger bigInteger1 = new BigInteger("4564949");
System.out.println(bigInteger.divideAndRemainder(bigInteger1)[0]);//商
System.out.println(bigInteger.divideAndRemainder(bigInteger1)[1]);//余数
output:
112852
1179501
String类
String a=new String("hello");//加减性能较差,不可变对象
System.out.println("(1)"+a.charAt(0));
System.out.println("(2)"+a.concat("world"));
System.out.println("(3)"+a.contains("hel"));
System.out.println("(4)"+a.endsWith("lloo"));
System.out.println("(5)"+a.equalsIgnoreCase("hEllo"));//忽略大小写的比较
System.out.println("(6)"+a.hashCode());
//int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
System.out.println("(7)"+a.indexOf("llo"));//2
System.out.println("(8)"+a.split("ll")[0]+" "+a.split("ll")[1]);//he o
System.out.println("(9)"+a.startsWith("h"));//true
System.out.println("(10)"+a.substring(2,4));//ll
System.out.println("(11)"+" 9959595".trim());//去掉字符串首尾的空格
System.out.println("(12)"+a.valueOf('z'));
output:
(1)h
(2)helloworld
(3)true
(4)false
(5)true
(6)99162322
(7)2
(8)he o
(9)true
(10)ll
(11)9959595
(12)z
StringBuffer(字符加减,同步性能好)
StringBuilder(不同布,性能更好)
append/insert/delete/replace/substring等方法
时间相关的类
java.util.Data 基本上作废(Deprecated)了,返回自1970.1.1以来的毫秒(geTime())
Date date = new Date();
System.out.println("(13)"+date.getTime());//毫秒计时
System.out.println("(13)"+date);//Sat Jun 27 23:41:57 CST 2020
//java.sql.Date 与数据库对应的
//Calendar是最好用的,但是他是abstract class(抽象类)的
Calendar gc=Calendar.getInstance();
Calendar calendar = new GregorianCalendar();
Java8 推出了 java.time
在java.util.Date类与LocalDate、LocalDateTime类之间转换中 均可以通过Instant作为中间类完成转换,Instant的使用还是比较方便的,下面介绍Instant的使用。
//java.time
System.out.println(LocalDate.now()); //2020-06-27
System.out.println(LocalTime.now());//23:44:36.119897
System.out.println(LocalDateTime.now());//2020-06-27T23:44:58.367334
//java.time时间戳
Instant time1=Instant.now();
Instant time2 = Instant.ofEpochMilli(time1.toEpochMilli());//从1970-01-01T00:00:00Z开始的毫秒值
Date dat=Date.from(time2);
System.out.println("current date="+date);//current date=Sat Jun 27 23:49:12 CST 2020
小汇总
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Main {
public static void main(String[] args) {
System.out.println("1)"+new Date());
//1)Tue Sep 22 16:16:26 CST 2020
System.out.println("2)"+LocalDate.now());
//2)2020-09-22
System.out.println("3)"+ LocalTime.now());
//3)16:16:26.275
System.out.println("4)"+ LocalDateTime.now());
//4)2020-09-22T16:16:26.275
System.out.println("5)"+ Calendar.getInstance());//Calendar is an abstrct class;
//5)java.util.GregorianCalendar[time=1600762586275,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=266,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=16,SECOND=26,MILLISECOND=275,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.out.println("6)"+ new GregorianCalendar());
//6)java.util.GregorianCalendar[time=1600762586275,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=266,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=16,SECOND=26,MILLISECOND=275,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.out.println("--------华丽的分割线-------------");
//instant
Instant instant=Instant.now();
System.out.println("7)"+instant);//不分时区的
//7)2020-09-22T08:16:26.275Z
Instant instant1=Instant.ofEpochMilli(instant.toEpochMilli());
System.out.println("8)"+instant1);
//8)2020-09-22T08:16:26.275Z
Date date=Date.from(instant1);
System.out.println("9)"+date);
//9)Tue Sep 22 16:16:26 CST 2020
}
}
格式化类
1.NumberFormat:
ex1234567->1,234,567
通用格式
//创建一个默认的通用格式
NumberFormat numberFormat = NumberFormat.getInstance();
DecimalFormat numberDecimalFormat;
//捕捉异常,以防强制类型转换出错
try {
//强制转换成DecimalFormat
numberDecimalFormat = (DecimalFormat) numberFormat;
//保留小数点后面三位,不足的补零,前面整数部分 每隔四位 ,用 “,” 符合隔开
numberDecimalFormat.applyPattern("#,####.000");
//设置舍入模式 为DOWN,否则默认的是HALF_EVEN
numberDecimalFormat.setRoundingMode(RoundingMode.DOWN);
//设置 要格式化的数 是正数的时候。前面加前缀
numberDecimalFormat.setPositivePrefix("Prefix ");
System.out.println("正数前缀 "+numberDecimalFormat.format(123456.7891));
//设置 要格式化的数 是正数的时候。后面加后缀
numberDecimalFormat.setPositiveSuffix(" Suffix");
System.out.println("正数后缀 "+numberDecimalFormat.format(123456.7891));
//设置整数部分的最大位数
numberDecimalFormat.setMaximumIntegerDigits(3);
System.out.println("整数最大位数 "+numberDecimalFormat.format(123456.7891));
//设置整数部分最小位数
numberDecimalFormat.setMinimumIntegerDigits(10);
System.out.println("整数最小位数 "+numberDecimalFormat.format(123456.7891));
//设置小数部分的最大位数
numberDecimalFormat.setMaximumFractionDigits(2);
System.out.println("小数部分最大位数 "+numberDecimalFormat.format(123.4));
//设置小数部分的最小位数
numberDecimalFormat.setMinimumFractionDigits(6);
System.out.println("小数部分最小位数 "+numberDecimalFormat.format(123.4));
}catch (Exception e){
e.printStackTrace();
}
百分比格式
//创建一个中国地区的 百分比格式
NumberFormat perFormat = NumberFormat.getPercentInstance(Locale.CHINA);
DecimalFormat percentFormat;
try {
percentFormat = (DecimalFormat) perFormat;
//设置Pattern 会使百分比格式,自带格式失效
// percentFormat.applyPattern("##.00");
//设置小数部分 最小位数为2
percentFormat.setMinimumFractionDigits(2);
System.out.println(percentFormat.format(0.912345));
} catch (Exception e) {
e.printStackTrace();
}
货币格式
//创建一个中国地区的 货币格式
NumberFormat curFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
DecimalFormat currencyFormat;
try {
currencyFormat = (DecimalFormat) curFormat;
//设置Pattern 会使百分比格式,自带格式失效
// currencyFormat.applyPattern("##.00");
System.out.println(currencyFormat.format(0.912345));
//乘法 数乘以多少 这个方法是 百分比时候 设置成100 km时候 是1000
currencyFormat.setMultiplier(100);
System.out.println(currencyFormat.format(0.912345));
} catch (Exception e) {
e.printStackTrace();
}
2.MessageFormat :
Hello{1}->Hello World
String pig = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";
Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"};
String value = MessageFormat.format(message, array);
System.out.println(value);
//ABCDEFGHIJKLMNOPQ
//格式化字符串时,两个单引号才表示一个单引号,单个单引号会被省略
String message = "oh, {0} is 'a' pig";
Object[] array = new Object[]{"ZhangSan"};
String value = MessageFormat.format(message, array);
System.out.println(value);
//oh, ZhangSan is a pig
//格式模式
String message = "oh, {0,number,#.#} is a pig";
Object[] array = new Object[]{new Double(3.1415)};
String value = MessageFormat.format(message, array);
System.out.println(value);
//oh, 3.1 is a pig
//另外一个调用方法
String message = "oh, {0} is a pig";
MessageFormat messageFormat = new MessageFormat(message);
Object[] array = new Object[]{"ZhangSan"};
String value = messageFormat.format(array);
System.out.println(value);
//oh, ZhangSan is a pig
3.DateFormat:日期输出格式
example
Date date = new Date();
//日期格式,精确到日 2017-4-16
DateFormat df1 = DateFormat.getDateInstance();
System.out.println(df1.format(date));
//可以精确到秒 2017-4-16 12:43:37
DateFormat df2 = DateFormat.getDateTimeInstance();
System.out.println(df2.format(date));
//只显示出时时分秒 12:43:37
DateFormat df3 = DateFormat.getTimeInstance();
System.out.println(df3.format(date));
//显示日期,周,上下午,时间(精确到秒)
//2017年4月16日 星期日 下午12时43分37秒 CST
DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
System.out.println(df4.format(date));
//显示日期,上下午,时间(精确到秒)
//2017年4月16日 下午12时43分37秒
DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
System.out.println(df5.format(date));
//显示日期,上下午,时间(精确到秒)
//2017年4月16日 下午12时43分37秒
DateFormat df5_1 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.CHINA);
System.out.println(df5_1.format(date));
//显示日期,上下午,时间(精确到分) 17-4-16 下午12:43
DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
System.out.println(df6.format(date));
//显示日期,时间(精确到秒) 2017-4-16 12:43:37
DateFormat df7 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
System.out.println(df7.format(date));
SimpleDateFormat
java.text.SimpleDateFormat
定义了以下模式字母(所有其他字符 'A'
到 'Z'
和 'a'
到 'z'
都被保留):
字母 | 日期或时间元素 | 表示 | 示例 |
| Era 标志符 | Text |
|
| 年 | Year |
|
| 年中的月份 | Month |
|
| 年中的周数 | Number |
|
| 月份中的周数 | Number |
|
| 年中的天数 | Number |
|
| 月份中的天数 | Number |
|
| 月份中的星期 | Number |
|
| 星期中的天数 | Text |
|
| Am/pm 标记 | Text |
|
| 一天中的小时数(0-23) | Number |
|
| 一天中的小时数(1-24) | Number |
|
| am/pm 中的小时数(0-11) | Number |
|
| am/pm 中的小时数(1-12) | Number |
|
| 小时中的分钟数 | Number |
|
| 分钟中的秒数 | Number |
|
| 毫秒数 | Number |
|
| 时区 | General time zone |
|
| 时区 | RFC 822 time zone |
|
实例参数
日期和时间模式 | 结果 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date d = new Date();
/* h 1-12输出格式: 2017-04-16 01:01:22 */
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String s = format1.format(d);
System.out.println(s);
/* H 0-23输出格式:2017-04-16 13:01:22*/
DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
s = format2.format(d);
System.out.println(s);
/* K 0-11输出格式:2017-04-16 01:01:22 */
DateFormat format3 = new SimpleDateFormat("yyyy-MM-dd KK:mm:ss");
s = format3.format(d);
System.out.println(s);
/* k 1-24输出格式: 2017-04-16 13:01:22 */
DateFormat format4 = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
s = format4.format(d);
System.out.println(s);
/* 输出格式: 20170416010122 */
DateFormat format5 = new SimpleDateFormat("yyyyMMddhhmmss");
s = format5.format(d);
System.out.println(s);
设计模式之工厂模式(factory pattern):工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。