Java面向对象_继承——基本概念以及管理化妆品实例分析
一、继承的基本概念:
1.继承是面向对象三大特征之一
2.被继承的类成为父类(超类),继承父类的类成为子类(派生类)
3.继承是指一个对象直接使用另一个对象的属性和方法
4.通过继承可以实现代码重用
举个例子:
1 public class Practice14 { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Dog dog=new Dog("花花"); 9 dog.print(); 10 dog.desc();//直接调用父类的desc方法 11 12 } 13 } 14 //父类 15 class Anmial{ 16 protected String name; 17 18 public Anmial(String name){ 19 System.out.println("animal"); 20 } 21 22 protected void desc(){ 23 System.out.println(name); 24 } 25 } 26 //子类 27 class Dog extends Anmial{ 28 /*public Dog(){ 29 30 System.out.println("无参"); 31 }*/ 32 public Dog(String name){ 33 //显示的调用父类构造方法 34 super(name); 35 this.name =name; 36 System.out.println("dog"); 37 } 38 public void print(){ 39 System.out.println("我的名字:"+name); 40 } 41 }
二、继承的限制
1.java中只能实现单继承,也就是一个类只能有一个父类
2.允许多层继承,即一个子类可以有一个父类,一个父类还可以有其它的父类
3.继承只能继承非私有的属性和方法
4.构造方法不能被继承
子类的实例化过程:子类实例化时会先调用父类的构造方法
如果父类中没有默认的构造方法,在子类的构造方法中必须显示的调用父类的构造方法(super())
三、方法重写(发生在子类和父类之间,子类不想完全继承分类的方法)的特征
1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
2.子类抛出的异常不能超过父类相应方法的异常(子类异常不能大于父类异常)
3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
下面举个实例:
实现一个化妆品商城中的化妆品管理
1.定义一个化妆品类(Cosmetic)
2.定义一个化妆品管理类(CosmeticManager)
(1)实现进货功能
(2)可以输出所有化妆品信息功能
3.使用继承实现一个可按单价排序输出所有化妆品的功能
4.使用继承实现一个只输出进口化妆品的功能
1 import java.util.Arrays; 2 3 public class Practice14 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Cosmetic.print1(); 8 /*CosmeticManager a1=new CosmeticManager(); 9 a1.add(new Cosmetic("韩束",54.88f,"进口")); 10 a1.add(new Cosmetic("百雀羚",84.60f,"国产")); 11 a1.add(new Cosmetic("香奈儿",500.0f,"进口")); 12 a1.add(new Cosmetic("大宝",10.0f,"国产")); 13 a1.list();*/ 14 15 /*SortCosmeticManager a1=new SortCosmeticManager(); 16 a1.add(new Cosmetic("韩束",54.88f,"进口")); 17 a1.add(new Cosmetic("百雀羚",84.60f,"国产")); 18 a1.add(new Cosmetic("香奈儿",500.0f,"进口")); 19 a1.add(new Cosmetic("大宝",10.0f,"国产")); 20 a1.list();*/ 21 22 ImportCosmeticManager a1=new ImportCosmeticManager(); 23 a1.add(new Cosmetic("韩束",54.88f,"进口")); 24 a1.add(new Cosmetic("百雀羚",84.60f,"国产")); 25 a1.add(new Cosmetic("香奈儿",500.0f,"进口")); 26 a1.add(new Cosmetic("大宝",10.0f,"国产")); 27 a1.list(); 28 29 } 30 } 31 //实现只输出进口化妆品的类 32 class ImportCosmeticManager extends CosmeticManager{ 33 public void list(){ 34 for(int i=0;i<super.count;i++){ 35 if("进口".equals(super.cosmetic[i].getType())){ //String类中的方法 36 super.cosmetic[i].print(); 37 } 38 } 39 } 40 } 41 42 //可按单价排序输出所有化妆品的类 43 class SortCosmeticManager extends CosmeticManager{ 44 public void list(){ 45 Cosmetic[] cs=new Cosmetic[super.count]; 46 for(int i=0;i<cs.length;i++){ 47 cs[i]=cosmetic[i]; 48 } 49 Cosmetic temp=null; 50 for(int i=0;i<cs.length-1;i++){ 51 for(int j=0;j<cs.length-1-i;j++){ 52 if(cs[j].getPrice()>cs[j+1].getPrice()){ 53 temp=cs[j]; 54 cs[j]=cs[j+1]; 55 cs[j+1]=temp; 56 } 57 } 58 } 59 for(int i=0;i<cs.length;i++){ 60 cs[i].print(); 61 } 62 } 63 64 } 65 //化妆品管理类 66 class CosmeticManager{ 67 protected Cosmetic[] cosmetic=new Cosmetic[3]; 68 protected int count=0; 69 public void add(Cosmetic c){ 70 if(count>=cosmetic.length){ 71 int newLen=cosmetic.length*3/2+1; 72 cosmetic=Arrays.copyOf(cosmetic, newLen); 73 } 74 cosmetic[count]=c;//顺序不能调换 75 count++; 76 } 77 public void list(){ 78 for(int i=0;i<count;i++){ 79 cosmetic[i].print(); 80 } 81 82 } 83 84 } 85 86 //化妆品类 87 class Cosmetic{ 88 private String name; 89 private float price; 90 private String type; 91 public Cosmetic(){ 92 93 } 94 public Cosmetic(String name,float price,String type){ 95 this.name=name; 96 this.price=price; 97 this.type=type; 98 } 99 public String getType() { 100 return type; 101 } 102 public void setType(String type) { 103 this.type = type; 104 } 105 public String getName() { 106 return name; 107 } 108 public void setName(String name) { 109 this.name = name; 110 } 111 public float getPrice() { 112 return price; 113 } 114 public void setPrice(float price) { 115 this.price = price; 116 } 117 public void print(){ 118 System.out.println(name+"\t"+price+"\t"+type); 119 } 120 public static void print1(){ 121 System.out.println("品牌\t价格\t类型"); 122 } 123 }