• ***JAVA入门到精通-第14讲-final-作业评讲


     
     小猴子继承了大猴子的一些特点;
     但,如果小猴子又想有小鸟飞的能力;鱼游泳的能力;
     因为,JAVA是单继承的;
     通过接口,实现鸟和鱼接口的一些方法;
     
     小猴子继承猴子的特点并且实现鱼的游泳;

     这样,猴子会游泳,会飞;
     通过接口,弥补单继承的一些缺陷;

     
     运行的一瞬间才知道是什么类型-后期绑定;
    Car car  后期绑定,编译的时候不知道是什么类型;
     
     前期绑定:在编译的时候就能确定的类型;
     后期绑定:在编译的时候不知道是什么类型,在运行的时候才能确定是什么类型;
     
     用final去修饰不希望被别人修改的变量或者方法;
     
     
     
     a最好赋初值;如果不赋初值,很可能指向空地址;
     程序不够结实;JAVA程序跑的平台可能多种多样的;

     
     保证成员变量、成员方法不被子类修改;
     如果一个变量 是final的,则必须赋初值,否则,无法编译;
     税率必须要用final.
      
     final float  rate_aaa_bbb=3.1415926f;
     
     final 类不能够被继承;
     final修饰类,表示该类不能被继承; 
     
      
      

    实现接口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父类并连接了FishBird接口

    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不赋初值,a0定义类型后应赋值

        //圆周率不让修改

        //带有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--注意事项

    1final修饰的变量又叫常量,一般用XX_XX_XX来命名。(带下划线)

    2final修饰的变量在定义时,必须赋值,并且以后不能再赋值。

     

    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");

    }

     
     

    1. int i=1;
    2. switch(i){
    3. default:
    4. System.out.println("default");
    5. case 0:
    6. System.out.println("zero");
    7. break;
    8. case 1:
    9. System.out.println("one");//执行此语句
    10. case2:
    11. System.out.println("two");//执行此语句
    12. }

     

     




  • 相关阅读:
    java集合之HashMap源码解析
    springboot下多线程开发注意事项
    java集合之List源码解析
    关于Layer web弹层组件的加载(loading)层位置居中问题
    微信公众号支付提示mch_id参数格式错误
    ASP.NET MVC 中使用Highcharts+Ajax+Json生成动态曲线图,柱状图,饼图
    C#常见金额优选类型及其三种常用的取整方式
    Mui Webview下来刷新上拉加载实现
    Select下拉框使用ajax异步绑定数据
    .NET、C#基础知识
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10044210.html
Copyright © 2020-2023  润新知