標簽:default get value ring 重寫 對象內存 轉型 pre lan
面向過程:步驟清晰簡單,適合處理一些較爲簡單的問題
面向對象:物以類聚,分類的思維模式,思考問題首先解決問題需要哪些分類,然後對這些分類進行單獨思考,最後才對某個分類下的細節進行面向過程的思考。
面向對象適合處理複雜的問題,適合處理需要多人協作的問題。
三大特性
從認識論的角度考慮是先有對象後有類。對象是具體的事物,類是抽象的,是對對象的抽象。
從代碼運行的角度考慮是先有類後有對象。類是對象的模板。
方法的定義
方法的調用
靜態方法
非靜態方法
static是和类一起加载的。非靜態方法需要实例化后才能存在。
形參和實參
值傳遞和引用傳遞
this關鍵字
對象
對象类型 對象名 = 對象值
Student student = new Student();
類是一種抽象的數據類型,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物。
對象是抽象概念的具体实例
張三是人的一個具體實例
能夠體現出特點,展現出功能的是具體的實例,而不是一個抽象的概念。
使用new关键字创建對象
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的對象进行默认的初始化以及对类中構造器的调用
类中的構造器也称为構造方法,是在进行创建對象的时候必须要调用的,并且構造方法
構造器是重點
快捷鍵alt+insert
和類名相同,沒有返回值
一個類即使什麽都不寫,它也會存在一個方法,無參構造
如果定義了有參構造,要顯式的定義無參構造
使用new关键字,本质上就是在调用構造器。初始化對象的值
普通對象实例化
子类對象实例化
後續看JVM可回顧這裏
該露的露,該藏的藏
設計程序要追求“高內聚,低耦合”
高內聚:就是類的內部數據操作細節自己完成,不允許外部幹涉。
低耦合:僅暴露少量的方法給外部使用。
封裝(数据的隐藏):禁止直接访问一个對象中数据的实际表示,而应通过操作借口来访问,这称为信息隐藏。
屬性私有,get/set
提高安全性,保護數據
隱藏代碼的實現細節
統一接口
提高系統維護性
属性:不可被重寫,只可被隐藏
方法:会被重寫,不会隐藏
Java只有单繼承,没有多繼承
繼承是类和类之间的关系。除此之外还有依赖、组合、聚合等
子類默認調用了父類的無參構造
super是調用了父類的構造方法
super必須只能出現在子類的方法或者構造方法中
super和this不能同時調用構造方法
vs this
代表對象
this代表调用者本身这个對象
super代表父类對象的应用
前提
this没有繼承也可以使用
super只有在繼承条件下才可以使用
構造方法
this()本類的構造
super()父類的構造
前提
成員方法
成員變量
所以多態跟new有关。
重載:本類中的同名方法,相同的名稱實現不同的邏輯。
對象的多態---直接应用在抽象類和接口上
編譯時類型和運行時類型
编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的對象决定
如果編譯時類型和運行時類型不一致,就出现多態
Person p = new Person();
Person e = new Student();//Person类型的变量e,指向Student类型的對象
向上轉型:子类可看做是特殊的父类,所以父类类型的引用可以指向子类的對象
類變量類型
多態意思就是,以子类的模板生成了一个父类的实例。同名方法是子类的方法。同名属性是看左边,类型是谁就是谁的。子类独有的方法和属性不能访问(因为没有重寫条件,无法触发多態)。
方法類型:虛擬方法調用
正常的方法調用。編譯時和運行時一致
Person p = new Person();
p.getInfo();
Student s = new Student();
s.getInfo();
虚拟方法调用(多態)
Person e = new Student();
e.getInfo();//调用的是Student类的getInfo()方法
编译时e为Person类型,而方法的調用是在运行时确定的,所以调用的是Student类的方法。-----动态绑定
方法的重寫和重载
重寫:子类对父类方法的覆盖,属性是无法覆盖的,属性是隐藏。
重寫都是方法的重寫,和属性无关
重寫:子类的方法和父类一致,但方法体不同。
父類的功能,子類一不定需要,或者不一定滿足。
//Static方法的調用只和左边定义的数据类型有关
A a = new A();
a.text();//A
//父类的引用指向了子类
B b = new A();
b.text();//B
靜態方法是类的方法,非靜態方法是對象的方法。
Person p = new Student
//Person类p = new Student對象
//编译时 运行时
A instanceof B
实例對象是否属于类B
对于正常繼承关系
子類instance父類爲true
对于多態
看右边实例對象
Object object = new Student;
//object实际上是Student的实例。
object instanceof Student;//true
//实际为Student instanceof Student
object instanceof Person;//true
//实际为Student instanceof Person
object instanceod Object;//true
//实际为Student instanceof Object
用abstract修飾
不用寫方法的實現
主要用來捕捉子類的通用特性的,作爲子類創建的模板
如果有一个接口,五个实现类,现在的需求可能要往接口加一个方法,这样要改变五个类,但是需求只需要改动其中两个实现类,可以再定义一个抽象類去实现这个接口,在抽象類中新增这个方法,然后其他两个实现类实现这个抽象就好了
equals本質上等同于==
但是在引用比较上,equals重寫了部分的方法,使之变为了值比较。
总结:==是用来引用比较的,equals是用来值比较的。目前有String、File、Date及包装类(WrapperClass)重寫了equals的值比较,如果想将某类的引用比较改成值比较,需要重寫该类的equals
String對象有两种创建方法
字面量创建String對象和new创建String對象
包裝類:針對八種基本數據類型定義相應的引用類型
可以有類的特點,調用類的方法。
主要用來轉換基本數據類型和字符串
基本數據類型對應的包裝類
裝箱和拆箱
裝箱
通过参数构造包装类對象
Integer i = new Integer(500);
Float f = new Float("4.56");
Long l = new Long("200");
//简便方法
Integer i0 = 112;//自动裝箱
Boolean b0 = false;
拆箱
調用包裝類的.xxxxValue()方法
int i0 = i.intValue();
boolean b0 = b.booleanValue();
//简便方法
int i0 = i;
boolean b0 = b;
字符串和基本數據類型轉換
通过包装类的構造器实现
int i = new Integer("12");//本质上还是调用了parseXxxx靜態方法。因为Integer的String有参构造使用的就是parseXxxx方法。
通过包装类的parseXxxx(String s)靜態方法
int i = Integer.parseInt("123");
基本數據類型轉換成字符串
調用字符串重載的valueOf()方法
String str = String.valueOf(2.34f);
更直接的方式
String str = 5+"";
意圖:保證一個類僅有一個實例,並且提供一個訪問它的全局訪問點
主要解決:一個全局使用的類頻繁的被創建和銷毀
何時使用:當你想控制實例數目,節省系統資源的時候
如何解決:判斷系統是否已經有這個單例,有則返回,無則創建
關鍵代碼:構造函數是私有的
实现:创建一个单例类,有它的私有构造函数和本身的一个静态实例,(因为静态只会创建一次)。提供靜態方法,供外界获取它的静态实例。
餓漢式的單例模式
先靜態創建一個實例,等別人通過方法調用。
懶漢式的單例模式
最开始不创建实例,等到第一个人调用时,创建對象,之后所有调用都返回这个對象
在new Person的时候
静态代碼塊:static修饰的代碼塊
非静态代碼塊
final修饰的类不能被繼承。final是一个最终的类。
final修饰的方法不能被重寫
final修飾的變量爲常量,常量必須顯式賦值
當功能內部一部分實現是確定的,一部分實現是不確定的,這時可以把不確定的部分暴露出去,讓子類去實現。
編寫一個抽象父類,父類提供了多個子類的通用方法,並把一個或多個方法留給子類實現,就是一種模板模式。
步驟
为了实现多繼承
接口是抽象方法和常量值的定義的集合
接口是一种特殊的抽象類,这种抽象類只包含常量和方法定义,而没有变量和方法的实现
一个类可以实现多个接口,接口也可以繼承其它接口
实现接口的类必须提供接口中所有方法的具体实现内容,才能被实例化,否则,仍为抽象類
先繼承后实现
接口可以被接口繼承,不能被实体类繼承
接口的意義
当一个子类实例繼承一个抽象父类时。
如果想要給父類增加抽象方法,則子類必須要實現它。
現在定義一個接口寫抽象方法
讓父類去實現抽象方法
讓子類可選擇實現或者不實現該接口
可以解决Java不能多繼承的问题。
比如classA,想要繼承classB和classC,直接是不可以的
但是我们可以在classA里面,写两个內部類,分别繼承classB和classC,然后重寫方法。內部類作为classA的成员,可以被调用。这样可以通过a.innerb.方法来实现原本的a.方法
調用外部屬性
特性:
可以聲明爲final
可以聲明爲private或protected
可以声明为static,但此时不能使用外层类的非static的成員變量
可以声明为abstract类,可以被其他內部類繼承
注:非static的內部類的成员不能被声明为static,只有在外部类或者static的內部類中才可声明static成员
標簽:default get value ring 重寫 對象內存 轉型 pre lan
原文地址:https://www.cnblogs.com/lxycc/p/14964895.html