oop思想(封装、继承、多态)

封装

分析需求,用封装方式设计类,画出类图

汽车销售人员销售汽车,可售款式有凯越、君威

Ø 每款汽车有款式和编号,款式、编号不能修改(private)

Ø 汽车销售人员有姓名,姓名不能修改(private)

销售人员有两种销售方式:(两种销售方法)

Ø 按车辆销售,每次一辆

Ø 按车型销售(凯越),要同时告诉销售人员购买数量

publicclass Excelle {

      private String type;

      private String id;

      public Excelle(String type,String id){//初始化参数,传递参数

           this.type=type;

           this.id=id;

      }

      public String getType() {

           returntype;

      }

      publicvoid setType(String type) {

           this.type = type;

      }

      public String getId() {

           returnid;

      }

      publicvoid setId(String id) {

           this.id = id;

      }

     

}

 

 

 

publicclass Regal {

      private String type;

      private String id;

      public Regal(String type,String id){

           this.type=type;

           this.id=id;

      }

      public String getType() {

           returntype;

      }

      publicvoid setType(String type) {

           this.type = type;

      }

      public String getId() {

           returnid;

      }

      publicvoid setId(String id) {

           this.id = id;

      }

     

}

 

package com.dt64.java02;

 

publicclass Seller {

      private String name;

 

      public String getName() {

           returnname;

      }

 

      publicvoid setName(String name) {

           this.name = name;

      }

      //销售的方法

      //按类型

      publicvoid sell(Excelle ell){

           System.out.println(this.name+"正在买的车型:"+ell.getType()+"\t编号:"+ell.getId());

      }

      publicvoid sell(Regal rell){

           System.out.println(this.name+"正在买的车型:"+rell.getType());

      }

      //按类型和数量

      publicvoid sell(Excelle ell,int num){

           System.out.println(this.name+"正在买的车型:"+ell.getType()+"\t数量是:"+num);

      }

}

 

 

publicstaticvoid main(String[] args) {

        // TODO Auto-generated method stub

        Excelle ell=new Excelle("标致206","206");

        Regal reg=new Regal("风神A60","A60");

        Seller seller=new Seller();

        Scanner sc=new Scanner(System.in);

        System.out.println("请输入销售员的姓名:");

        seller.setName(sc.next());

        seller.sell(ell);

        seller.sell(ell, 20);

    }

继承:遗传(extends) :抽取共性的属性或方法

抽象:abstract

Constructor call must be the first statement in aconstructor:super();只要涉及到调用构造函数,永远第1句!!!

|-----思考:为什么调用有参的构造方法后,无参的构造方法却不再调用?

|--------调用有参的构造方法,那么无参不会调用(系统) java机制

构造方法作用:初始化对象

|-----重写和重载的区别?

重写:前提条件(有继承关系),发生不同的类中,方法名一致的。子类要重写父类的方法,修饰符不能严于父类的

public class Animal{

         publicvoid say(){//protected

 

         }

}

 

public class Dog extends Animal{

         private void say(){

 

         }

}

public class smallDog extends Dog{

         //say的方法就用不了!

}

 

位置

方法名

参数表

返回值

访问修饰符

方法重写

子类

相同

相同

相同或是其子类

不能比父类更严格

方法重载

同类

相同

不相同

无关

无关

 

Object类是所有类(包括自定义的类)的父类

 

|------Object也可以被继承

publicclass Animal extends Object{

 

      @Override

      publicboolean equals(Object obj) {

           // TODO Auto-generated method stub

           returnsuper.equals(obj);

      }

 

      @Override

      public String toString() {

           // TODO Auto-generated method stub

           returnsuper.toString();

      }

 

}

 

|-----测试类

publicstaticvoid main(String[] args) {

           // TODO Auto-generated method stub

           Animal an=new Animal();

           //Object obj=new Object();

            boolean flag= an.equals(an);//传入的就Animal对象,与this比较

           System.out.println("结果:"+flag);

      }

 

 

|----abstract 抽象类有什么作用?

 

 

Abstract methods do not specify a body:抽象方法不能有方法体的

 

 

