最近在看java編程思想,分享一下
之前只知道繼承,原來繼承不怎麼可靠啊
1.組合
public class Bath {
private String s1 = "Happy",s2 = "Happy",s3, s4;
private Soap castille;
private int i;
private float toy;
public Bath() {
System.out.println("Bath");
s3 = "joy";
toy = 3.14f;
castille = new Soap();
}
{ i = 47;}
@Override
public String toString() {
if (s4 == null) {
s4 = "Joy";
}
return "Bath{" +
"s1='" + s1 + '\'' +
", s2='" + s2 + '\'' +
", s3='" + s3 + '\'' +
", s4='" + s4 + '\'' +
", castille=" + castille +
", i=" + i +
", toy=" + toy +
'}';
}
}
class Soap{
private String s;
Soap(){
System.out.println("Soap");
s="Constructed";
}
public String toString(){
return s;
}
}
public static void Main(String[] args){
Bath bath = new Bath();
System.out.println(bath);
}
2.繼承
這裏的代碼並非原書中的這部分代碼,爲代理部分的代碼
public class SpaceShipControls {
void up(int velocity){}
void down(int velocity){}
void left(int velocity){}
void right(int velocity){}
void forward(int velocity){}
void back(int velocity){}
void turbBoost(){}
/***
* 繼承
*/
class SpaceShip extends SpaceShipControls{
private String name;
public SpaceShip(String name){
this.name = name;
}
public String toString(){
return name;
}
}
public static void Main(String[] args){
//繼承之後 SpaceShipControls的所有方法在SpaceShip對象中都暴露了
SpaceShip spaceShip = new SpaceShip("NSEA Protector");
spaceShip.forward(100);
}
}
3.代理
public class SpaceShipControls {
void up(int velocity){}
void down(int velocity){}
void left(int velocity){}
void right(int velocity){}
void forward(int velocity){}
void back(int velocity){}
void turbBoost(){}
/***
* 代理
*/
class SpaceShipDelegation{
private String name;
private SpaceShipControls controls = new SpaceShipControls();
public SpaceShipDelegation(String name){
this.name = name;
}
public void back(int velocity){
controls.back(velocity);
}
public void right(int velocity){
controls.back(velocity);
}
public void left(int velocity){
controls.back(velocity);
}
public void down(int velocity){
controls.back(velocity);
}
public void up(int velocity){
controls.back(velocity);
}
public void forward(int velocity){
controls.forward(velocity);
}
public void turbBoost(){
controls.turbBoost();
}
}
public static void Main(String[] args){
//使用代理,我們擁有更多的控制力
SpaceShipDelegation spaceShipDelegation = new SpaceShipDelegation("NSEA Protector");
spaceShipDelegation.back(100);
}
}
組合:你要用可以,沒問題,拿去,別人要用你得告訴我一聲,你得負責管制着
繼承:人皆可夫,給了你 就相當於給了世界
組合:當前A類含有另一個B類對象
使用A類是也只是能使用該類的屬性和方法,要想用B裏面的東西就在A類中去寫一下,控制權在自己手裏
繼承:獲取父類的所有屬性和方法
使用該類可以調用父類的屬性和方法,繼承之後所有的東西都暴露了,破壞了封裝
4.組合和繼承混合使用
public class PlaceSetting {
static class Plate{
Plate(int i){
System.out.println("Plate constructor");
}
}
static class DinnerPlate extends Plate{
DinnerPlate(int i) {
super(i);
System.out.println("DinnerPlate constructor");
}
}
static class Utensil{
Utensil(int i){
System.out.println("Utensil constructor");
}
}
static class Spoon extends Utensil{
Spoon(int i) {
super(i);
System.out.println("Spoon constructor");
}
}
static class Fork extends Utensil{
Fork(int i) {
super(i);
System.out.println("Fork constructor");
}
}
static class Knife extends Utensil{
Knife(int i) {
super(i);
System.out.println("Knife constructor");
}
}
static class Custom{
Custom(int i){
System.out.println("Custom constructor");
}
}
static class PlaceSettings extends Custom{
private Spoon sp;
private Fork frk;
private Knife kn;
private DinnerPlate pl;
public PlaceSettings(int i) {
super(i+1);
sp = new Spoon(i+2);
frk = new Fork(i+3);
kn = new Knife(i+4);
pl = new DinnerPlate(i+5);
System.out.println("PlaceSettings constructor");
}
}
public static void Main(String[] args){
PlaceSettings placeSettings = new PlaceSettings(9);
}
}
– 代碼與圖片均來自《java編程思想》