实现接口VS继承类
java的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的机制可保证类的纯洁性,比C++中的多继承机制简洁。但是不可否认,对子类功能的扩展有一定影响。所以:
1、实现接口可以看作是对继承的一种补充。(继承是层级式的,不太灵活。修改某个类就会打破继承的平衡,而接口就没有这样的麻烦,因为它只针对实现接口的类才起作用)
2、实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。
//实例:建立子类并继承了父类且连接多个接口[Demo126.java]
public class Demo126 {
public
static void main(String[] args) {
System.out.println("继承了Monkey父类");
Monkey
mo=new Monkey();
mo.jump();
LittleMonkey
li=new LittleMonkey();
li.swimming();
li.fly();
}
}
//接口Fish
interface Fish{
public
void swimming();
}
//接口Bird
interface Bird{
public
void fly();
}
//建立Monkey类
class Monkey{
int
name;
//猴子可以跳
public
void jump(){
System.out.println("猴子会跳!");
}
}
//建立LittleMonkey子类并继承了Monkey父类并连接了Fish和Bird接口
class LittleMonkey extends Monkey implements
Fish,Bird{
public
void swimming() {
System.out.println("连接了Fish接口!");
}
public
void fly() {
System.out.println("连接了Bird接口!");
}
}
-------------------------------------------------------------------------------
用接口实现多态--案例[Demo127.java]
java中多态是个难以理解的概念,但同时又是一个非常重要的概念。java三大特性之一(继承,封装,多态),我们可以从字面上简单理解:就是一种类型的多种状态,以下通过卖小汽车的例子说明什么是多态。
//用接口实现多态
public class Demo127 {
public
static void main(String []args){
CarShop
aShop=new CarShop();
//卖出一辆宝马
aShop.sellCar(new
BMW());
//卖出一辆奇瑞QQ
aShop.sellCar(new
CheryQQ());
//卖出一辆桑塔纳
aShop.sellCar(new
Santana());
System.out.println("总收入:"+aShop.getMoney());
}
}
//汽车接口
interface Car{
//汽车名称
String
getName();
//获得汽车售价
int
getPrice();
}
//宝马
class BMW implements Car{
public
String getName(){
return
"BMW";
}
public
int getPrice(){
return
300000;
}
}
//奇瑞QQ
class CheryQQ implements Car{
public
String getName(){
return
"CheryQQ";
}
public
int getPrice(){
return
20000;
}
}
//桑塔纳汽车
class Santana implements Car{
public
String getName(){
return
"Santana";
}
public
int getPrice(){
return
80000;
}
}
//汽车出售店
class CarShop{
//售车收入
private
int money=0;
//卖出一部车
public
void sellCar(Car car){
System.out.println("车型:"+car.getName()+"单价:"+car.getPrice
());
//增加卖出车售价的收入
money+=car.getPrice();
}
//售车总收入
public
int getMoney(){
return
money;
}
}
运行结果:
车型:BMW 单价:300000
车型:CheryQQ 单价:20000
总收入:320000
继承是多态得以实现的基础。从字面上理解,多态就是一种类型(都是Car类型)表现出多种状态(宝马汽车的名称是BMW,售价是300000;奇瑞汽车的名称是CheryQQ,售价是2000)。将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定,分前期绑这下和后期绑定两种。下面解释一下它们的定义:
1、前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。
2、后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。
多态就是在后期绑定这种机制上实现的。多态给我们带来的好处是消除了类之间的偶合关系,使程序更容易扩展。比如在上例中,新增加一种类型汽车的销售。只需要让新定义的类实现Car类并实现它的所有方法,而无需对原有代码做任何修改,CarShop类的sellCar(Car
car)方法就可以处理新的车型了。
新增代码如下:
java代码
//桑塔纳汽车
class Santana implements Car{
public
String getName(){
return
"Santana";
}
public
int getPrice(){
return
80000;
}
}
-------------------------------------------------------------------------------
java面向对象编程(3)--final
final概念
final中文意思:最后的,最终的。
final可以修饰变量或者方法。
在某些情况下,程序员可能有以下需求:
1、当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰。
2、当不希望类的某个变量的值被修改,可以用final修饰。如果一个变量是final,则必须赋初值,否则编译出错。
3、当不希望类被继承时,可以用final修饰。
//final方法的使用[Demo128.java]
public class Demo128 {
public
static void main(String[] args) {
Aaa
aaa=new Aaa();
aaa.show();
Bbb
bbb=new Bbb();
bbb.show();
}
}
class Aaa{
int
a=0;//如果a不赋初值,a是0。定义类型后应赋值
//圆周率不让修改
//带有final修饰的变量命名时应有_下划线来区分表示。这是java程序员的标准。
final
float reate_1=3.1415926f;//使用final可以保证,需要强制不被修改的数据一定要用final锁定
//final int b; //使用final定义变量时一定要赋初值否则报错。
//b=1;
final
public void sendMes(){//给成员方法用final来修饰则表示不可以被修改,不可被覆盖。
System.out.println("发送消息");
}
public
void show(){
System.out.println("a="+a);
}
}
final class Bbb extends Aaa{//定义类前加final表示该类不允许被继承
public
Bbb(){
a++;
//reate_1=reate+1;
}
/*public void sendMes(){
System.out.println("发送消息")
}*/
}
final--注意事项
1、final修饰的变量又叫常量,一般用XX_XX_XX来命名。(带下划线)
2、final修饰的变量在定义时,必须赋值,并且以后不能再赋值。
final--什么时候用
1、因为案例的考虑,类的某个方法不允许修改。
2、类不会被其它的类继承。
3、某些变量值是固定不变的,比如圆周率3.1415926
作业评讲:
手掌游戏机一台X元,mp3一台Y元(X,Y,N,M,Z由用户输入)
公司举行抽奖大会,一等奖游戏机N台,二等奖mp3 M台。公司共有Z人。问总价为多少,公司实际平均给每人花费了多少钱。
//计算总费用和平均费用
import java.util.*;//加载包
public class Work06{
public
static int gbGame=0;//静态变量
public
static int gbGameT=0;
public
static int mp3=0;
public
static int mp3T=0;
public
static int people=0;
public
static void main(String []args){
Scanner
myScanner=new Scanner(System.in);//调用键盘输入
System.out.print("请输入手掌游戏机价格:");
gbGame=myScanner.nextInt();
System.out.print("请输入MP3价格:");
mp3=myScanner.nextInt();
System.out.print("请输入手掌游戏机数量:");
gbGameT=myScanner.nextInt();
System.out.print("请输入MP3数量:");
mp3T=myScanner.nextInt();
System.out.print("请输入员工数:");
people=myScanner.nextInt();
showInfo();//调用showInfo方法
}
public
static void showInfo(){ // 建立showInfo方法
int
total=gbGame*gbGameT+mp3*mp3T;//总价
float
average=(float)total/people;//平均价
System.out.printf("总价: %d,平均价是: %f
",total,average);
}
}
**************************************************************
请大家采用面向对象思想设计超级马里奥游戏人物。并能用键盘输入命令,来控制马里奥的位置[Work13.java]
//超级马里奥人物建造及控制台数字操作
import java.util.*;
public class Work13 {
public
static void main(String[] args) {
Scanner
sr=new Scanner(System.in);//接收键盘输入
System.out.println("输入1-25的数字,你可以移动马里奥,输入其它数字退出");
int
i=sr.nextInt();//将键盘输入数字赋值给i
Maria
m=new Maria();//建立调用Maria构造方法
for(int
a=i;a<=25;a--){
if(i<25){
m.move(i);
i=sr.nextInt();
}else{
System.out.println("退出游戏!");
break;
}
}
}
}
class Maria{
int
x,y;
//构造方法,初始化场景;确定地图,Maria的位置
public
Maria(){
System.out.println("I'm
Maria
"+"@");
}
public
void move(int i){
for(int
k=1;k<=25;k++){
if(k==i){
System.out.printf("@");
}else{
System.out.printf(".");
}
}
}
}
int i=4;
switch(i){
default;
System.out.println("default");//执行此语句
case 0:
System.out.println("zero");//执行此语句
break;
case 1:
System.out.println("one");
case 2:
System.out.println("two");
}
int i=1;
switch(i){
default:
System.out.println("default");
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");//执行此语句
case2:
System.out.println("two");//执行此语句
}