The abstract method play in type Animal2 can only bedefined by an abstract class:如果一个类中,有抽象方法的话,那么当前的类必须是抽象类

 

The type Dog must implement the inherited abstractmethod Animal.eat()

继承了抽象类,必须重写抽象类(父类的)中抽象方法

 

 

Cannot instantiate the type Animal:抽象类是不能实例化的

|-----抽象类能否有构造方法? 可以有构造方法,又不能实例化,那么抽象类中的构造方法有什么用?

|------抽象类不能实例化,但是构造方法不是给抽象类实例化用的,给子类用的:当子类在继承的过程中,子类初始化参数过程中,借用抽象类来初始化!

public Dog(String name,int age){

           super(name,age);

      }

 

|-----抽象类

/**

 * @see:抽象类(不具体)

 *1:抽象类能有什么东东?

 *1.1:放私有属性,公共方法

 *1.2:抽象方法

 * */

publicabstractclass Animal {

      private String name;

      privateintage;

      public Animal(){

          

      }

      public Animal(String name,int age){

           this.name=name;

           this.age=age;

      }

      public String getName() {

           returnname;

      }

      publicvoid setName(String name) {

           this.name = name;

      }

      publicint getAge() {

           returnage;

      }

      publicvoid setAge(int age) {

           this.age = age;

      }

      //可以让子类自已去写这么个业务

      publicabstractvoid eat();//抽象方法

}

 

 

 

|-----子类

publicabstractclass Dog extends Animal{

      /*public Dog(String name,int age){

           super(name,age);

      }*/

}

 

|-----孙类

publicvoid eat() {

        Scanner sc=new Scanner(System.in);

        System.out.println("请输入小狗名字:");

        super.setName(sc.next());

        // TODO Auto-generated method stub

        System.out.println(super.getName()+"正在吃骨头!");

    }

同一种操作,由于条件不同,产生的结果也不同

水(物质)---加热--》水蒸汽

水--制冷---》冰

 

多态:同一个引用类型(操作),使用不同的实例(new)而执行不同操作

|------分析:狗类和猫类 统称动物类(abstract)

骨头和鱼统称食物类(abstract)

主人类分配资源 动物类与食物类之间的关系(代码 : 多态)

 

publicstaticvoid main(String[] args) {

        // TODO Auto-generated method stub

        Animal an=new Dog();//父类  父类对象=new 子类(); 向上转型

        an.showName();//重写的关系

        //继续使用an对象(引用类型)

        an=new Cat();//父类对象=new 子类();向上转型

        an.showName();

    }

 

|-----多态的前提条件:具有继承关系的 子类重写父类的方法(abstract) 向上转型(父类带子类---不能是子类带父类  转完型后:父类对象)

|-----多态的本质:多个类之间的关系是什么?  多个类之间关系 框架(用java系统(jdk))

 

|----向下转型

Type mismatch: cannot convert from Food to Bone

 

Cannot cast from Animal to Bone:强制转换(前提条件:只能转换同等类型)

int a=(int)23.4;

关键字instanceof:用于判断对象的具体类型,只能用于引用数据类型判断  通常在向下转型前用于健壮性的判断

public static void method (Animal a){
        a.eat();
    }
    if(a instanceof Cat){
        Cat c=(Cat)a; //向下转型
        c.catchMouse();
    }else if(a instanceof Dog){
        Dog d=(Dog)a;
        d.lookhome();
    }

多态时,成员的特点:

1.成员变量:

编译时:参考引用类型变量所属的类中是否有调用的成员变量,有,编译通过。否则,失败。

运行时:参考引用类型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量

简单说:编译和运行都参考等号的左边

2.成员函数(非静态)

编译时:参考引用类型变量所属的类中是否有调用的函数,有 编译通过  否则 失败。

运行时:参考的是对象所属的类中是否有调用的函数。

简单说:编译看左边,运行看右边。

3.静态函数:

编译时:参考引用类型变量所属的类中是否有调用的静态方法

运行时:参考引用类型变量所属的类中是否有调用的静态方法

简单说:编译和运行都看左边

 

 

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brid_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值