Java学习系列第2课--Java语法及面向对象
Posted wozhuzaisi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习系列第2课--Java语法及面向对象相关的知识,希望对你有一定的参考价值。
分享提纲:
2.6 Java StringBuffer 和 StringBuilder 类
2.11 Java 流(Stream)、文件(File)和IO
2.13 Java 重写(Override)与重载(Overload)
本文主要介绍下Java程序的特点(不同于php的地方)和面向对象的一些特点
1. Java程序特点
【示例代码】
1 public class HelloWorld { 2 /* 第一个Java程序 3 * 它将打印字符串 Hello World 4 */ 5 public static void main(String []args) { 6 System.out.println("Hello World"); // 打印 Hello World 7 } 8 }
执行过程如下(图像演示):
C : > javac HelloWorld.java C : > java HelloWorld Hello World
1)【基本语法】
a)【大小写敏感】
Java的类和函数是大小写敏感的,这一点和PHP不同,PHP的类和函数的大小写不敏感
b)【源文件名】
--【一个文件只能有一个类】源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。
-- PHP没有这样的要求,因为PHP本身就是解释型的语言,不需要编译,也不需要生成编译文件类似 .class的文件
c)【主方法入口】
--必须有main方法(静态方法):所有的Java 程序由public static void main(String []args)方法开始执行。
--【也有例外】
java很多知识的,如果是单纯的javaApplication(java应用程序)应该有main()函数作为入口,但是像jsp或者是applet等都是不需要main()函数的
d)【每个变量都要先定义,并制定类型】
-- 这也是与PHP语言的不同点
2)【字符串】
a)【必须用双引号引着】
b) 【连接符】java中的字符串的链接符号是 "+", 不像PHP中是 ".",因为 "." 在Java中是 类中的变量的链接符。
3)【变量】
a)变量必须执行类型,且先定义
b)【种类】
--【概述】
Java有两大数据类型,内置数据类型 和 引用数据类型
内置数据类型:
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 byte, short, int, long, float, double, boolean, char
引用数据类型:
--在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等。变量一旦声明后,类型就不能被改变了。 -- 对象、数组都是引用数据类型。 --所有引用类型的默认值都是null。 -- 一个引用变量可以用来引用与任何与之兼容的类型。 -- 例子:Site site = new Site("Runoob")。
c)【常量】
-- 在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似
4)【Java数组】
a)数组是储存在堆上的对象,可以保存多个同类型变量。
5)【Java枚举】
a)Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。
b)【语法】
class FreshJuice { enum FreshJuiceSize{ SMALL, MEDUIM, LARGE } FreshJuiceSize size; }
6)【Java修饰符】
-- 访问修饰符 分类如下
a) 默认的,也称为 default,在同一包内可见,不使用任何修饰符。 b) 私有的,以 private 修饰符指定,在同一类内可见。 c) 共有的,以 public 修饰符指定,对所有类可见。 d) 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。
-- 非访问修饰符:
a)【Synchronized 修饰符】: -- Synchronized 关键字声明的方法同一时间只能被一个线程访问。Synchronized 修饰符可以应用于四个访问修饰符。 -- public synchronized void showDetails(){ ....... } b)【Transient 修饰符】: --序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。 --该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。 -- 实例 public transient int limit = 55; // 不会持久化 public int b; // 持久化 c) 【Volatile修饰符】 --volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 -- 一个 volatile 对象引用可能是 null。
7)【Java编译制定在制定目录】
2. Java面向对象
【代码示例】
该文件名为 TestJavaClass.java ,对应文件里唯一的一个 public的类的类名。
实现的功能就是 示例化一个 狗的对象,同时设置狗的年龄并得到该年龄,然后输出.
javac TestJavaClass.java
java TestJavaClass
1 //1. 入口测试类 2 public class TestJavaClass 3 {//{{{ 4 public static void main(String []args) 5 {//{{{ 6 //注意点1:实例化要制定类型 TestDog 7 //注意点2:java程序中的字符串必须是 双引号引着 8 TestDog testDog = new TestDog("Tom"); 9 testDog.run(); 10 }//}}} 11 12 }//}}} 13 14 //2.测试小狗类 15 class TestDog 16 {//{{{ 17 String name; 18 int age; 19 //构造函数 20 public TestDog (String name) 21 {//{{{ 22 System.out.println("这条狗叫 " + name); 23 }//}}} 24 25 //运行 26 public void run() 27 {//{{{ 28 System.out.println("01 开始运行\\n"); 29 //注意点3:类的内部调动函数,直接写 setAge(dogAge) 30 setAge(10); 31 int dogAge = getAge(); 32 System.out.println("02 狗的年龄是 " + dogAge); 33 }//}}} 34 35 //获取 36 public int getAge() 37 {//{{{ 38 return age; 39 }//}}} 40 41 //设置 42 public void setAge(int ageValue) 43 {//{{{ 44 //注意点4:类的内部调动类的成员变量,直接写 age 45 age = ageValue; 46 }//}}} 47 48 }//}}}
1)【Java的类和对象】
a)【调用函数和变量】
类内部调用函数,直接就是 函数名本身,直接写 setAge(dogAge),变量也是直接写 age
b)【类的修饰】
PHP中类的修饰,最多就是 抽象类为 abstract class ,但是在 Java中一个文件中必须有一个 public class,且为该文件的名。
c)【定义类的函数】
-- PHP中常见的是 public function functionName()
-- 在Java中,则不需要 fuction的说明,但是要执行返回值类型, public void functionName()
d)【构造方法】
--PHP中的构造方法是 public function __construct(){} ,且只能有一个
--Java的构造方法可以有多个,在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法,从而实现不同情况下走不同的构造方法。
例如:
public class A{ public A(){ System.out.println("调用了A的无参构造函数"); } public A(String mess){ System.out.println("调用了A的有参的构造函数\\n"+ "参数内容为:"+mess); } }
2)【类的一些注意点】
a)【import语句】
-- 【位置】如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
-- 【作用范围】import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明
3)【Java Number 类】
a)【产生原因】
在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类
b)【包装类】
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
c)【Number子类方法】
4)【Java Character 类】
a)【单个字符】Character 类用于对单个字符进行操作。
b)【代码示例】
// 原始字符 \'a\' 装箱到 Character 对象 ch 中 Character ch = \'a\'; // 原始字符 \'x\' 用 test 方法装箱 // 返回拆箱的值到 \'c\' char c = test(\'x\');
5)【Java String 类】
a)【创建字符串】
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
public class StringDemo{ public static void main(String args[]){ char[] helloArray = { \'r\', \'u\', \'n\', \'o\', \'o\', \'b\'}; String helloString = new String(helloArray); System.out.println( helloString ); } }
b)【不可修改性】
String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
6)【Java StringBuffer 和 StringBuilder 类】
a)【可修改】相对String类的不可改变,当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
b)【区别】
StringBuilder 类速度快,但是不是线程安全的
StringBuffer 类则是 线程安全的,一般建议使用 StringBuilder类,速度快
c)【代码示例】
1 2 3 public class Test{ 4 public static void main(String args[]){ 5 StringBuffer sBuffer = new StringBuffer("菜鸟教程官网:"); 6 sBuffer.append("www"); 7 sBuffer.append(".runoob"); 8 sBuffer.append(".com"); 9 System.out.println(sBuffer); 10 } 11 } 12
7)【Java 数组】
a)【定义】
-- Java 语言中提供的数组是用来存储固定大小的同类型元素。
-- 相比而言PHP的数组就强大很多,大小不固定,类型也不限制
b)【声明变量】
dataType[] arrayRefVar; // 首选的方法 或 dataType arrayRefVar[]; // 效果相同,但不是首选方法
c)【创建数组】
-- 方法1: Java语言使用new操作符来创建数组
arrayRefVar = new dataType[arraySize];
--方法2:直接创建
dataType[] arrayRefVar = {value0, value1, ..., valuek};
d)【多维数组】
--【定义】: 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
--【动态初始化】:
1. 直接为每一维分配空间,如 int a[][] = new int[2][3];
2. 从最高维开始,分别为每一维分配空间
//二维数组动态初始化 String s[][] = new String[2][]; s[0] = new String[2]; s[1] = new String[3]; s[0][0] = new String("Good"); s[0][1] = new String("Luck"); s[1][0] = new String("to"); s[1][1] = new String("you"); s[1][2] = new String("!");
c)【Arrays 类】
-- 【所属包】java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的
-- 【常见方法】赋值(fill), 排序( sort), 比较(equals), 查找(binarySearch)
8)【Java 日期时间】
a)【Date对象】
-- ava.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
Date对象,提供了toString()等10种方法。
-- 举例:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用 toString() 函数显示日期时间 System.out.println(date.toString()); } }
b)【SimpleDateFormat类】
-- 【定义】SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
--【举例】
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd \'at\' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } } //输出 Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
-- 【parse()方法】SimpleDateFormat类的parse()方法可以解析字符串
代码如下:
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } }
运行结果如下:
$ java DateDemo 1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java DateDemo 2007-12-01 2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
c)【printf方法】
-- printf方法可以很轻松地格式化时间和日期。使用两个字母格式,它以t开头并且以下面表格中的一个字母结尾。
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 显示格式化时间 System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
//输出 Current Date/Time : Sat Dec 15 16:37:57 MST 2012
d)【Java 休眠(sleep)】
-- 【作用】sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。
-- 【实现】导包 import java.util.*; 使用 Thread.sleep(1000*3); // 休眠3秒
e)【Calendar类】
-- 【概述】
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
-- 【代码示例】
Calendar c1 = Calendar.getInstance(); // 获得年份 int year = c1.get(Calendar.YEAR); // 获得月份 int month = c1.get(Calendar.MONTH) + 1; // 获得日期 int date = c1.get(Calendar.DATE); // 获得小时 int hour = c1.get(Calendar.HOUR_OF_DAY); // 获得分钟 int minute = c1.get(Calendar.MINUTE); // 获得秒 int second = c1.get(Calendar.SECOND); // 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推) int day = c1.get(Calendar.DAY_OF_WEEK);
f) 【GregorianCalendar类】
-- 【概述】
Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这些代表公历定义的两个时代
-- 【代码示例】
import java.util.*; public class GregorianCalendarDemo { public static void main(String args[]) { String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int year; // 初始化 Gregorian 日历 // 使用当前时间和日期 // 默认为本地时间和时区 GregorianCalendar gcalendar = new GregorianCalendar(); // 显示当前时间和日期的信息 System.out.print("Date: "); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time: "); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); // 测试当前年份是否为闰年 if(gcalendar.isLeapYear(year)) { System.out.println("当前年份是闰年"); } else { System.out.println("当前年份不是闰年"); } } }
9)【Java 正则表达式】
a)【包含3个类】
-- 【Pattern 类】
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
--【Matcher 类】
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象
--【PatternSyntaxException类】
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
b)【捕获组】
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
c)【代码示例】
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ){ // 按指定模式在字符串查找 String line = "This order was placed for QT3000! OK?"; String pattern = "(\\\\D*)(\\\\d+)(.*)"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern); // 现在创建 matcher 对象 Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Found value: " + m.group(0) ); System.out.println("Found value: " + m.group(1) ); System.out.println("Found value: " + m.group(2) ); } else { System.out.println("NO MATCH"); } } }
以上实例编译运行结果如下:
Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT Found value: 3000
d)【一些方法】
-- 【Matcher 类的方法】
索引方法:start() end()
10)【Java方法】
a)【可变参数】
方法的可变参数的声明如下所示:
typeName... parameterName
代码示例如下:
public class VarargsDemo { public static void main(String args[]) { 2018面向对象程序设计(Java)第7周学习指导及要求201771010110孔维滢面向对象程序设计(Java)第7周学习指导及要求