筆記四 Java 面向對象(1)
1.基本定義
1.1
類 Class
- 對 事物、邏輯、算法或 概念的 抽象。
- 描述一類對象的 行爲和狀態。
package note4;
/**
* @author Calvin
* @titile: 人類
* @date 2019/2/20
* @since 1.0
*/
public class Person {
/**
* 狀態 -> 屬性
*/
private String sleepState = "睡覺中";
/**
* 行爲 -> 方法
*/
public void sleep(){
System.out.println("人會睡覺");
}
}
對象 Object
- 對象是類的 一個實例
package note4;
/**
* @author Calvin
* @titile: 小明
* @date 2019/2/20
* @since 1.0
*/
public class XiaoMing {
public void personBehavior() {
/**
* 對象 -> 類的一個實例
*/
Person person = new Person();
person.sleep();
}
}
引用 Reference
- 使用標識符 指向一個對象的“引用(reference)”
/**
* @param person -> 根據person -> 引用Person
*/
public void setPerson(Person person){
this.person = person;
}
構造方法 Construction
-
在創建一個對象的時候, 至少有一個構造方法.
-
構造方法的 名稱必須與 類同名一個類可以有多個構造方法.
public class XiaoMing {
private Person person;
/**
* 構造方法
*/
XiaoMing(){
}
/**
* 帶參構造方法
*/
XiaoMing(Person person){
this.person = person;
}
}
this
- 使用方式:當前對象的調用
public void setPerson(Person person){
// this -> XiaoMing 中的屬性
// 將傳入person的值 -> 賦值給 XiaoMing 中的屬性 person
this.person = person;
}
方法重載
- 使用方式:同名不同參
package note4;
/**
* @author Calvin
* @titile: 人類
* @date 2019/2/20
* @since 1.0
*/
public class Person {
/**
* 狀態 -> 屬性
*/
private String sleepState = "睡覺中";
/**
* 行爲 -> 方法
*/
public void sleep(){
System.out.println("人會睡覺");
}
/**
* 方法重載
*/
public void sleep(String sleepState){
System.out.println(sleepState);
}
}
1.2
抽象類 abstract
-
作用:
- 爲 子類提供 通用代碼
- 爲 子類提供 通用方法的定義
package note4;
/**
* @author Calvin
* @titile: 動物 (抽象類)
* @date 2019/2/20
* @since 1.0
*/
/**
*extend
*/
public abstract class Animal {
/** a.爲子類提供通用代碼**/
/** 姓名 */
private String name;
/** 性別*/
private String sex;
/**b.爲子類提供通用方法的定義 **/
/**
* 動物有什麼行爲
* @return
*/
public abstract String behavious();
}
最終 final
- 定義: 最終變量,不可改變
- 作用:修飾 變量、方法、類
package note4;
/**
* @author Calvin
* @titile: 公🐕
* @date 2019/2/20
* @since 1.0
*/
/**
* final -> 修飾 類、變量、方法
-> 最終變量不可以修改
*/
// 修飾 類
public final class Dog extends Animal{
// 修飾 變量
final String SEX = "MALE";
// 修飾 方法
@Override
public final String behavious() {
return "Dog can wang wang ";
}
}
靜態 static
- 定義:靜態變量 屬於類 (類變量)
- 區別:非靜態成員 屬於 實例
- 使用方式:靜態成員通常使用 類名直接調用
- 運行方式:被 static修飾的成員 將 最優先加載到內存
public final static PrintStream out = null;
// static 類名直接調用
System.out.println("狗會叫");
1.3
接口 Interface
package note4;
/**
* @author Calvin
* @titile: USB接口
* @date 2019/2/20
* @since 1.0
*/
public interface Usb {
}
2.內部類
定義: 定義在類內部、方法內部 或 局部代碼塊中的類
- 非靜態 內部類
- 定義:依賴於 外部類對象 存在
public class OutClass {
// 外部類的靜態成員
private static String outClassStatisVariable = "OUT_CLASS_STATIC_VARIABLE";
// 外部類變量
private String outClassVariable = "OUT_CLASS_VARIABLE";
/**
* 2. 非靜態內部類 -> 依賴於 外部類對象 存在
*/
public class InnerClass{
public void println(){
// 允許訪問 靜態 和 非靜態 的成員變量
System.out.println(outClassStatisVariable);
System.out.println(outClassVariable);
}
}
}
- 靜態 內部類
-
定義: 聲明在 內部的類
-
注意:
- 靜態內部類 只能訪問外部類的靜態成員
- 不能直接訪問 外部類的非靜態成員
-
public class OutClass {
// 外部類的靜態成員
private static String outClassStatisVariable = "OUT_CLASS_STATIC_VARIABLE";
// 外部類變量
private String outClassVariable = "OUT_CLASS_VARIABLE";
/**
* 1.靜態內部類
*/
public static class NestedStaticClass{
// 不能直接訪問外部類的非靜態成員
// this.outClassVariable
// 只允許訪問外部類的靜態成員
public void printlnOutMessage(){
System.out.println(OutClass.outClassStatisVariable);
}
}
}
- 局部 內部類
-
定義:
- 聲明 在方法內部 的類
- 局部類型,只能在 局部使用
- 但它的實例,可以轉爲父類型傳遞出去
-
注意:
- 不可以使用任何訪問 權限修飾符
- 不可以 直接訪問局部變量(方法的參數等效於局部變量)
- 如果 一定需要訪問,則需要使用final對局部變量進行修飾
-
package note4.inner;
/**
* @author Calvin
* @titile: 內部類
* @date 2019/2/20
* @since 1.0
*/
public class OutClass {
// 外部類的靜態成員
private static String outClassStatisVariable = "OUT_CLASS_STATIC_VARIABLE";
// 外部類變量
private String outClassVariable = "OUT_CLASS_VARIABLE";
public void printlnPartInnerMethod(){
/**
* 3.局部內部類 -> 聲明 在方法內部 的類
* -> 不可以使用任何訪問 權限修飾符
* -> 不可以 直接訪問局部變量
* -> 一定需要訪問,則需要使用final對局部變量進行修飾
*/
class PartInnerClass{
private String partInnerVariable = "PART_INNER_VARIABLE";
public void println(){
System.out.println(partInnerVariable);
}
}
}
}
-
成員 內部類
- 定義:內部類的 成員屬性(該屬性是成員內部類)
package note4.inner;
/**
* @author Calvin
* @titile: 內部類
* @date 2019/2/20
* @since 1.0
*/
public class OutClass {
// 外部類的靜態成員
private static String outClassStatisVariable = "OUT_CLASS_STATIC_VARIABLE";
// 外部類變量
private String outClassVariable = "OUT_CLASS_VARIABLE";
public class InnerClass{
/**
* 4.成員內部類 -> 內部類的屬性(該屬性是成員內部類)
*/
public class MemberInnerClass{
private String memberInnerVariable = "MEMBER_INNER_VARIABLE";
public void println(){
System.out.println(memberInnerVariable);
}
}
}
- 匿名 內部類
- 定義:
- 就是沒有名稱的類,其名稱由Java編譯器給出,
- 沒有名稱也就是其他地方就不能引用,不能實例化,只用一次,當然也就不能有構造器。
- 格式:
- new 父類(){子類內容};
- 作用:
- 實現外部類/接口 中的方法
- 匿名類可以訪問外部類的成員變量和方法,匿名類的類體不可以聲明稱static成員變量和static方法。
- 匿名類由於是一個new的結果,所以其實可以賦值給一個父類對象。因此可以分爲兩種匿名類,成員匿名類和局部匿名類(作爲函數參數)
- 定義:
package note4.inner;
/**
* @author Calvin
* @titile: 內部類
* @date 2019/2/20
* @since 1.0
*/
public class OutClass {
/**
* 匿名內部類(成員匿名類) -> 定義: 沒有名稱也就是其他地方就不能引用,不能實例化,只用一次, * 當然也就不能有構造器
* -> 格式: new 父類(){子類內容};
* -> 注意事項:可以訪問外部類的成員變量和方法
* 不可以聲明稱static成員變量和static方法。
* 轉換成lambda 表達式必須是一個接口
* -> 分類: 成員匿名類和局部匿名類(作爲函數參數)
*
*/
// 成員匿名類 -> OutClass hiddenInnerClass下的成員變量
public OutClass hiddenInnerClass = new OutClass(){
// 不可以聲明稱static成員變量和static方法。
// static String variable;
private String hiddenInnerClassVariable = "HIDDEN_INNER_CLASS_VARIABLE";
public void println(){
System.out.println(hiddenInnerClassVariable);
}
};
}