11.多態(tài)
1.多態(tài):同一個對象擁有不同的形態(tài)隘弊。
2.先引出一個例子噪珊。
package com.itppf.dao;
public class Noodle {
public void cook(){
System.out.println("做一碗面條!");
}
}
package com.itppf.dao;
public class Rice {
public void cook(){
System.out.println("做一碗米飯饰豺!");
}
}
package com.itppf.dao;
public class Cookier {
public void cook(Noodle n){
n.cook();
}
public void cook(Rice r){
r.cook();
}
}
然后創(chuàng)建做飯的場景亿鲜。
package com.itppf.dao;
public class Client {
public static void main(String[] args) {
Noodle n=new Noodle();
Rice r=new Rice();
Cookier c=new Cookier();//new一個廚師
c.cook(n);//讓廚師做面條
c.cook(r);//讓廚師做米飯
}
}
3.由上面的例子可知,無論是做米飯還是做面條都需要創(chuàng)建不同的方法,這樣以來就十分繁瑣蒿柳,那么我們有沒有方法能簡化這一步操作呢饶套?
答案是可以的,我們可以定義一個食物類垒探,面條和米飯同屬于食物妓蛮。
為了更直觀體現(xiàn),再新建一個soup類
package com.itppf.dao;
public class Noodle extends Food{
public void cook(){
System.out.println("做一碗面條圾叼!");
}
}
package com.itppf.dao;
public class Rice extends Food{
public void cook(){
System.out.println("做一碗米飯蛤克!");
}
}
package com.itppf.dao;
public class Soup extends Food {
public void cook(){
System.out.println("做一碗湯!");
}
}
然后創(chuàng)建食物類
package com.itppf.dao;
public class Food {
public void cook(){
System.out.println("烹飪食物");//主要使用cook方法夷蚊,這里寫不寫都行
}
}
創(chuàng)建廚師類
package com.itppf.dao;
public class Cookier{
// public void cook(Noodle n){
// n.cook();
// }
// public void cook(Rice r){
// r.cook();
// }
public void cook(Food food){ //接收傳進來的食物類型构挤,也就是接收實例化的食物值,然后讓不同的食物去實現(xiàn)各自的方法惕鼓。
food.cook();
}
}
創(chuàng)建做飯的場景
package com.itppf.dao;
public class Client {
public static void main(String[] args) {
// Noodle n=new Noodle();
// Rice r=new Rice();
//
// Cookier c=new Cookier();//new一個廚師
// c.cook(n);//讓廚師做面條
// c.cook(r);//讓廚師做米飯
Food food1=new Noodle(); //把面條筋现、米飯、湯當做食物來看箱歧,把子類的對象賦值給父類的引用矾飞,向上轉(zhuǎn)型。向下轉(zhuǎn)型
//Noodle noodle=(Noodle)food1 強制轉(zhuǎn)型呀邢、
Food food2=new Rice();
Food food3=new Soup();
Cookier cookier=new Cookier();
cookier.cook(food1);
cookier.cook(food2);
cookier.cook(food3);
}
}
練習:
4.根據(jù)類圖洒沦,寫游戲代練,其實和上面的例子一樣价淌,就是看你方法里面寫什么申眼。
//先根據(jù)UML圖寫出Game類
package com.itppf.entity;
public class Game {
public void start(){
System.out.println("開始游戲");
}
public void play(){
System.out.println("開始進入游戲");
}
public void end(){
System.out.println("結(jié)束游戲");
}
}
//LOL
package com.itppf.entity;
public class LOL extends Game {
public void play(){
System.out.println("開始玩LOL!");
}
}
//DNF
package com.itppf.entity;
public class DNF extends Game {
public void play(){
System.out.println("開始玩DNF输钩!");
}
}
//CS
package com.itppf.entity;
public class CS extends Game {
public void play(){
System.out.println("開始玩CS豺型!");
}
}
//玩家
package com.itppf.entity;
public class Player{
public void happy(Game game){
game.play();
}
}
//游戲場景
package com.itppf.entity;
public class GameClient {
public static void main(String[] args) {
Game game1=new DNF();
Game game2=new LOL();
Game game3=new CS();
Player player=new Player();
player.happy(game1);
player.happy(game2);
player.happy(game3);
}
}
12.final關鍵字
1.final:被final修飾的變量不可以被改變(無論是成員變量還是局部變量都不可改變),最終的买乃,最后的姻氨,不可以被改變的。
2.被final修飾的方法不能夠重寫剪验。
3.被final修飾的類不可以被繼承肴焊。
舉個例子
package com.itppf.entity;
public class Car {
public final void type(){
System.out.println("你的車是什么類型啊功戚!");
}
}
13.抽象
1.在java中:只聲明娶眷,不實現(xiàn)。
2.abstract修飾方法啸臀,這個方法就是一個抽象方法届宠,抽象方法沒有方法體烁落。
3.類中如果有個抽象方法,這個類必須是一個抽象類豌注,否則會報錯伤塌。
4.抽象類的特點:
5.不可以創(chuàng)建對象,沒有實例轧铁,不存在的東西每聪。
6.抽象類的子類,必須重寫父類中的抽象方法齿风。
7.簡單說明一下药薯,抽象類繼承父類的時候,由于父類中的方法是抽象方法救斑,所以子類中的方法也是抽象方法童本,這時要求子類重寫父類的方法才能夠?qū)崿F(xiàn)實例化。
注:父類是抽象類系谐,子類不一定是抽象類巾陕。
如何讓它不報錯讨跟?
必須重寫父類的方法纪他。
8.作用:通過抽象類可以強制要求子類中必須有哪些方法晾匠。
添加一個抽象方法shape()后茶袒,子類必須重寫這個方法,否則會報錯凉馆。
重寫之后薪寓。
抽象類更多的是規(guī)范化的作用,在父類中定義抽象方法澜共,然后在子類中必須去重寫這些方法向叉,然后利用多態(tài)性進行操作。
EG:1.抽象化的父類
package com.itppf.entity;
public abstract class Fruit {
public abstract void type();
public abstract void color();
}
2.兩個子類繼承父類并且重寫方法嗦董。
package com.itppf.entity;
public class Peach extends Fruit{
public void type(){
System.out.println("這個水果的名字叫桃子母谎!");
}
public void color(){
System.out.println("這個蘋果的顏色是紅色的!");
}
}
package com.itppf.entity;
public class Apple extends Fruit{
public void type(){
System.out.println("這個水果的名字叫蘋果京革!");
}
public void color(){
System.out.println("這個蘋果的顏色是紅色的奇唤!");
}
}
3.售賣者
package com.itppf.entity;
public class Saler {
public void sale(Fruit fruit){ //這里接收參數(shù),并且調(diào)用各自類中的方法匹摇。
fruit.type();
fruit.color();
}
}
4.售賣場景
package com.itppf.entity;
public class FruitClient {
public static void main(String[] args) {
Fruit fruit1=new Apple();
Fruit fruit2=new Peach();
Saler saler1=new Saler();
saler1.sale(fruit1); //這里將蘋果的參數(shù)傳到售賣者那里咬扇。
System.out.println("*******************");
saler1.sale(fruit2); //這里將桃子的參數(shù)傳到售賣者那里。
}
}
8.注意:抽象類中可以添加別的方法,類似于
package com.itppf.entity;
public abstract class Fruit {
public abstract void type();
public abstract void color();
public void weight(){
System.out.println("這個水果很重廊勃!");
}
}
14.接口
1.接口是一種特殊的抽象類懈贺。
2.接口中所有的方法都是抽象方法,省略掉abstract。
3.接口使用interface來聲明梭灿。
4.接口中的方法都是公開的钠至,公共的。
5.能繼承接口的只能是接口胎源。
6.接口和類只能是實現(xiàn)關系棉钧。
筆記記到這里,學了抽象類之后突然明白了接口存在的意義涕蚤∠芮洌總結(jié)一下,就是標準化万栅、規(guī)范化地定義一個東西佑钾,人人都能拿到接口去做自己的東西。
package com.itppf.dao;
public interface place {
public abstract void point();
}
package com.itppf.dao;
public class home implements place {
public void point(){ //必須要實現(xiàn)接口方法烦粒,其實就是重寫休溶。
}
}
繼承和接口用法幾乎差不多,接口也具有多態(tài)性扰她。
接口可以把不相關的東西進行整合兽掰。
注:類只能單繼承,但接口可以多實現(xiàn)徒役。
注:接口里面的變量都是全局靜態(tài)變量孽尽。
在接口里面定義了面積,然后去調(diào)用會報錯忧勿。
在HomeTest中調(diào)用會報錯杉女。
因為被隱藏到的是
public static final int area=100;
這樣可以打印出來
System.out.println(home1.area);
這個例子可以比較形象地展現(xiàn)接口。
package com.itppf.dao;
public interface Country {
public abstract void specificcountry();
}
package com.itppf.dao;
public interface Province {
public abstract void specificprovince();
}
package com.itppf.dao;
public interface Area {
public abstract void specificsize();
}
package com.itppf.dao;
public interface Type {
public abstract void specifictype();
}
package com.itppf.dao;
public class Place {
public void specificplace(){
System.out.println("你家具體在哪個地方鸳吸?");
}
}
package com.itppf.dao;
//單繼承熏挎,多實現(xiàn)。
public class Home extends Place implements Country,Province,Area,Type{
//類可以實現(xiàn)多個接口晌砾,而接口也可以被多個接口繼承羽历。
//這里要講甩恼,你的家不僅僅在這個國家里面工秩,而且在這個城市里面涵妥,或者定義大小,你家有多大乖寒?多態(tài)性的體現(xiàn)猴蹂。
//重寫了一個繼承的父類和三個接口,一個是展示你居住地的省份楣嘁,一個是國家磅轻,還有一個是居住面積珍逸。
@Override //表示這個方法是重寫的
public void specificplace() {
// super.specificplace(); //super調(diào)用的是父類的方法。
System.out.println("你家居住的具體位置在哪里聋溜?");
}
@Override
public void specificsize() {
System.out.println("你家的居住面積多大谆膳?");
}
@Override
public void specificprovince() {
System.out.println("你家居住在哪個省份?");
}
@Override
public void specificcountry() {
System.out.println("你家居住在哪個國家撮躁?");
}
@Override
public void specifictype() {
System.out.println("你家是什么建筑風格漱病?");
}
}
package com.itppf.dao;
public class HomeTest {
public static void main(String[] args) {
// Home home1=new Home();
// home1.specificpoint();
Home home1=new Home(); //從家的方面去看我家,創(chuàng)建對象“hom1”把曼;
Type home2=new Home(); //從件筑風格的方面去看我家杨帽,創(chuàng)建對象“hom2”;(向上轉(zhuǎn)型)
Area home3=new Home(); //從建筑面積的方面去看我家嗤军,創(chuàng)建對象“hom3”注盈; (向上轉(zhuǎn)型)
Province home4=new Home(); //從哪個省的方面去看我家,創(chuàng)建對象“hom4”叙赚; (向上轉(zhuǎn)型)
Country home5=new Home(); //從哪個國家的方面去看我家老客,創(chuàng)建對象“hom1”;(向上轉(zhuǎn)型)
//以上很好地展現(xiàn)出了java的多態(tài)性震叮。
System.out.println("-----從家的方面去調(diào)用home1具體實例-----");
home1.specificplace();
home1.specifictype();
home1.specificsize();
home1.specificprovince();
home1.specificcountry();
System.out.println("*******");
System.out.println("-----從建筑風格的方面去調(diào)用home2具體實例-----");
// home2.specificplace();
home2.specifictype();
// home2.specificsize();
// home2.specificprovince();
// home2.specificcountry();
// 由上可知胧砰,在建筑風格的角度去調(diào)用,只能看到家里建筑風格冤荆,大小朴则,國家,省份看不到
System.out.println("*******");
System.out.println("-----從建筑大小的方面去調(diào)用home3具體實例-----");
// home3.specificplace();
// home3.specifictype();
home3.specificsize();
// home3.specificprovince();
// home3.specificcountry();
// 由上可知钓简,在建筑大小的角度去調(diào)用,只能看到家里建筑大小汹想,風格外邓,國家,省份看不到
System.out.println("*******");
System.out.println("-----從居住省份的方面去調(diào)用home4具體實例-----");
// home4.specificplace();
// home4.specifictype();
// home4.specificsize();
home4.specificprovince();
// home4.specificcountry();
// 由上可知古掏,在居住省份的角度去調(diào)用损话,只能看到家里居住的省份,大小槽唾,國家丧枪,建筑風格看不到
System.out.println("*******");
System.out.println("* *");
System.out.println("* *");
System.out.println("*******");
System.out.println("-----從居住國家的方面去調(diào)用home5具體實例-----");
// home5.specificplace();
// home5.specifictype();
// home5.specificsize();
// home5.specificprovince();
home5.specificcountry();
// 由上可知,在居住國家的角度去調(diào)用庞萍,只能看到家里居住的國家拧烦,大小,風格钝计,省份看不到
System.out.println("*******");
}
}
接口練習
綜合以上恋博,方案二比較好齐佳,類如果都實現(xiàn)了接口方法,則是實現(xiàn)類债沮,否則都是抽象類炼吴。
方案一:
package com.itppf.dao;
public interface IDAO {
public abstract void connect();
public abstract void add();
public abstract void del();
public abstract void upd();
public abstract void sel();
}
package com.itppf.dao;
public class MysqlDAO implements IDAO{
@Override
public void connect() {
System.out.println("連接mysql");
}
@Override
public void add() {
System.out.println("增加數(shù)據(jù)");
}
@Override
public void del() {
System.out.println("刪除數(shù)據(jù)");
}
@Override
public void upd() {
System.out.println("更新數(shù)據(jù)");
}
@Override
public void sel() {
System.out.println("查詢數(shù)據(jù)");
}
}
package com.itppf.dao;
public class OrcaleDAO implements IDAO{
@Override
public void connect() {
System.out.println("連接Orcale");
}
@Override
public void add() {
System.out.println("增加數(shù)據(jù)");
}
@Override
public void del() {
System.out.println("刪除數(shù)據(jù)");
}
@Override
public void upd() {
System.out.println("更新數(shù)據(jù)");
}
@Override
public void sel() {
System.out.println("查詢數(shù)據(jù)");
}
}
package com.itppf.dao;
import com.sun.org.apache.xpath.internal.operations.Or;
import java.util.Scanner;
public class FirstClient {
public static void main(String[] args) {
System.out.println("你想要連接哪一個數(shù)據(jù)庫");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
if(n==1){
IDAO idao=new MysqlDAO();
idao.connect();
idao.add();
idao.del();
idao.upd();
idao.sel();
}else if(n==2){
IDAO idao=new OrcaleDAO();
idao.connect();
idao.add();
idao.del();
idao.upd();
idao.sel();
}
}
}
以上方案一可以看得出程序代碼的復用性很差。
方案二:
package com.itppf.entity;
public interface IDAO {
public abstract void connect();
public abstract void add();
public abstract void del();
public abstract void upd();
public abstract void sel();
}
package com.itppf.entity;
public abstract class AbstractDAO implements IDAO {
@Override
public void add() {
System.out.println("增加數(shù)據(jù)");
}
@Override
public void del() {
System.out.println("刪除數(shù)據(jù)");
}
@Override
public void upd() {
System.out.println("更新數(shù)據(jù)");
}
@Override
public void sel() {
System.out.println("查詢數(shù)據(jù)");
}
}
package com.itppf.entity;
public class MysqlDAO extends AbstractDAO {
@Override
public void connect(){
System.out.println("連接mysql數(shù)據(jù)庫疫衩!");
}
}
package com.itppf.entity;
public class OrcaleDAO extends AbstractDAO{
@Override
public void connect() {
System.out.println("連接orcale數(shù)據(jù)庫硅蹦!");
}
}
package com.itppf.entity;
import com.sun.xml.internal.bind.v2.model.core.ID;
import java.util.Scanner;
public class ScondClient {
public static void main(String[] args) {
System.out.println("你想連接哪個數(shù)據(jù)庫?1-mysql 2-orcale");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
//全局聲明
IDAO idao=null;
if(n==1){
idao=new MysqlDAO();
}else if(n==2){
idao=new OrcaleDAO();
}
idao.connect();
idao.add();
idao.del();
idao.upd();
idao.sel();
}
}
方案二則是將公有的方法從接口里面抽出來闷煤,形成一個抽象類提针,然后子類繼承父類并且將不同的部分進行重寫。
注:java接口可以被繼承,而且是多繼承,但是只能是接口繼承接口,類只能實現(xiàn)接口曹傀。一個接口可以繼承另一個接口或多個,一個普通類可以實現(xiàn)多個接口辐脖。
15.成員變量初始值
1.java中的變量必須先聲明,再賦值皆愉,最后才能使用嗜价。
2.java中的成員變量,在創(chuàng)建對象的時候幕庐,都會執(zhí)行一次初始化的操作久锥,默認一個初始值。
3.基本數(shù)據(jù)類型默認值都是0异剥,引用數(shù)據(jù)類型默認值都是null瑟由,null表示的是占位符。
public class InitialValue {
byte b;
float f;
double d;
int i;
char c;
boolean bool;
short s;
long l;
String str;
InitialValue inital;
}
public class InitialTest {
public static void main(String[] args) {
InitialValue i=new InitialValue();
System.out.println("byte="+i.b);
System.out.println("float="+i.f);
System.out.println("double="+i.d);
System.out.println("int="+i.i);
System.out.println("char="+i.c);
System.out.println("boolean="+i.bool);
System.out.println("short="+i.s);
System.out.println("long="+i.l);
System.out.println("String="+i.str);
System.out.println("InitialValue="+i.inital);
}
}
16.object
1.object是基類冤寿,任何類都要繼承自它歹苦。
2.我們寫的類,即使不繼承自父類督怜,也會繼承自它殴瘦。繼承的父類也是object的子類。
17.equals和==
1.==判斷左右的數(shù)據(jù)是否相等号杠。
2.object類提供的一種方法蚪腋,判斷兩個對象是否相等。
public class Cow {
String name;
String color;
int age;
public Cow(String name,String color,int age){
this.name=name;
this.color=color;
this.age=age;
}
public static void main(String[] args) {
Cow cow1=new Cow("小黃","黃色",12);
Cow cow2=new Cow("小黃","黃色",12);
System.out.println(cow1==cow2);
System.out.println(cow1.equals(cow2));
}
}
輸出:
false
false
3."=="一般默認基本數(shù)據(jù)類型是否相等姨蟋,判斷兩個內(nèi)存的地址是否一致屉凯,這里new開辟了新空間,所以肯定不一致眼溶。
4."equals"默認是object提供的方法悠砚。
public class Cow {
String name;
String color;
int age;
public Cow(String name,String color,int age){
this.name=name;
this.color=color;
this.age=age;
}
public boolean equals(Cow cow){
if(this.name==cow.name && this.color==cow.color){
return true;
}else{
return false;
}
}
public static void main(String[] args) {
Cow cow1=new Cow("小黃","黃色",12);
Cow cow2=new Cow("小黃","黃色",12);
// System.out.println(cow1==cow2);
System.out.println(cow1.equals(cow2));
}
}
輸出:
true
5.上面代碼中的"equals"是子類對于父類object方法的不滿,然后行的擴展偷仿,然后進行重寫哩簿。
if(this.name==cow.name && this.color==cow.color){ //這句中的條件可以寫一個兩個或者全部宵蕉。
EG:舉個例子,cow1和cow2只有名字一樣其余都不一樣节榜,然后根據(jù)name判斷是否相等羡玛?
public class Cow {
String name;
String color;
int age;
public Cow(String name,String color,int age){
this.name=name;
this.color=color;
this.age=age;
}
public boolean equals(Cow cow){
if(this.name==cow.name){
return true;
}else{
return false;
}
}
public static void main(String[] args) {
Cow cow1=new Cow("小黃","黑色",11);
Cow cow2=new Cow("小黃","黃色",12);
// System.out.println(cow1==cow2);
System.out.println(cow1.equals(cow2));
}
}
輸出:
true
6.說明equals很靈活,縱使顏色和年齡都不同宗苍,然后根據(jù)name相等依然可以得出兩者相同稼稿。
7.同理,只有年齡不同讳窟,依然可根據(jù)name&&color得出相同让歼。
經(jīng)典案例一:
package com.itppf;
public class Tiger {
public static void main(String[] args) {
String str1="老虎";
String str2="老虎";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
}
}
輸出:
true;
true;
這里str1開辟了內(nèi)存地址,str2發(fā)現(xiàn)一樣后也指向了“老虎”丽啡。
經(jīng)典案例二:
package com.itppf;
public class Tiger {
public static void main(String[] args) {
String str3=new String("老虎");
String str4=new String("老虎");
System.out.println(str3==str4);
System.out.println(str3.equals(str4));
}
}
輸出:
false谋右;//new String來引入(”老虎“),是不同的對象补箍。
true改执;//兩個字符串的內(nèi)容是一致的。
練習模擬登陸坑雅。
import java.util.Scanner;
public class Login {
public static void main(String[] args) {
String username="admin";
String userpassword="admin";
Scanner scanner=new Scanner(System.in);
System.out.println("請輸入用戶名:");
String uname=scanner.nextLine();
System.out.println("請輸入密碼:");
String upassword=scanner.nextLine();
if (uname.equals(username) && userpassword.equals(upassword) ){
System.out.println("登陸成功");
}else{
System.out.println("登錄失敗");
}
}
}
這里涉及到一個問題辈挂,掃描儀調(diào)用的next()、nextInt()裹粤、nextLine()到底有什么區(qū)別终蒂?
1.他們的區(qū)別在于對于空格的處理方式不同,以及返回值不同遥诉。
2.使用nextLine()方法時拇泣,不將空格看做是兩個字符串的間隔,而是看作字符串的一部分突那,返回時挫酿,它作為String類型一并返回。
3.使用next()方法時愕难,將空格看作是兩個字符串的間隔。
4.使用nextInt()方法時惫霸,與next()方法類似猫缭,只是它的返回值是int類型的,依舊將空格看作是兩個輸入的數(shù)據(jù)的間隔壹店。
18.toString
1.toString()對一個對象字符串的表現(xiàn)形式猜丹。
2.java中建議對toString()方法進行重寫,原本默認是方法是包名+類名+內(nèi)存地址硅卢。
直接賦值:
package com.itppf.entity;
public class Dog {
String name="小黃";
String color="綠色";
int age=13;
public static void main(String[] args) {
Dog dog1=new Dog();
System.out.println(dog1);
System.out.println(dog1.toString());
}
}
突然我在這里意識到了一個問題射窒,那就是:
直接賦值和使用構(gòu)造方法有什么區(qū)別藏杖?
直接賦值內(nèi)存地址和值都相同,構(gòu)造方法賦值脉顿,內(nèi)存地址不同蝌麸,值同。直接賦值比較耗費內(nèi)存艾疟,而使用構(gòu)造方法可以起到懶加載的作用来吩,創(chuàng)建對象后開始賦值。
使用構(gòu)造方法:
package com.itppf.entity;
public class Dog {
String name;
String cllor;
int age;
public Dog(String name,String color,int age){
this.name=name;
this.cllor=color;
this.age=age;
}
@Override
public String toString() { //這是idea提供的自動重寫方法蔽莱。
return "Dog{" +
"name='" + name + '\'' +
", cllor='" + color + '\'' +
", age=" + age +
'}';
}
//public String toString(){ 這是我重寫的構(gòu)造方法弟疆。
// return "我的狗的名字叫:"+this.name+"我的狗的顏色是:"+this.color+"年齡:"+this.age;
//}
public static void main(String[] args) {
Dog dog2=new Dog("小黃","黃色",13);
System.out.println(dog2.toString());
}
}
這是idea提供的自動重寫方法。
這是我重寫的構(gòu)造方法盗冷。
19.instanceof關鍵字
1.主要判斷對象屬于哪種類型的怠苔。
package com.itppf.entity;
public class Mouse extends Animal {
public static void main(String[] args) {
Animal animal=new Mouse();
//Animal animal=new Animal();這不是老鼠。
if(animal instanceof Mouse){
System.out.println("這是一只老鼠");
}else{
System.out.println("這不是老鼠");
}
}
}
20.參數(shù)傳遞的問題
1.值傳遞(java中就是值傳遞)仪糖。
2.引用傳遞柑司。
package com.itppf.entity;
public class ChairTest {
public static void chang(Chair chair){
chair=new Chair("長椅子");
}
public static void main(String[] args) {
Chair chair=new Chair("短椅子");
chang(chair);
System.out.println(chair.name);
}
}
輸出:
短椅子
package com.itppf.entity;
public class ChairTest {
public static void chang(Chair chair){
chair.name="長椅子";
}
public static void main(String[] args) {
Chair chair=new Chair("短椅子");
chang(chair);
System.out.println(chair.name);
}
}
輸出:
短椅子
這里使用到了內(nèi)存分析,需要畫圖分析乓诽。
總結(jié):面向?qū)ο笾难颍系垡暯牵芽厝帧?/h4>
1.類與對象:對象操作程序鸠天,類創(chuàng)建對象讼育,類與對象就是對數(shù)據(jù)的封裝。
2.構(gòu)造:給對象設置屬性值稠集,出廠化的設置奶段、(this表示當前類的對象,拿到這個對象內(nèi)容剥纷、訪問構(gòu)造方法痹籍。super 調(diào)用自己類中父類的內(nèi)容,子類和父類中重名的內(nèi)容可以區(qū)分晦鞋,調(diào)用父類的構(gòu)造方法)蹲缠。
3.訪問權限:
4.繼承:父類有的功能,子類可以進行擴展悠垛,簡化開發(fā)线定。
5.多態(tài):同一個對象有不同的形態(tài),你可以是兒子确买,可以是爸爸斤讥,可以是弟弟。
6.抽象:abstract湾趾,抽象方法可以不寫方法體芭商,抽象類可以寫抽象方法也可以寫正常的方法派草,對子類的約束,必須重寫抽象類中的抽象方法铛楣。
7.接口:特殊的抽象類近迁,interface。能繼承接口的必須是接口蛉艾。類可實現(xiàn)接口钳踊,一個類可以實現(xiàn)多個接口,為了彌補java不能多繼承勿侯,java可以多實現(xiàn)拓瞪。
8.內(nèi)存分析:
21.異常處理
編譯異常:語法錯誤,編碼錯誤助琐。
1.運行異常:編譯的時候是沒有錯誤的祭埂,語法方面是絕對正確的,找的就是運行時候的錯誤兵钮。
2.拋異常:發(fā)現(xiàn)錯誤的時候蛆橡,會創(chuàng)建一個錯誤的對象對錯誤進行收集,丟出錯誤對象的過程叫拋異常掘譬。
3.捕獲異常:默認由JVM來捕獲異常泰演,對錯誤信息進行打印,JVM會終止程序的進行葱轩。
1.異常的分類:
Throwable是所有異常的根睦焕,所有的異常都繼承自Throwable,類似于Object靴拱。
Error:系統(tǒng)級的錯誤垃喊。
RuntimeExpection:運行異常,不手動處理袜炕,出問題了處理本谜,例子(車爆胎)。
其他Exception:必須要經(jīng)過手動處理偎窘,例子(路障)乌助。
2.異常處理try...catch
語法:
try{
嘗試執(zhí)行的代碼;
}catch(Exception e){ //catch抓住,Exception類型的e來接收異常。
處理異常的代碼;
}finally //無論是否出錯陌知,都要finally
舉個例子
package com.itppf.entity;
public class YcTest {
public static void main(String[] args) {
try{
System.out.println(1/0);
}catch (Exception e){
e.printStackTrace(); //打印出錯誤眷茁,面向程序員。
System.out.println("程序出錯了纵诞!"); //面向用戶
}finally{
System.out.println("執(zhí)行finally");
}
}
}
try{
嘗試執(zhí)行的代碼;
}catch(Exception e){ //catch抓住,Exception類型的e來接收異常。
處理異常的代碼;
}finally //無論是否出錯陌知,都要finally
package com.itppf.entity;
public class YcTest {
public static void main(String[] args) {
try{
System.out.println(1/0);
}catch (Exception e){
e.printStackTrace(); //打印出錯誤眷茁,面向程序員。
System.out.println("程序出錯了纵诞!"); //面向用戶
}finally{
System.out.println("執(zhí)行finally");
}
}
}
如果程序是對的呢?
finally:很有用培遵,代碼沒有錯浙芙,可以使用finally看到登刺。
使用finally關閉文件,否則文件始終處于打開狀態(tài)嗡呼。
3.異常處理throws和throw
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileTest {
public static void read(){
InputStream inputStream=new FileInputStream(new File("hello,world!"));
}
}
第一種:try...catch
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileTest {
public static void read(){
try{
InputStream inputStream=new FileInputStream(new File("hello,world!"));
}catch (Exception e){
System.out.println("出錯");
}finally{
System.out.println("結(jié)束");
}
}
}
第二種方法:代表當前異常不處理這個錯誤纸俭,扔出去,有人調(diào)用這個方法南窗,誰調(diào)用誰處理揍很。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileTest {
public static void read() throws Exception{ //代表當前異常不處理這個錯誤,扔出去万伤,有人調(diào)用這個方法窒悔,誰調(diào)用誰處理。敌买。
InputStream inputStream=new FileInputStream(new File("hello,world!"));
}
public static void main(String[] args) {
try {
read();
} catch (Exception e) {
e.printStackTrace();
}
}
}
或者繼續(xù)拋出简珠。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileTest {
public static void read() throws Exception{ //代表當前異常不處理這個錯誤,扔出去虹钮,有人調(diào)用這個方法聋庵,誰調(diào)用誰處理。芙粱。
InputStream inputStream=new FileInputStream(new File("hello,world!"));
}
public static void main(String[] args) throws Exception{
read();
}
}
這樣一直拋祭玉,等于會拋給用戶。
盡量能處理的問題不要拋給用戶
4.自定義異常
直接繼承Exception或者RuntimeException來實現(xiàn)自定義異常春畔。
public class Person {
String name;
String gender;
public Person(String name,String gender){
this.name=name;
this.gender=gender;
}
}
public class Bathhouse {
public void manBathhouse(Person person) throws GenderException{
if(person.gender.equals("男")){
System.out.println("歡迎來到男浴室"); //如果是男脱货,歡迎來到男浴室。
}else { //否則拋出異常
throw new GenderException("走錯了");
}
}
}
//自己定義的必須繼承Exception或者RuntimeException
public class GenderException extends Exception {
public GenderException(String msg){
super(msg); //調(diào)用父類的構(gòu)造方法
}
}
public class GenderTest {
public static void main(String[] args) throws GenderException{
Person person1=new Person("張三","男");
Person person2=new Person("李四","女");
Bathhouse bathhouse=new Bathhouse();
// bathhouse. manBathhouse(person1);
bathhouse.manBathhouse(person2);
}
}
以上就是我跟這IT老男孩學習的面向?qū)ο蟮墓P記拐迁,大多是我自己感悟蹭劈,有的也不一定正確,希望大家批評指正线召。我覺得經(jīng)過學習后基本了解了面向?qū)ο笃倘停院笮枰獙W習的還有很多,數(shù)據(jù)結(jié)構(gòu)以及數(shù)組缓淹,對接口哈打,繼承,封裝讯壶,多態(tài)的深入了解料仗,以及java的二十三種設計模式,加油吧伏蚊。
筆記和代碼已放到github上面:
筆記:https://github.com/FSDWNS/theory.git
代碼:https://github.com/FSDWNS/java.git