面向?qū)ο笏拇筇匦?/h4>
抽象:將現(xiàn)實(shí)事物或問(wèn)題抽象成大腦中的概念模型
繼承:一個(gè)類(lèi)可以從一個(gè)現(xiàn)有的類(lèi)當(dāng)中派生出來(lái),派生出來(lái)的類(lèi)稱為該類(lèi)的子類(lèi),原有的類(lèi)稱為父類(lèi)(基類(lèi),超類(lèi))
子類(lèi)會(huì)擁有父類(lèi)當(dāng)中所有的屬性和方法,除了:
①私有成員
②構(gòu)造器
在Java中只支持單繼承,一個(gè)子類(lèi)只能有一個(gè)直接父類(lèi),一個(gè)父類(lèi)可以有任意多個(gè)子類(lèi)
繼承的語(yǔ)法
public class A extends(拓展) B{}
繼承帶來(lái)的優(yōu)點(diǎn):
是一種代碼重用的重要手段,也是實(shí)現(xiàn)"開(kāi)閉原則"的基礎(chǔ),同時(shí)子類(lèi)還可以添加自己獨(dú)有的屬性和方法,來(lái)拓展父類(lèi)功能
開(kāi)閉原則:對(duì)拓展開(kāi)放,對(duì)修改關(guān)閉
public class Employee {
String name;// 名字
int id;// 工號(hào)
public void code() {
System.out.println(name+"在工作");
}
}
public class Manager extends Employee{
double money;
public void rest() {
System.out.println(name+"在休息");
}
}
public class Test {
public static void main(String[] args) {
Manager m = new Manager();
m.name = "李磊";
m.code();
m.rest();
Employee e = new Employee();
e.code();
Employee e1 = new Manager();
}
}
子類(lèi)實(shí)例化的過(guò)程(創(chuàng)建一個(gè)子類(lèi)對(duì)象時(shí),發(fā)生了什么)
創(chuàng)建子類(lèi)對(duì)象時(shí),子類(lèi)構(gòu)造器會(huì)默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造器先創(chuàng)建父類(lèi)對(duì)象,之后再創(chuàng)建子類(lèi)對(duì)象
若父類(lèi)沒(méi)有無(wú)參構(gòu)造器,子類(lèi)構(gòu)造器就必須使用super顯式(寫(xiě)代碼)調(diào)用父類(lèi)的有參構(gòu)造器,否則編譯出錯(cuò)
super
①super(args)調(diào)用父類(lèi)其他構(gòu)造器,只能用在子類(lèi)構(gòu)造器,第一行,只能用一次
②super.屬性名,super.方法名
方法的重寫(xiě)
public class FatherDemo1 {
int num = 100;
public void study() {
System.out.println("父類(lèi)在努力學(xué)習(xí)");
}
}
public class SonDemo1 extends FatherDemo1{
int num = 20;// 注意屬性不存在重寫(xiě)
String name = "leo";
public void test() {
System.out.println("test方法");
}
@Override
public void study() {
System.out.println(num);
System.out.println("子類(lèi)在玩,不咋學(xué)習(xí)");
}
}
public class Test1 {
public Object getNum() {
return "String";
}
public static void main(String[] args) {
// FatherDemo1 sd = new FatherDemo1();
// SonDemo1 sd1 = new SonDemo1();
// sd1.name = "張三";
// sd1.num = 1;
// sd1.test();
// sd1.study();
// sd.study();// 父類(lèi)在努力學(xué)習(xí) 子類(lèi)在玩,不咋學(xué)習(xí)
// System.out.println(sd.num);
// 上溯造型(向上轉(zhuǎn)型) : 父類(lèi)引用指向子類(lèi)對(duì)象
// 父類(lèi)引用不能訪問(wèn)子類(lèi)拓展的屬性和方法
// 調(diào)用的方法取決于對(duì)象類(lèi)型,不取決于引用類(lèi)型
FatherDemo1 sd = new SonDemo1();
sd.study();
System.out.println(sd.num);
// 下溯造型(向下轉(zhuǎn)型):子類(lèi)引用指向父類(lèi)對(duì)象,只有上溯過(guò)的才能下溯
SonDemo1 sd1 = (SonDemo1)sd;
FatherDemo1 sd2 = sd1;
FatherDemo1 sd3 = new SonDemo2();
FatherDemo1 sd4 = sd3;
// 判斷一個(gè)引用指向哪一個(gè)類(lèi)
if(sd4 instanceof SonDemo1) {
System.out.println("SonDemo1");
}
if(sd4 instanceof SonDemo2) {
System.out.println("SonDemo2");
}
// Test1 t = new Test1();
// String str = (String)t.getNum();
// System.out.println(str.length());
}
}
封裝:將功能組織到方法中,將屬性和方法組織到類(lèi)中都是封裝
訪問(wèn)權(quán)限修飾符
JavaBean實(shí)體類(lèi)
public class Demo5 {
public static void main(String[] args) {
// Java面相對(duì)象特性:繼承,封裝,多態(tài),抽象
// 抽象(程序員將現(xiàn)實(shí)實(shí)物抽象為腦中概念模型)
// 封裝 :將一套功能組織成一個(gè)方法,將一套方法加一套屬性組織到一個(gè)類(lèi),將一套類(lèi)組織到一個(gè)包中
// 訪問(wèn)權(quán)限修飾符
/*
* public : 公有,工程中可見(jiàn)
* 能修飾類(lèi),方法,屬性(全局變量)
* protected : 受保護(hù)的,當(dāng)前包可見(jiàn),跨包的“親戚(子類(lèi))”可見(jiàn),“非親戚(非子類(lèi))”不可見(jiàn)
* 能修飾方法和屬性
* 【friendly,default】:默認(rèn)的,跨包不可見(jiàn)
* 能修飾類(lèi),方法,屬性(全局變量)
* private : 私有的,只有當(dāng)前類(lèi)可見(jiàn)
* 能修飾方法和屬性
*/
// JavaBean(實(shí)體類(lèi)) :
// 1.有無(wú)參構(gòu)造器(必要)
// 2.屬性全部私有
// 3.有公有的get(獲取)和set(修改)方法
}
}
public class Student {
private int num = 10;
private int age = 20;
private String name;
public void test() {
System.out.println("測(cè)試方法");
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
多態(tài):(一種事物的不用形態(tài),對(duì)同一消息做出的不同響應(yīng))是一種編程策略
條件:
①要有泛化(繼承,實(shí)現(xiàn))關(guān)系;
②要有上溯造型(父類(lèi)引用指向子類(lèi)對(duì)象);
③要有方法的重寫(xiě)
優(yōu)點(diǎn):解耦合(拓展性強(qiáng),易維護(hù))
public class Customer {
int id;
String name;
public void buy(TrainStation ts) {}
}
public class Student extends Customer{
public Student() {}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)學(xué)員,打五折,收費(fèi)"+ts.price*0.5);
}
}
public class Criminal extends Customer{
public Criminal() {}
public Criminal(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)罪犯,打骨折");
}
}
public class Teacher extends Customer{
public Teacher() {}
public Teacher(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)講師,打八折,收費(fèi)"+ts.price*0.8);
}
}
public class TrainStation {
int price = 100;
public void saleTicket(Customer c) {
TrainStation ts1 = this;
c.buy(ts1);
}
}
public class Test {
public static void main(String[] args) {
Customer s = new Student(1001, "小翟");
Customer t = new Teacher(9527, "大翟");
Customer c = new Criminal(1011011, "老翟");
Customer e = new Employee(1, "老翟1111");
TrainStation ts = new TrainStation();
ts.saleTicket(s);
ts.saleTicket(t);
ts.saleTicket(c);
ts.saleTicket(e);
}
}
在Java中多態(tài)有哪些體現(xiàn)
重載--編譯時(shí)多態(tài)
重寫(xiě)--運(yùn)行時(shí)多態(tài)
接口
public interface News {
// 發(fā)布新聞
void releaseNews();
}
/**
* 體育板塊
* @author Administrator
*/
public class Sports implements News{
@Override
public void releaseNews() {
System.out.println("發(fā)布了一條體育新聞");
}
}
/**
* 娛樂(lè)板塊
* @author Administrator
*/
public class Entertainment implements News{
public void releaseNews() {
System.out.println("發(fā)布了一條娛樂(lè)新聞");
}
}
/**
* 政治板塊
* @author Administrator
*/
public class Polity implements News{
@Override
public void releaseNews() {
System.out.println("發(fā)布了一條政治新聞");
}
}
public class TestDemo1 {
public static void main(String[] args) {
while(true) {
Scanner scan = new Scanner(System.in);
System.out.println("請(qǐng)輸入要發(fā)布的新聞?lì)愋?);
System.out.println("1--------體育新聞");
System.out.println("2--------政治新聞");
System.out.println("3--------娛樂(lè)新聞");
System.out.println("4----------退出");
int num = scan.nextInt();
// 上溯
News n = null;
if(num < 1 || num > 4) {
System.out.println("無(wú)此選項(xiàng)");
}else {
switch(num) {
case 1:
n = new Sports();
break;
case 2:
n = new Polity();
break;
case 3:
n = new Entertainment();
break;
case 4:
System.out.println("再見(jiàn)");
return;
}
n.releaseNews();
}
}
}
}
抽象類(lèi)abstract
public static void main(String[] args) {
/*
* final
* 能修飾類(lèi),方法,屬性(常量)
* final類(lèi)不能被繼承
* final方法不能被子類(lèi)重寫(xiě)
* final屬性常量,不能改變
*
* abstract抽象
* 能修飾
* 類(lèi) :不能實(shí)例化(不能創(chuàng)建對(duì)象,但是有構(gòu)造器),它的作用就是做父類(lèi)
* 方法:抽象方法,沒(méi)有方法體,如果一個(gè)類(lèi)中有抽象方法,這個(gè)類(lèi)必須是抽象類(lèi)
* 抽象類(lèi)中可以有非抽象方法
* 如果一個(gè)類(lèi)繼承了一個(gè)抽象類(lèi),就必須實(shí)現(xiàn)父類(lèi)所有抽象方法,除非這個(gè)子類(lèi)也是抽象類(lèi)
*/
}
抽象:將現(xiàn)實(shí)事物或問(wèn)題抽象成大腦中的概念模型
繼承:一個(gè)類(lèi)可以從一個(gè)現(xiàn)有的類(lèi)當(dāng)中派生出來(lái),派生出來(lái)的類(lèi)稱為該類(lèi)的子類(lèi),原有的類(lèi)稱為父類(lèi)(基類(lèi),超類(lèi))
子類(lèi)會(huì)擁有父類(lèi)當(dāng)中所有的屬性和方法,除了:
①私有成員
②構(gòu)造器
在Java中只支持單繼承,一個(gè)子類(lèi)只能有一個(gè)直接父類(lèi),一個(gè)父類(lèi)可以有任意多個(gè)子類(lèi)
繼承的語(yǔ)法
public class A extends(拓展) B{}
繼承帶來(lái)的優(yōu)點(diǎn):
是一種代碼重用的重要手段,也是實(shí)現(xiàn)"開(kāi)閉原則"的基礎(chǔ),同時(shí)子類(lèi)還可以添加自己獨(dú)有的屬性和方法,來(lái)拓展父類(lèi)功能
開(kāi)閉原則:對(duì)拓展開(kāi)放,對(duì)修改關(guān)閉
public class Employee {
String name;// 名字
int id;// 工號(hào)
public void code() {
System.out.println(name+"在工作");
}
}
public class Manager extends Employee{
double money;
public void rest() {
System.out.println(name+"在休息");
}
}
public class Test {
public static void main(String[] args) {
Manager m = new Manager();
m.name = "李磊";
m.code();
m.rest();
Employee e = new Employee();
e.code();
Employee e1 = new Manager();
}
}
子類(lèi)實(shí)例化的過(guò)程(創(chuàng)建一個(gè)子類(lèi)對(duì)象時(shí),發(fā)生了什么)
創(chuàng)建子類(lèi)對(duì)象時(shí),子類(lèi)構(gòu)造器會(huì)默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造器先創(chuàng)建父類(lèi)對(duì)象,之后再創(chuàng)建子類(lèi)對(duì)象
若父類(lèi)沒(méi)有無(wú)參構(gòu)造器,子類(lèi)構(gòu)造器就必須使用super顯式(寫(xiě)代碼)調(diào)用父類(lèi)的有參構(gòu)造器,否則編譯出錯(cuò)
super
①super(args)調(diào)用父類(lèi)其他構(gòu)造器,只能用在子類(lèi)構(gòu)造器,第一行,只能用一次
②super.屬性名,super.方法名
public class FatherDemo1 {
int num = 100;
public void study() {
System.out.println("父類(lèi)在努力學(xué)習(xí)");
}
}
public class SonDemo1 extends FatherDemo1{
int num = 20;// 注意屬性不存在重寫(xiě)
String name = "leo";
public void test() {
System.out.println("test方法");
}
@Override
public void study() {
System.out.println(num);
System.out.println("子類(lèi)在玩,不咋學(xué)習(xí)");
}
}
public class Test1 {
public Object getNum() {
return "String";
}
public static void main(String[] args) {
// FatherDemo1 sd = new FatherDemo1();
// SonDemo1 sd1 = new SonDemo1();
// sd1.name = "張三";
// sd1.num = 1;
// sd1.test();
// sd1.study();
// sd.study();// 父類(lèi)在努力學(xué)習(xí) 子類(lèi)在玩,不咋學(xué)習(xí)
// System.out.println(sd.num);
// 上溯造型(向上轉(zhuǎn)型) : 父類(lèi)引用指向子類(lèi)對(duì)象
// 父類(lèi)引用不能訪問(wèn)子類(lèi)拓展的屬性和方法
// 調(diào)用的方法取決于對(duì)象類(lèi)型,不取決于引用類(lèi)型
FatherDemo1 sd = new SonDemo1();
sd.study();
System.out.println(sd.num);
// 下溯造型(向下轉(zhuǎn)型):子類(lèi)引用指向父類(lèi)對(duì)象,只有上溯過(guò)的才能下溯
SonDemo1 sd1 = (SonDemo1)sd;
FatherDemo1 sd2 = sd1;
FatherDemo1 sd3 = new SonDemo2();
FatherDemo1 sd4 = sd3;
// 判斷一個(gè)引用指向哪一個(gè)類(lèi)
if(sd4 instanceof SonDemo1) {
System.out.println("SonDemo1");
}
if(sd4 instanceof SonDemo2) {
System.out.println("SonDemo2");
}
// Test1 t = new Test1();
// String str = (String)t.getNum();
// System.out.println(str.length());
}
}
封裝:將功能組織到方法中,將屬性和方法組織到類(lèi)中都是封裝

public class Demo5 {
public static void main(String[] args) {
// Java面相對(duì)象特性:繼承,封裝,多態(tài),抽象
// 抽象(程序員將現(xiàn)實(shí)實(shí)物抽象為腦中概念模型)
// 封裝 :將一套功能組織成一個(gè)方法,將一套方法加一套屬性組織到一個(gè)類(lèi),將一套類(lèi)組織到一個(gè)包中
// 訪問(wèn)權(quán)限修飾符
/*
* public : 公有,工程中可見(jiàn)
* 能修飾類(lèi),方法,屬性(全局變量)
* protected : 受保護(hù)的,當(dāng)前包可見(jiàn),跨包的“親戚(子類(lèi))”可見(jiàn),“非親戚(非子類(lèi))”不可見(jiàn)
* 能修飾方法和屬性
* 【friendly,default】:默認(rèn)的,跨包不可見(jiàn)
* 能修飾類(lèi),方法,屬性(全局變量)
* private : 私有的,只有當(dāng)前類(lèi)可見(jiàn)
* 能修飾方法和屬性
*/
// JavaBean(實(shí)體類(lèi)) :
// 1.有無(wú)參構(gòu)造器(必要)
// 2.屬性全部私有
// 3.有公有的get(獲取)和set(修改)方法
}
}
public class Student {
private int num = 10;
private int age = 20;
private String name;
public void test() {
System.out.println("測(cè)試方法");
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
多態(tài):(一種事物的不用形態(tài),對(duì)同一消息做出的不同響應(yīng))是一種編程策略
條件:
①要有泛化(繼承,實(shí)現(xiàn))關(guān)系;
②要有上溯造型(父類(lèi)引用指向子類(lèi)對(duì)象);
③要有方法的重寫(xiě)
優(yōu)點(diǎn):解耦合(拓展性強(qiáng),易維護(hù))
public class Customer {
int id;
String name;
public void buy(TrainStation ts) {}
}
public class Student extends Customer{
public Student() {}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)學(xué)員,打五折,收費(fèi)"+ts.price*0.5);
}
}
public class Criminal extends Customer{
public Criminal() {}
public Criminal(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)罪犯,打骨折");
}
}
public class Teacher extends Customer{
public Teacher() {}
public Teacher(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void buy(TrainStation ts) {
System.out.println(name+"是一個(gè)講師,打八折,收費(fèi)"+ts.price*0.8);
}
}
public class TrainStation {
int price = 100;
public void saleTicket(Customer c) {
TrainStation ts1 = this;
c.buy(ts1);
}
}
public class Test {
public static void main(String[] args) {
Customer s = new Student(1001, "小翟");
Customer t = new Teacher(9527, "大翟");
Customer c = new Criminal(1011011, "老翟");
Customer e = new Employee(1, "老翟1111");
TrainStation ts = new TrainStation();
ts.saleTicket(s);
ts.saleTicket(t);
ts.saleTicket(c);
ts.saleTicket(e);
}
}
在Java中多態(tài)有哪些體現(xiàn)
重載--編譯時(shí)多態(tài)
重寫(xiě)--運(yùn)行時(shí)多態(tài)
public interface News {
// 發(fā)布新聞
void releaseNews();
}
/**
* 體育板塊
* @author Administrator
*/
public class Sports implements News{
@Override
public void releaseNews() {
System.out.println("發(fā)布了一條體育新聞");
}
}
/**
* 娛樂(lè)板塊
* @author Administrator
*/
public class Entertainment implements News{
public void releaseNews() {
System.out.println("發(fā)布了一條娛樂(lè)新聞");
}
}
/**
* 政治板塊
* @author Administrator
*/
public class Polity implements News{
@Override
public void releaseNews() {
System.out.println("發(fā)布了一條政治新聞");
}
}
public class TestDemo1 {
public static void main(String[] args) {
while(true) {
Scanner scan = new Scanner(System.in);
System.out.println("請(qǐng)輸入要發(fā)布的新聞?lì)愋?);
System.out.println("1--------體育新聞");
System.out.println("2--------政治新聞");
System.out.println("3--------娛樂(lè)新聞");
System.out.println("4----------退出");
int num = scan.nextInt();
// 上溯
News n = null;
if(num < 1 || num > 4) {
System.out.println("無(wú)此選項(xiàng)");
}else {
switch(num) {
case 1:
n = new Sports();
break;
case 2:
n = new Polity();
break;
case 3:
n = new Entertainment();
break;
case 4:
System.out.println("再見(jiàn)");
return;
}
n.releaseNews();
}
}
}
}
public static void main(String[] args) {
/*
* final
* 能修飾類(lèi),方法,屬性(常量)
* final類(lèi)不能被繼承
* final方法不能被子類(lèi)重寫(xiě)
* final屬性常量,不能改變
*
* abstract抽象
* 能修飾
* 類(lèi) :不能實(shí)例化(不能創(chuàng)建對(duì)象,但是有構(gòu)造器),它的作用就是做父類(lèi)
* 方法:抽象方法,沒(méi)有方法體,如果一個(gè)類(lèi)中有抽象方法,這個(gè)類(lèi)必須是抽象類(lèi)
* 抽象類(lèi)中可以有非抽象方法
* 如果一個(gè)類(lèi)繼承了一個(gè)抽象類(lèi),就必須實(shí)現(xiàn)父類(lèi)所有抽象方法,除非這個(gè)子類(lèi)也是抽象類(lèi)
*/
}