面向对象深化
1.1抽象類
什么是抽象類?
使用abstract修飾的類稱為抽象類
抽象類的特征
抽象類中構造方法的作用,是提供給子類調用
public class Student extends Person{public Student() {super();//調用直接父類的無參構造方法System.out.println("Student類的無參構造方法");} }成員變量,成員方法,靜態方法,構造方法,final修飾的方法,抽象方法
1.2抽象方法
什么是抽象方法
使用abstract修飾的方法稱為抽象方法
抽象方法的特征
總結:abstract可以修飾類和方法
1.3什么情況下使用抽象方法和抽象類
通過抽象類,可以避免子類設計的隨意性。通過抽象類,我們就可以做到嚴格限制子類的設計,使子類之間更加通用。(程序的可拓展和可維護性)
**什么情況下使用抽象類?**父類的名稱比較抽象,創建對象無意義。
Animal動物類–》》abstract,–>abstract shout()
每一種動物,分別實現發聲的方法
2.1初識接口
如果一個類中所有的方法均為abstract方法,那么這個類就可以聲明為接口
public abstract class MyClass {public abstract void show();public abstract String fun();public abstract int [] method(); }可以改為如下代碼
public interface MyInterface {void show();String fun();int [] method(); }2.2接口的定義
使用interface修飾,是一種數據類型,引用數據類型
接口的定義:
接口中可以包含什么?
public abstract(可以省略)方法:
接口中可不可以包含構造方法?不允許,因為接口不是類
接口和類的關系
繼承 父子關系 親爹
實現 實現關系 干爹
extends在前 implements在后
父類優先于接口,子類實現的是父類中的方法
父類與接口中的方法,在子類/實現類中構成方法的重載
3.1接口的特征
3.2使用接口的意義
可以實現設計和實現的分離,抽象出N多不同類的共同點。
舉例:飛機,鳥,球,導彈,宇宙飛船……
| 鳥 is a 球?不成立 | ||
| 接口 | has-a關系 | 手機 has a 拍照的功能 |
| 飛機 has a 飛行的能力 | ||
| 鳥 has a 飛行的能力 |
接口體現的是一種能力
public interface Fly {public void flying();//飛行的能力 } class AirPlane implements Fly{@Overridepublic void flying() {System.out.println("飛機在祖國的藍天上自由飛翔……");} } class Bird implements Fly{@Overridepublic void flying() {System.out.println("小鳥唱著動聽的歌,在天空中飛……");} } class FootBall implements Fly{@Overridepublic void flying() {// TODO Auto-generated method stubSystem.out.println("球被踢了一腳,劃了個美麗的弧線飛到了對方的球門里……");} } public class Test {public static void main(String[] args) {//接口類型(引用數據類型)指向實現類的對象Fly airPlane = new AirPlane();Fly bird = new Bird();Fly football = new FootBall();//調用相同的方法airPlane.flying();bird.flying();football.flying();//運行結果,不相同} }總結:使用接口實現多態的步驟
面向接口的編程
4.1 什么是內部類?
將一個類定義在另一個類的內部,該類就稱為內部類
Outer$Inner.class
內部類的優缺點
優點:內部類可以直接訪問外部類的私有屬性
缺點:破壞了類的結構
內部類的分類
一、 成員內部類
內部類相當于外部類的成員
二、靜態內部類
public class Outer {private static String name = "張三";//靜態內部類,不允許訪問外部類的非static屬性static class Inner{public void show() {System.out.println(name);}}//如果內部類中的方法為static方法,那么內部類也必須為靜態內部類static class Inner2{public static void show() {}} } public class TestStaticInner {public static void main(String[] args) {//創建內部類的對象 Outer.Inner i = new Outer.Inner();i.show();//訪問的是靜態內部類中的靜態方法Outer.Inner2.show();} }三、方法中的內部類
只能在方法中使用,相當于方法中的局部變量
JDK1.8新特性
JDK1.8之前方法中的內部類要訪問外部類的局部變量,必須加上final關鍵字(常量)
JDK1.8開始,在訪問外部類的局部變量時,則可以不加final關鍵字
四、匿名內部類(存在繼承或實現關系)
5.String類常用方法
5.1String類的定義
String是不可變字符序列
5.2String類的常用方法
相等(忽略大小寫),則返回 true
出現的位置
它是通過用 newChar 替換此字符串中出現的所有
oldChar 而生成的
則返回 true
尾,則返回 true
串,該串包含從原始字符串 beginIndex 到串尾或 endIndex-1
的所有字符
串中的所有大寫字母改成小寫字母
符串中的所有小寫字母改成大寫字母
符串頭部和尾部的空格
String類和常量池
package com.java.string;public class TestString {public static void main(String[] args) {String str = "apple";String str2 = "banana";String str3 = "cat";String str4 = "dog";String str5 = "app";/**求兩個字符串的長度的最小值,使用循環,比較對應位置上的字母,如果不相同,則兩個對應位置上字母的ASCII嗎值相減*/System.out.println(str.compareTo(str2));//a-b -1System.out.println(str.compareTo(str3));//a-c -2System.out.println(str.compareTo(str4));//a-d -3//兩個字符串的長度相差System.out.println(str.compareTo(str5));//5-3 /**String類的構造方法*/String s1 = new String();//創建了一個長度為0的字符串String s2 = null;//沒有創建對象,只是聲明了String類型的對象s2String s3 = new String("hello");//通過char類型的數組構造String對象char [] c = {'a','b','c'};String s4 = new String(c);byte [] b = {97,98,99};String s5 = new String(b);String s6 = new String(c, 0, 2);System.out.println("s6:"+s6);String s7 = new String(b, 1, 2);System.out.println("s7:" +s7);}} public class TestString2 {public static void main(String[] args) {String str1 = "abc";String str2 = "a" + "b" + "c";String str3 = new String("abc");String str4 = str3+"";String str5 = new String("abc");System.out.println("str1==str2:"+(str1==str2));//tureSystem.out.println("str1==str3:"+(str1==str3));//falseSystem.out.println("str1==str4:"+(str1==str4));//falseSystem.out.println("str3==str5:"+(str3==str5));//false} }
什么情況會在堆里開空間?
等號右側:
字符串相等的判斷
== :比較兩個字符串內存地址是否相等
equals(Object obj):用于比較兩個字符串對象的內容是否相等
String類型重寫equals方法
public boolean equals(Object anObject) { //Object作方法的形式參數,多態的一種表示形式(str2,new Person())if (this == anObject) { //地址相同,內容一定相同return true;}if (anObject instanceof String) {//引用數據類型的一個判斷 String anotherString = (String)anObject; //向下類型轉換,轉換成真實的String類型int n = value.length; //獲取的是str字符串中字符的個數if (n == anotherString.value.length) { //如果兩個字符串中字符的個數相等char v1[] = value; //str {'a','b','c'} str2 {'a','b','c'}char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i]) return false;i++;}return true;}}return false;}總結
- 上一篇: 评测:Logitech Conferen
- 下一篇: 3.28 将文字转换为路径并进行艺术再加