文檔版本 | 開發(fā)工具 | 測試平臺(tái) | 工程名字 | 日期 | 作者 | 備注 |
---|---|---|---|---|---|---|
V1.0 | 2016.03.02 | lutianfei | none |
[TOC]
- 教練運(yùn)動(dòng)員案例
形式參數(shù)和返回值問題
-
形式參數(shù)
:基本類型
-
引用類型
-
類
(匿名對象時(shí)有講):需要的是該類的對象
缴罗! -
抽象類
:需要的是該抽象類的子類對象
覆获。 -
接口
: 需要的是該接口的實(shí)現(xiàn)類對象
锰什。
-
-
返回值
類型- 基本類型
- 引用類型
-
類
:返回的是該類的對象
-
抽象類
:返回的是該抽象類的子類對象
-
接口類
:返回的是該接口的實(shí)現(xiàn)類對象
-
Eg: 當(dāng)
類
作為形式參數(shù)
的情況舉例:
class Student {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class StudentDemo {
public void method(Student s) { //ss; ss = new Student(); Student s = new Student();
s.study();
}
}
class StudentTest {
public static void main(String[] args) {
//需求:我要測試Student類的study()方法
Student s = new Student();
s.study();
System.out.println("----------------");
//需求2:我要測試StudentDemo類中的method()方法
StudentDemo sd = new StudentDemo();
Student ss = new Student();
sd.method(ss);
System.out.println("----------------");
//匿名對象用法
new StudentDemo().method(new Student());
}
}
- Eg: 當(dāng)
抽象類
作為形式參數(shù)的情況舉例:
abstract class Person {
public abstract void study();
}
class PersonDemo {
public void method(Person p) {//p; p = new Student(); Person p = new Student(); //多態(tài)
p.study();
}
}
//定義一個(gè)具體的學(xué)生類
class Student extends Person {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class PersonTest {
public static void main(String[] args) {
//目前是沒有辦法的使用的
//因?yàn)槌橄箢悰]有對應(yīng)的具體類
//那么驶睦,我們就應(yīng)該先定義一個(gè)具體類
//需求:我要使用PersonDemo類中的method()方法
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
}
}
- Eg: 當(dāng)
接口
作為形式參數(shù)的情況舉例:
//定義一個(gè)愛好的接口
interface Love {
public abstract void love();
}
class LoveDemo {
public void method(Love l) { //l; l = new Teacher(); Love l = new Teacher(); 多態(tài)
l.love();
}
}
//定義具體類實(shí)現(xiàn)接口
class Teacher implements Love {
public void love() {
System.out.println("老師愛學(xué)生,愛Java,愛林青霞");
}
}
class TeacherTest {
public static void main(String[] args) {
//需求:我要測試LoveDemo類中的love()方法
LoveDemo ld = new LoveDemo();
Love l = new Teacher();
ld.method(l);
}
}
- Eg: 當(dāng)
類
作為返回值的情況舉例:
class Student {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class StudentDemo {
public Student getStudent() {
return new Student();
}
}
class StudentTest2 {
public static void main(String[] args) {
//需求:我要使用Student類中的study()方法
//但是,這一次我的要求是蒸播,不要直接創(chuàng)建Student的對象
//讓你使用StudentDemo幫你創(chuàng)建對象
StudentDemo sd = new StudentDemo();
Student s = sd.getStudent(); //new Student(); Student s = new Student();
s.study();
}
}
- Eg: 當(dāng)
抽象類
作為返回值的情況舉例:
abstract class Person {
public abstract void study();
}
class PersonDemo {
public Person getPerson() {
//Person p = new Student();
//return p;
return new Student();
}
}
class Student extends Person {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class PersonTest2 {
public static void main(String[] args) {
//需求:我要測試Person類中的study()方法
PersonDemo pd = new PersonDemo();
Person p = pd.getPerson(); //new Student(); Person p = new Student(); 多態(tài)
p.study();
}
}
- Eg: 當(dāng)
接口
作為返回值的情況舉例:
interface Love {
public abstract void love();
}
class LoveDemo {
public Love getLove() {
//Love l = new Teacher();
//return l;
return new Teacher();
}
}
//定義具體類實(shí)現(xiàn)接口
class Teacher implements Love {
public void love() {
System.out.println("老師愛學(xué)生,愛Java,愛林青霞");
}
}
class TeacherTest2 {
public static void main(String[] args) {
//如何測試呢?
LoveDemo ld = new LoveDemo();
Love l = ld.getLove(); //new Teacher(); Love l = new Teacher(); 多態(tài)
l.love();
}
}
鏈?zhǔn)骄幊?/h3>
- 形式:
對象
.方法1()
.方法2()
....方法n()
- 每次調(diào)用方法完畢后睡榆,返回的是一個(gè)對象萍肆。
-
方法1
調(diào)用完畢后應(yīng)該返回一個(gè)對象
,方法2
調(diào)用完畢后應(yīng)該返回一個(gè)對象
胀屿,方法n
調(diào)用完畢后可能是對象塘揣,也可能不是對象。
/*
鏈?zhǔn)骄幊獭? 每次調(diào)用完畢方法后宿崭,返回的是一個(gè)對象亲铡。
*/
class Student {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class StudentDemo {
public Student getStudent() {
return new Student();
}
}
class StudentTest3 {
public static void main(String[] args) {
//如何調(diào)用的呢?
StudentDemo sd = new StudentDemo();
//Student s = sd.getStudent();
//s.study();
//
sd.getStudent().study();
}
}
對象
.方法1()
.方法2()
....方法n()
-
方法1
調(diào)用完畢后應(yīng)該返回一個(gè)對象
,方法2
調(diào)用完畢后應(yīng)該返回一個(gè)對象
胀屿,方法n
調(diào)用完畢后可能是對象塘揣,也可能不是對象。
/*
鏈?zhǔn)骄幊獭? 每次調(diào)用完畢方法后宿崭,返回的是一個(gè)對象亲铡。
*/
class Student {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class StudentDemo {
public Student getStudent() {
return new Student();
}
}
class StudentTest3 {
public static void main(String[] args) {
//如何調(diào)用的呢?
StudentDemo sd = new StudentDemo();
//Student s = sd.getStudent();
//s.study();
//
sd.getStudent().study();
}
}
包
包的概述(其實(shí)就是文件夾)
- 作用:對類進(jìn)行分類管理
- 包的劃分:
- 舉例:
- 基本的劃分:按照模塊和功能分。
- 高級(jí)的劃分:就業(yè)班做項(xiàng)目的時(shí)候你就能看到了葡兑。
- 舉例:
包的定義及注意事項(xiàng)
-
定義包的格式
- package 包名;
- 多級(jí)包用
.
分開即可
-
注意事項(xiàng):
- package語句必須是程序的第一條可執(zhí)行(可被虛擬機(jī)執(zhí)行)的代碼
- package語句在一個(gè)java文件中只能有一個(gè)
- 如果沒有package奖蔓,默認(rèn)表示無包名
-
帶包的編譯和運(yùn)行
- 手動(dòng)式
- a:通過javac命令編譯該java文件
- b:手動(dòng)創(chuàng)建包名。
- c:將a步驟產(chǎn)生的類文件放在b步驟的最底層包讹堤。
- d:帶包地址運(yùn)行java命令
- 自動(dòng)式
- javac編譯的時(shí)候帶上
-d
即可- javac -d . HelloWorld.java
- javac編譯的時(shí)候帶上
- 手動(dòng)式
導(dǎo)包
-
導(dǎo)包概述
- 不同包下的類之間的訪問吆鹤,每次使用不同包下的類的時(shí)候,都需要加包的全路徑洲守。方便起見疑务,java提供了導(dǎo)包的功能。
-
導(dǎo)包格式
- import 包名;
-
注意:
- 這種方式導(dǎo)入是到類的名稱梗醇。
- 雖然可以最后寫
*
知允,但是不建議。
-
package,import,class有沒有順序關(guān)系(面試題)
- package>import>class
- package : 只能有一個(gè)
- import:可以有多個(gè)
- class:可以有多個(gè)叙谨,建議是一個(gè)温鸽。
修飾符
- 權(quán)限修飾符:
private
,默認(rèn)的
,protected
,public
- 狀態(tài)修飾符:
static
,final
- 抽象修飾符:
abstract
權(quán)限修飾符
類及其組成可以用的修飾符
-
類:
- 權(quán)限修飾符:
默認(rèn)的
,public
- 狀態(tài)修飾符(外部類):
final
手负, (內(nèi)部類可以使用static
) - 抽象修飾符:
abstract
- 我們自己定義:
public
居多
- 權(quán)限修飾符:
-
成員變量:
- 權(quán)限修飾符:
private
,默認(rèn)的
涤垫,protected
,public
- 狀態(tài)修飾符:
static
,final
- 我們自己定義:
private
居多
- 權(quán)限修飾符:
-
構(gòu)造方法:
- 權(quán)限修飾符:
private
,默認(rèn)的
,protected
,public
- 我們自己定義:
public
居多
- 權(quán)限修飾符:
-
成員方法:
- 權(quán)限修飾符:
private
,默認(rèn)的
虫溜,protected
,public
- 狀態(tài)修飾符:
static
,final
- 抽象修飾符:
abstract
- 我們自己定義:public居多
- 權(quán)限修飾符:
-
除此以外的組合規(guī)則:
- 成員變量:public static final
- 成員方法:
- public static
- public abstract
- public final
內(nèi)部類
內(nèi)部類概述
- 把類定義在其他類的內(nèi)部雹姊,這個(gè)類就被稱為
內(nèi)部類
。- 舉例:在類A中定義了一個(gè)類B衡楞,類B就是內(nèi)部類吱雏。
- 內(nèi)部類的訪問特點(diǎn):
- 內(nèi)部類可以直接訪問外部類的成員,包括私有瘾境。
- 外部類要訪問內(nèi)部類的成員歧杏,必須創(chuàng)建對象。
內(nèi)部類的位置
- 按照內(nèi)部類在類中定義的位置不同迷守,可以分為如下兩種格式:
- 成員位置(成員內(nèi)部類)
- 局部位置(局部內(nèi)部類)
成員內(nèi)部類
- 成員內(nèi)部類不是靜態(tài)的:
- 外部類名.內(nèi)部類名 對象名 = new 外部類對象.new 內(nèi)部類對象;
- 成員內(nèi)部類是靜態(tài)的(被靜態(tài)修飾后的訪問方式是):
- 外部類名.內(nèi)部類名 對象名 = new 外部類名.內(nèi)部類名();
class Outer {
private int num = 10;
class Inner {
public void show() {
System.out.println(num);
}
}
}
class InnerClassDemo3 {
public static void main(String[] args) {
//格式:外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象;
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
- 上面成員內(nèi)部類的使用犬绒,但是一般來說,在實(shí)際開發(fā)中是不會(huì)這樣使用的兑凿。因?yàn)?strong>一般內(nèi)部類就是不讓外界直接訪問的凯力。
class Body {
private class Heart {
public void operator() {
System.out.println("心臟搭橋");
}
}
public void method() {
if(如果你是外科醫(yī)生) {
Heart h = new Heart();
h.operator();
}
}
}
成員內(nèi)部的常見修飾符
- private 為了保證數(shù)據(jù)的安全性
- static 為了讓數(shù)據(jù)訪問更方便,一般加
public
- 被靜態(tài)修飾的
成員內(nèi)部類
只能訪問外部類
的靜態(tài)成員 - 內(nèi)部類被靜態(tài)修飾后的
方法
- 格式:外部類名.內(nèi)部類名 對象名 = new 外部類名.內(nèi)部類名();
?
- 格式:外部類名.內(nèi)部類名 對象名 = new 外部類名.內(nèi)部類名();
class Outer {
private int num = 10;
private static int num2 = 100;
//內(nèi)部類用靜態(tài)修飾是因?yàn)閮?nèi)部類可以看出是外部類的成員
public static class Inner {
public void show() {
//System.out.println(num);
System.out.println(num2);
}
public static void show2() {
//System.out.println(num);
System.out.println(num2);
}
}
}
class InnerClassDemo4 {
public static void main(String[] args) {
//成員內(nèi)部類被靜態(tài)修飾后的訪問方式是:
//格式:外部類名.內(nèi)部類名 對象名 = new 外部類名.內(nèi)部類名();
Outer.Inner oi = new Outer.Inner();
oi.show();
oi.show2();
//show2()的另一種調(diào)用方式
Outer.Inner.show2();
}
}
- Eg:補(bǔ)齊程序(注意:內(nèi)部類和外部類沒有繼承關(guān)系)要求請?zhí)羁辗謩e輸出30 20 10
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?); //num
System.out.println(??);//this.num
System.out.println(???);
//new Outer().num
// Outer.this.num
}
}
}
局部內(nèi)部類
- 可以直接訪問
外部類
的成員 - 可以創(chuàng)建
內(nèi)部類對象
茵瘾,通過對象調(diào)用內(nèi)部類方法
,來使用局部內(nèi)部類
功能 -
局部內(nèi)部類
訪問局部變量
的注意事項(xiàng): 必須被final
修飾- 因?yàn)榫植孔兞繒?huì)隨著方法的調(diào)用完畢而消失咐鹤,這個(gè)時(shí)候拗秘,局部對象并沒有立馬從堆內(nèi)存中消失,還要使用那個(gè)變量祈惶。為了讓數(shù)據(jù)還能繼續(xù)被使用雕旨,就用
fianl
修飾,這樣捧请,在堆內(nèi)存里面存儲(chǔ)的其實(shí)是一個(gè)常量值凡涩。
- 因?yàn)榫植孔兞繒?huì)隨著方法的調(diào)用完畢而消失咐鹤,這個(gè)時(shí)候拗秘,局部對象并沒有立馬從堆內(nèi)存中消失,還要使用那個(gè)變量祈惶。為了讓數(shù)據(jù)還能繼續(xù)被使用雕旨,就用
class Outer {
private int num = 10;
public void method() {
//int num2 = 20;
//final int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
//從內(nèi)部類中訪問本地變量num2; 需要被聲明為最終類型
System.out.println(num2);//20
}
}
//System.out.println(num2);
Inner i = new Inner();
i.show();
}
}
class InnerClassDemo5 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名內(nèi)部類
- 就是內(nèi)部類的簡化寫法。
- 前提:存在一個(gè)
類
或者接口
- 這里的類可以是具體類也可以是抽象類疹蛉。
- 格式:new 類名或者接口名() {重寫方法;}
- 本質(zhì):是一個(gè)繼承了該類或者實(shí)現(xiàn)了接口的子類
匿名對象
interface Inter {
public abstract void show();
public abstract void show2();
}
class Outer {
public void method() {
//一個(gè)方法的時(shí)候
/*
new Inter() {
public void show() {
System.out.println("show");
}
}.show();
*/
//二個(gè)方法的時(shí)候
/*
new Inter() {
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
}.show();
new Inter() {
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
}.show2();
*/
//如果我是很多個(gè)方法活箕,就很麻煩了
//那么,我們有沒有改進(jìn)的方案呢?
Inter i = new Inter() { //多態(tài)
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
};
i.show();
i.show2();
}
}
class InnerClassDemo6 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
- 匿名內(nèi)部類在開發(fā)中的使用
interface Person {
public abstract void study();
}
class PersonDemo {
//接口名作為形式參數(shù)
//其實(shí)這里需要的不是接口氧吐,而是該接口的實(shí)現(xiàn)類的對象
public void method(Person p) {
p.study();
}
}
//實(shí)現(xiàn)類
class Student implements Person {
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
}
class InnerClassTest2 {
public static void main(String[] args) {
//測試
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
System.out.println("--------------------");
//匿名內(nèi)部類在開發(fā)中的使用
//匿名內(nèi)部類的本質(zhì)是繼承類或者實(shí)現(xiàn)了接口的子類匿名對象
pd.method(new Person(){
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
});
}
}
- 匿名內(nèi)部類面試題:要求在控制臺(tái)輸出”HelloWorld”
interface Inter {
void show();
}
class Outer { //補(bǔ)齊代碼
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
//分析:
/*
1:由Outer.method()可以看出method()應(yīng)該是outer中的一個(gè)靜態(tài)方法讹蘑。
2:Outer.method().show()可以看出method()方法的返回值是一個(gè)對象
3:由于接口Inter中有一個(gè)show()方法末盔,所以認(rèn)為method()方法的返回值類型是一個(gè)接口筑舅。
*/
//* 補(bǔ)充代碼如下:在不起代碼后:
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("HelloWorld");
}
}
}