構(gòu)造函數(shù):
構(gòu)造函數(shù)的作用 : 給對(duì)應(yīng)的對(duì)象進(jìn)行初始化果覆。
構(gòu)造函數(shù)的定義的格式:
修飾符 函數(shù)名(形式參數(shù)){
函數(shù)體...
}構(gòu)造函數(shù)要注意的細(xì)節(jié):
1. 構(gòu)造函數(shù) 是沒有返回值類型的
2. 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致
3. 構(gòu)造函數(shù)并不是由我們手動(dòng)調(diào)用的象颖,而是在創(chuàng)建對(duì)應(yīng)的對(duì)象時(shí)姑蓝,jvm就會(huì)主動(dòng)調(diào)用到對(duì)應(yīng)的構(gòu)造函數(shù)
4. 如果一個(gè)類沒有顯式的寫上一個(gè)構(gòu)造方法時(shí),那么java編譯器會(huì)為該類添加一個(gè)無參的構(gòu)造函數(shù)的
5. 如果一個(gè)類已經(jīng)顯式的寫上一個(gè)構(gòu)造方法時(shí),那么java編譯器則不會(huì)再為該類添加一個(gè)無參的構(gòu)造方法
6. 構(gòu)造函數(shù)是 可以在一個(gè)類中以函數(shù)重載的形式存在多個(gè)的疑問:創(chuàng)建對(duì)象時(shí)闸迷,jvm就會(huì)調(diào)用到對(duì)應(yīng)的構(gòu)造方法教沾,那么我們以前沒有學(xué)構(gòu)造方法沾瓦,那么以前創(chuàng)建對(duì)象時(shí),jvm是否 也會(huì)調(diào)用構(gòu)造方法呢准谚?如果有挫剑?構(gòu)造方法從何而來呢?
會(huì)調(diào)用柱衔, java編譯器在編譯的 時(shí)候給加上去的樊破。-
jdk提供了一個(gè)java開發(fā)工具(javap.exe)給我們進(jìn)行反編譯的。
- javap 反編譯工具的使用格式:
javap -c -l -private 類名
- javap 反編譯工具的使用格式:
疑問: java編譯器添加的無參構(gòu)造方法的權(quán)限修飾符是什么唆铐?
與類的權(quán)限修飾是一致的捶码。-
構(gòu)造函數(shù)與普通函數(shù)的區(qū)別:
- 返回值類型的區(qū)別:
1. 構(gòu)造函數(shù)是沒有返回值類型的
2. 普通函數(shù)是有返回值類型的, 即使函數(shù)沒有返回值, 返回值類型也要寫上void - 函數(shù)名的區(qū)別:
1. 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致
2. 普通函數(shù)的函數(shù)名只要符合標(biāo)識(shí)符的命名規(guī)則即可 - 調(diào)用方式的區(qū)別:
1. 構(gòu)造函數(shù)是在創(chuàng)建對(duì)象的時(shí)候由jvm調(diào)用的
2. 普通函數(shù)是由我們使用對(duì)象調(diào)用的, 一個(gè)對(duì)象可以對(duì)象多次普通的函數(shù) - 作用上的區(qū)別:
1. 構(gòu)造函數(shù) 的作用用于初始化一個(gè)對(duì)象
2. 普通函數(shù)是用于描述一類事物的公共行為的
- 返回值類型的區(qū)別:
//嬰兒類
class Baby{
int id; //身份證
String name; //名字
//構(gòu)造函數(shù)
public Baby(int i , String n){
id = i;
name = n;
System.out.println("baby的屬性初始化完畢!或链!");
}
//無參 的構(gòu)造函數(shù)
public Baby(){
System.out.println("無參的構(gòu)造函數(shù)被調(diào)用了..");
}
//哭
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
class Demo2
{
public static void main(String[] args)
{
//創(chuàng)建一個(gè)baby對(duì)象
Baby b1 = new Baby(110,"狗娃"); //嬰兒誕生 白戶
System.out.println("編號(hào):"+ b1.id +" 姓名:"+ b1.name);
b1.cry();
b1.cry();
/*
//黑戶
Baby b2 = new Baby();
new Baby();
b2.id = 112;
b2.name = "狗剩";
System.out.println("編號(hào):"+ b2.id +" 姓名:"+ b2.name);
*/
}
}
構(gòu)造代碼塊
構(gòu)造代碼塊的作用 : 給對(duì)象進(jìn)行統(tǒng)一的初始化
構(gòu)造函數(shù)的作用 : 給對(duì)應(yīng)的對(duì)象進(jìn)行初始化
構(gòu)造代碼塊的格式 :
{
構(gòu)造代碼塊
}
注意 : 構(gòu)造代碼塊的大括號(hào)必須位于成員位置上惫恼。-
代碼塊的類別 :
- 構(gòu)造代碼塊
- 局部代碼塊 : 大括號(hào)位于方法之內(nèi)
作用 : 縮短局部變量的生命周期, 節(jié)省一點(diǎn)點(diǎn)內(nèi)存 - 靜態(tài)代碼塊 : static
class Baby{
int id; //身份證
String name; //名字
//構(gòu)造代碼塊...
{
//System.out.println("構(gòu)造代碼塊的代碼執(zhí)行了......");
}
//帶參構(gòu)造函數(shù)
public Baby(int i , String n){
id = i;
name = n;
}
//無參構(gòu)造方法
public Baby(){
}
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
class Demo4
{
public static void main(String[] args)
{
Baby b1 = new Baby(110,"狗娃"); // 狗娃 狗剩 鐵蛋
System.out.println("編號(hào):"+ b1.id + " 名字:"+b1.name);
/*
System.out.println("編號(hào):"+ b1.id + " 名字:"+b1.name);
new Baby(112,"狗剩");
new Baby();
*/
}
}
- 構(gòu)造代碼塊要注意的事項(xiàng):
- java編譯器編譯一個(gè)java源文件的時(shí)候,會(huì)把成員變量的聲明語句提前至一個(gè)類的最前端
- 成員變量的初始化工作其實(shí)都在在構(gòu)造函數(shù)中執(zhí)行的
- 一旦經(jīng)過java編譯器編譯后澳盐,那么構(gòu)造代碼塊的代碼塊就會(huì)被移動(dòng)構(gòu)造函數(shù)中執(zhí)行祈纯,是在構(gòu)造函數(shù)之前執(zhí)行的,構(gòu)造函數(shù)的中代碼是最后執(zhí)行的
- 成員變量的顯示初始化與構(gòu)造代碼塊 的代碼是按照當(dāng)前代碼的順序執(zhí)行的
權(quán)限修飾符
- 介紹 : 權(quán)限修飾符就是控制被修飾的成員的范圍可見性
- 關(guān)鍵字:
- public(公共)
- protected(受保護(hù))
- default(缺省)
- private (大到小)
public protected default private
同一個(gè)類 true true true true
同一個(gè)包 true true true false
子父類 true true false false
不同包 true false false false
- 注意: 在不同包下面只有public 與 protected 可以訪問叼耙,而且protected必須是在繼承關(guān)系下才能夠訪問
打jar包
- 如何打jar包? 需要使用到j(luò)dk的開發(fā)工具(jdk\bin\jar.exe)
- jar的用法:
使用格式 : jar cvf jar文件的名字 class文件或者是文件夾 - 打jar包要注意的事項(xiàng):
- 一個(gè)程序打完了jar之后 必須要在清單文件上指定入口類: 格式 Main-Class: 包名.類名
- jar包雙擊運(yùn)行僅對(duì)于圖形化界面的程序起作用腕窥,對(duì)控制臺(tái)的程序不起作用
- jar文件的作用:
- 方便用戶快速運(yùn)行一個(gè)項(xiàng)目
- 提供工具類以jar包的形式給別人使用
- 如果其他人使用jar包里面的類, 必須要先設(shè)置classpath(出現(xiàn)classpath-設(shè)置class文件的所在路徑)路徑: set classpath ./myUtil.jar;
jre = jvm+ 核心類庫(kù)
package qq;
import javax.swing.*;
class Demo
{
public static void main(String[] args)
{
System.out.println("QQ程序..");
JFrame frame = new JFrame("QQ程序");
frame.setSize(400,500);
frame.setVisible(true); //設(shè)置窗口可見。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
模板模式
解決某類事情的步驟有些是固定的筛婉,有些是會(huì)發(fā)生變化的簇爆,那么這時(shí)候我們可以為這類事情提供一個(gè)模板代碼,從而提高效率
-
模板模式的步驟:
- 先寫出解決該類事情其中 的一件的解決方案
- 分析代碼爽撒,把會(huì)發(fā)生變化的代碼抽取出來獨(dú)立成一個(gè)方法, 把該方法描述成一個(gè)抽象的方法
- 使用final修飾模板方法入蛆,防止別人 重寫你的模板方法
需求: 編寫一個(gè)計(jì)算程序運(yùn)行時(shí)間的模板
abstract class MyRuntime{
public final void getTime(){
long startTime = System.currentTimeMillis(); //記錄開始的時(shí)間
code();
long endTime = System.currentTimeMillis(); //記錄結(jié)束的時(shí)間.
System.out.println("運(yùn)行時(shí)間 :"+ (endTime-startTime));
}
public abstract void code();
}
class Demo11 extends MyRuntime
{
public static void main(String[] args)
{
Demo11 d = new Demo11();
d.getTime();
}
//code方法內(nèi)部就寫要計(jì)算運(yùn)行時(shí)間的代碼;
public void code(){
int i = 0;
while(i<100){
System.out.println("i="+i);
i++;
}
}
}
finally 塊
- finally塊的使用前提是必須要存在try塊才能使用
- finally塊的代碼在任何情況下都會(huì)執(zhí)行的硕勿,除了jvm退出( System.exit(0) )的情況
- finally非常適合做資源釋放的工作哨毁,這樣子可以保證資源文件在任何情況下都會(huì)被釋放
- try塊的三種組合方式:
- 比較適用于有異常要處理,但是沒有資源要釋放的
try{
可能發(fā)生異常的代碼
}catch(捕獲的異常類型 變量名){
處理異常的代碼
}
- 比較適用于既有異常要處理又要釋放資源的代碼
try{
可能發(fā)生異常的代碼
}catch(捕獲的異常類型 變量名){
處理異常的代碼
}finally{
釋放資源的代碼;
}
- 比較適用于內(nèi)部拋出的是運(yùn)行時(shí)異常源武,并且有資源要被釋放
try{
可能發(fā)生異常的代碼
}finally{
釋放資源的代碼;
}
class Demo
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
div(4,0);
}
public static void div(int a, int b){
try{
if(b==0){
System.exit(0);//退出jvm
}
int c = a/b;
System.out.println("c="+ c);
}catch(Exception e){
System.out.println("出了除數(shù)為0的異常...");
throw e;
}finally{
System.out.println("finall塊的代碼執(zhí)行了..");
}
}
}
- fianlly釋放資源的代碼
import java.io.*;
class Demo
{
public static void main(String[] args)
{
FileReader fileReader = null;
try{
//找到目標(biāo)文件
File file = new File("f:\\a.txt");
//建立程序與文件的數(shù)據(jù)通道
fileReader = new FileReader(file);
//讀取文件
char[] buf = new char[1024];
int length = 0;
length = fileReader.read(buf);
System.out.println("讀取到的內(nèi)容:"+ new String(buf,0,length));
}catch(IOException e){
System.out.println("讀取資源文件失敗....");
}finally{
try{
//關(guān)閉資源
fileReader.close();
System.out.println("釋放資源文件成功....");
}catch(IOException e){
System.out.println("釋放資源文件失敗....");
}
}
}
}
包
java中的包就相當(dāng)于windows文件夾
-
包的作用:
- 解決類名重復(fù)產(chǎn)生沖突的問題
- 便于軟件版本的發(fā)布
定義包的格式:package 包名
包名命名規(guī)范:包名全部小寫
-
包語句要注意的事項(xiàng):
- package語句必須位于java文件中中第一個(gè)語句
- 如果一個(gè)類加上了包語句扼褪,那么該類的完整類名就是: 包名.類名
- 一個(gè)java文件只能有一個(gè)包語句
- 問題 : 每次編譯的時(shí)候都需要自己創(chuàng)建一個(gè)文件夾,把對(duì)應(yīng) 的class文件存儲(chǔ)到文件夾中粱栖。煩;敖健!闹究!
解決方法: javac -d 指定類文件的存放路徑 java源文件
package aa;
class Demo1
{
public static void main(String[] args)
{
System.out.println("這個(gè)是Demo1的main方法...");
}
}
導(dǎo)入包的一些注意點(diǎn)
問題: 當(dāng)有了包之后類與類之間的訪問每次都必須要寫上包名, 如何避免這種情況 ?
解決方案 : sun提供導(dǎo)包語句讓我們解決該問題導(dǎo)包語句作用 : 簡(jiǎn)化書寫 ( 誤區(qū): 把一個(gè)類導(dǎo)入到內(nèi)存中 )
導(dǎo)包語句的格式 : import 包名.類名; ( 導(dǎo)入xxx包中某個(gè)類 )
-
導(dǎo)包語句要注意的細(xì)節(jié):
- 一個(gè)java文件中可以出現(xiàn)多句導(dǎo)包語句
- "*"是導(dǎo)包語句的通配符幔崖。可以匹配任何的類名
- import aa.*; 是不會(huì)作用于aa包下面的子包的
推薦使用:import 包名.類名; 因?yàn)槭褂?通配符會(huì)導(dǎo)致結(jié)構(gòu)不清晰
-
什么時(shí)候使用import語句:
- 相互訪問的兩個(gè)類不是在同一個(gè)包下面,這時(shí)候就需要使用到導(dǎo)包語句
- java.lang 是默認(rèn)導(dǎo)入的, 不需要我們自己導(dǎo)入
package aa;
public class Demo {
/*
static{
System.out.println("這個(gè)是Dmeo3的靜態(tài)代碼塊...");
}
*/
public void print(){
System.out.println("這個(gè)是Dmeo3的print方法...");
}
}
package bb;
import aa.Demo3;
import java.util.Arrays;
class Demo
{
public static void main(String[] args)
{
int[] arr = {1,234,2};
Arrays.sort(arr);
Object o = new Object();
Demo3 d = new Demo3();
d.print();
/*
Demo5 d2 = new Demo5();
d2.test();
*/
}
}