java快速入门

来源:互联网 发布:淘宝联盟支持购物车吗 编辑:程序博客网 时间:2024/06/09 16:18
1.对象的概念:对特定一个存在事物
2.什么是面向对象:以自我为中心对待一个特定事物存在,需要自己描述出来的符合的条件
3.类:是对象的一个属性一个特征,是你描述的条件,条件符合的多个对象可以归纳为一个类,也可以说这个对象含有这个类。
4什么是对象的属性:对象有的各种特征,他具有什么就是对象的属性。
5什么是对象的方法:对象能干什么,对象执行的操作
6类与对象的关系/区别:类是抽象的概念是一个模板,是条件信息。对象是一个具体的东西,是一个客观存在。好比是类是能打电话,能发短信的功能条件。而对象就是一部手机。
类是模子,确定对象将会拥有的特征(属性)和行为(方法)。
类的特点:
类是对象的类型;
具有相同属性和方法的一组对象的集合。
类是抽象的概念,仅仅是模板。对象是一个你能够看得到、摸得到的具体实体


类的重要性:所有的Java程序都以类class为组织单元
定义一个类的步骤:
1,定义类名
2,编写类的属性
3,编写类的方法




创建对象的方法:
类名(声明类型) XX = new 类名(声明类型);
创建对象实际上为三步:
1.new classname();  构造对象,为对象申请内存。
2.classname XX; 声明对象,为对象贴上一个名称标签。
3.赋值=,该名称标签对应的对象即为刚刚所分配了内存的对象
一般属性成为实例变量
***注意:赋值时float变量的赋值结果后面要加f,比如 float f; f=2.1f;


成员变量:在类中定义,用老描述对象将要有什么;在整个类中,或者与此类有关的类的方法中都可以使用;可以自动赋给一个初始值0;
局部变量:在方法中定义,用来在方法中临时保存数据;只能在此方法中使用;不会赋给初始值;局部变量有优先级
  #:若是成员变量与局部变量定义名字有重名,则使用局部变量里的定义。
  构造方法:
1:new +构造方法 创建一个新的对象
2:构造方法名必须和类名相同,不能有任何返回值(void也不行)
3:可以重载多个构造方法,但是参数必须不同,没有参数的构造方法是默认构造方法
4:构造方法属于系统调用(一般在new时调用),一般不允许程序员显示调用。
5:普通方法名一般不要和构造函数名一样,但是也可以写和构造函数名一样的普通方法,但是需要有返回值(和构造函数进行区分)
5、当没有指定构造方法时,系统会自动添加无参的构造方法。
6、当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法。
7、构造方法的重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。
8、构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值。


public 构造函数名(){
}
①static修饰的静态成员属于整个类,所有对象都能用


②静态成员可以用类名直接访问(专属)、或对象名进行访问


③ static 可以修饰变量、方法和代码块。


④普通变量、方法必须先new对象,再靠对象调用,static修饰的静态变量方法全类公用,可以不用new对象直接靠类名调用。


⑤因为static修饰的变量公用,所以一个类的所有方法都可以直接用static变量,但不是static变量的就不能直接用,
必须按普通的方法即new出对象使用。
1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量
3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
初始化块和构造方法可以用来给成员变量赋值。
静态变量在输出时可直接使用变量名进行输出。
构造方法的名字和类名一样。
顺序:静态初始化块->初始化块->构造方法


面向对象三个特性:封装、继承、多态。
封装: private  getter得到属性值(return)/setter赋值(void)
封装的实现


封装:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处:只能通过规定的方法访问数据;隐藏类的实例细节,方便修改和实现。
实现步骤:修改属性的可见性,设为private;创建getter/setter方法,用于属性的读写;在getter/setter方法中加入属性的控制语句,对属性的合法性进行判断。
一.包的作用:管理Java文件,解决同名文件冲突
二.定义包:package 包名
//必须放在Java源程序的第一行
包名间可以使用“.”隔开


三.系统中的包:
java.(功能).(类)
java.lang.(类) 包含Java语言基础的类
java.util.(类) 包含Java语言中各种工具类


java.io.(类)  包含输入,输出相关功能的类
四.包的使用:
1.可以通过使用import关键字,在某个文件使用其他文件中的类。
2.Java中,包的命名规范是全小写字母拼写
3.使用的时候不但可以加载某个包下的所有文件 eg:com.imooc.*
也可以加载某个具体子包下的所有文件
包的使用前必须了解:
1.包的定义——为了区分同名的类以及对相关类的打包的集合体;
2.包的创建——package aa.bb.cc.D;(注意,包的命名规范是全小写的)必须放在类程序的第一行
3.包的书写:aa.bb.cc.D 点号代表引入下级包(子包)   aa.bb.cc.*是引用aa.bb.cc包下的所有文件
调用其他的包时用import将其导入就好了默认情况下会把同一个包内的类导进来


属性用private修饰,方法用public修饰。
访问修饰符:
private:只有本类可以使用
默认; 本类和同包可以使用
protected: 本类、子类、同包可以使用
public:都可以使用


this关键字:
1、this关键字代表当前对象
   this.属性 操作当前对象的属性
   this.方法 调用当前对象的方法
2、封装对象的属性的时候,经常会使用this关键字。
   (可通过菜单栏的“源”,自动生成getter、setter方法。属性名经常会与参数名相同,为了区分属性和参数的概念,
   在属性前加this关键字,此时代表将一个参数的值赋给了当前对象的属性)
   


内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!!
答:内部类的主要作用如下:
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便


内部类可分为以下几种:
成员内部类
静态内部类
方法内部类
匿名内部类
附代码:
//外部类HelloWorld
public class HelloWorld {
    
    // 内部类Inner,类Inner在类HelloWorld的内部
    public class Inner {
        
// 内部类的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
    
public static void main(String[] args) {
        
        // 创建外部类对象
HelloWorld hello = new HelloWorld();
        // 创建内部类对象
Inner i =hello. new Inner();
        // 调用内部类对象的方法
   i.show();
}

}

成员内部类的使用方法:
1、 Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
2、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a
3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
4、 编译上面的程序后,会发现产生了两个 .class 文件
其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class
/外部类HelloWorld
public class HelloWorld{
    
    //外部类的私有属性name
    private String name = "iloveyou";
    
    //外部类的成员属性
    int age = 20;
    
//成员内部类Inner
public class Inner {
String name = "爱慕课";
        //内部类中的方法
public void show() { 
System.out.println("外部类中的name:" +                  );
System.out.println("内部类中的name:" +                  );
System.out.println("外部类中的age:" + age);
}
}
    
//测试成员内部类
public static void main(String[] args) {
        
        //创建外部类的对象
HelloWorld o = new HelloWorld (); 
        
        //创建内部类的对象
Inner inn =              ;
        
        //调用内部类对象的show方法
inn.show();
}
}
静态内部类是 static 修饰的内部类,这种内部类的特点是:
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 
2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
//外部类
public class HelloWorld {
    
    // 外部类中的静态变量score
    private static int score = 84;
    
    // 创建静态内部类
public  static   class SInner {
        // 内部类中的变量score
        int score = 91;
        
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score   );
System.out.println("访问内部类中的score:" + score);
}
}


// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
        SInner si=new SInner();
        
        // 调用show方法
si.show();
}
}


方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
//外部类
public class HelloWorld {
    
    private String name = "我爱你";
    
    // 外部类中的show方法
    public void show() { 
// 定义方法内部类
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
        
// 创建方法内部类的对象
        MInner mi=new MInner();
        
        // 调用内部类的方法
   int newScore=mi.getScore();
        
System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
}
    
// 测试方法内部类
public static void main(String[] args) {
        
// 创建外部类的对象
    HelloWorld mo=new HelloWorld();    
        
        // 调用外部类的方法
mo.show();
}
}




继承的概念:继承是类与类的一种关系,是一种“is a”的关系。
注:Java中的继承是单继承
继承的好处:子类拥有父类的所有属性和方法(private修饰的无效哦!)。代码的复用。
class 子类 extends 父类
1.什么是方法的重写:如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
2.语法规则:a.返回值类型 b.方法名 c.参数类型及个数 都要与父类继承的方法相同,才叫方法的重写。


继承的初始化顺序:
1.初始化父类再初始化子类。
2.先执行初始化对象中的属性,再执行构造方法中的初始化。


final关键字:
修饰类,该类不允许被继承
修饰方法,该方法不允许被覆盖或重写
修饰属性,系统不会对其进行隐式初始化(类的初始化属性必须有值),所以必须赋值或者在构造方法中赋值
修饰变量,该变量只允许被赋值一次,该变量成为常量
super关键字:在对象的内部使用,可以代表父类对象。
1.访问父类的属性 super.age
2.访问父类的方法 super.eat()
super的应用:
子类的构造的过程当中必须调用其父类的构造方法。
如果子类构造方法中既没有显示调用父类的构造方法,而父类有没有无参的构造方法,则编译错误。
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object类,且Object类中的方法适合所有子类
1.toString()方法
在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)
如果我们在代码里面直接输出一个对象,会输出这个对象在内存中的地址,我们把它称为哈希码,哈希码是通过哈希算法生成的一个字符串用来唯一区分对象的


可以通过重写toString()方法表示出对象的属性


(我们经常在输出对象的时候希望得到子类的属性值,那么我们就要重写从父类继承来的toString()方法,eclipse中右键菜单栏-源码source-生成generate toString(),他就会根据我们对象的属性帮我们生成一个toString()方法来输出属性值)


    public int age=10;
    //com.imooc.Dog@459189e1      


    public int age=10;
@Override
public String toString() {
return "Dog [age=" + age + "]";
}


        // Dog [age=10]
equals()----返回值是布尔类型
比较的是对象的引用是否指向同一块内存地址-------对象实例化时,即给对象分配内存空间
使用方法如:dog.equals(dog2);
如果是两个对象,但想判断两个对象的属性是否相同,则重写equals()方法
source里面调用equals
1.地址是否相同----if (this == obj)
2.对象是否为空----if (obj == null)
3.getClass()可以得到类对象,判断类型是否一样-----if (getClass() != obj.getClass())
new出来的是类的对象,关注的是类的属性的具体的数据;
类对象是类的代码信息,关注的是类有什么属性和方法
4.属性值是否一样----if (age != other.age)
多态:
1.引用多态
   父类的引用可以指向本类的对象
   父类的引用可以指向子类的对象
父类:Animal 
子类:Dog
Animal ob=new Animal();
Animal ob2=new Dog();  (√) 这行就代表多态
Dog dog=new Animal();(×)但是子类的引用不可指向父类对象
2.方法多态
创建父类本类对象时,调用父类本类的方法
创建父类指向的是子类对象时,调用的方法为子类的重写方法或者继承的方法
父类对象指向子类时:调用的方法为父类的方法,如果子类重写了父类的方法则调用的是子类重写的方法。
如果子类有自己独有的方法,此时父类指向子类的对象不能调用独有的方法。只有子类指向子类的对象才能调用此方法。


引用类型转换:
1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换。
如:Dog dog=new Dog();Animal animal=dog;//正确,自动类型提升,向上类型转换
2.向下类型转换(强制类型转换),是大类型到小类型的转换(存在风险,溢出)
如:Dog dog1=(Dog)animal;//向下类型转换
3.instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。如:
Dog dog=new Dog();
Animal animal=dog;//父类引用指向子类对象,自动类型提升,向上类型转换
Dog dog2=animal;//存在风险,不允许执行
Dog dog2=(Dog)animal;//向下类型转换,强制类型转换
Cat cat=(Cat)animal;//编译时不会出错(按Cat类型进行编译),但运行时会报错,因为它开辟的是Dog类型的空间,
而(无法将引用类型进行转换)无法将dog对象转换成Cat类型,并且此方法对程序的安全性有影响。
这个语法强制把animal转换成cat类型,按cat类型进行编译的。但真正开辟的是dog类型,程序运行时发现两个类型不匹配,报错。
此时应该利用instanceof和if语句结合使用,进行验证,以保证程序的安全性,如:
//判断animal类中是否包含Cat类型的元素,若包含则进行转换,instanceof返回值为布尔类型
if(animal instanceof Cat){
    Cat cat=(Cat)animal;
}else{
    System.out.println("无法进行类型转换");
}
 1、语法定义:
 抽象类钱使用abstract关键字修饰,则该类为抽象类。
 2、应用场景:
a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法(抽象类就是约束子类必须有哪些方法,不关注子类如何去实现)
b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
 3、作用:
 限制规定子类必须实现某些方法,但不关注实现细节。
 4、使用规则:
a、abstract定义抽象类
b、abstract定义抽象方法,只有声明,不需要实现
c、包含抽象方法的类是抽象类
d、抽象类中可以包含普通的方法,也可以没有抽象方法
e、抽象类不能直接创建,可以定义引用变量,指向子类对象


创建父类时设置为抽象类(约束子类),继承的子类里会自动实现父类要求的方法


public abstract class Telphone{
   public abstract void call(); //抽象方法没有方法体以分号结束
   public abstract void message();
}


main:
Telphone tel1=new Cellphone();
tel1.call();
tel1.message();
Telphone tel2=new SmartPhone();
tel2.call();
tel2.message();


1.接口概念:
接口可以理解为一种特殊的类,有全局常量和公共抽象方法组成。(接口=全局常量+公共的抽象方法;)
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。


2.接口定义:
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字,语法:
[修饰符] abtract(此处的abstract,如果我们不写,系统会自动加上) interface abstract 接口名 [extends 父接口1,父接口2……]
//中括号中为可选项(可继承可不继承),接口可多继承,
{
零个到多个常量定义……
零个到多个抽象方法的定义
}


3.接口就是用来被继承、被实现的,修饰符一般建议用public,不能使用private和protected修饰接口。


4.接口中的属性是常量(public static final修饰),即使定义时不添加public static final修饰符,系统会自动加上


5.接口中的方法只能是抽象方法(public abstract修饰),总是使用,即使定义时不添加public abstract修饰符,系统会自动加上


6.使用接口:一个类可以实现一个或多个接口,实现接口使用implements关键字。java中一个类只能继承一个父类,不够灵活,可以通过实现多个接口作补充。


7.继承父类实现接口的语法:
[修饰符] class 类名 extends 父类 implements 接口1,接口2……
{
类体部分 //如果继承的是抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法
}
如果要继承父类,继承父类必须在实现接口之前
8.使用接口时可以利用接口的引用指向实现了接口的对象,调用其方法,如 :
IPlayGame ip1=new SmartPhone();ip1.playGmae();
IPlayGame ip2=new Psp();ip2.playGame();


9.接口的使用还经常与匿名内部类配合(匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称)
语法格式:
Interface i=new Interface(){
    public void method(){
        System.out.print("匿名内部类实现接口的方式");
    }
};


还可以直接创建并调用方法,如:
public IPlay ip3=new IPlay(){
    @Override
    public void playGame(){
        System.out.println("使用匿名内部类的方式实现接口");
    }
};ip3.playGame();
或者
new IPlay(){
    public void playGame(){
        System.out.println("使用匿名内部类的方式实现接口");
    }
}.playGame();
//即通过创建接口的对象,直接写出实现的方法,再调用此方法


1.UML概念
1、Unified Modeling Language,统一建模语言/标准建模语言,是支持模型化和软件系统开发的图形化语言;是一个支持模型化和软件系统开发的图形化语言;为软件开发的所有阶段提供模型化的可视化支持


2.常用UML图
用例图(The Use Case Diagram):以可视化表达系统如何满足业务规则和特定的用户需求
序列图(The Sequence Diagram):用于按照交互发生的一系列顺序,显示对象之间的这些交互
类图/类别图(The Class Diagram):UML类图、业务逻辑和所有支持结构一同被用于定义全部的代码结构.描述类之间的关系,类中的属性和方法


3.UML建模工具
Visio、Rational Rose、PowerDesign 三种建模工具应用最广
1. Rational Rose,它是 IBM 的
http://www.uml.org.cn/RequrementProject/200604043.htm
2. Microsoft 的 Microsoft Office Visio
http://www.microsoft.com/china/office/xp/visio/default.asp
3.PowerDesigner
http://www.uml.org.cn/UMLTools/powerDesigner/powerDesignerToolIntroduction.htm
补充知识:


抽象类和普通类的主要有三点区别:   1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),
缺省情况下默认为public。   2)抽象类不能用来创建对象;   3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。
如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。   在其他方面,抽象类和普通的类并没有区别。
栈(Stack)作为一个先进后出(FILO) 的线性结构,只支持在栈顶的插入和弹出。 
队列(Queue)作为一个先进先出(FIFO) 的线性结构,支持在队首获取元素,在对尾插入元素。 
常见数据结构
A:栈 先进后出
B:队列先进先出
C:数组 查询快,增删慢
D:链表 查询慢,增删快
List的子类特点(面试题)
ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。


1.语法层面上的区别
  1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
  1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部
(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将
飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。
然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。
从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,
而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,
如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,
一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;
而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。


继承在为多态的实现做了准备。子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。Java实现多态有三个必要条件:继承、重写、向上转型。    继承:在多态中必须存在有继承关系的子类和父类。    重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。    向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。    只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。    对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
继承关系才有多态



一、项目背景介绍根据所学知识,编写一个控制台版的“答答租车系统”功能:1.展示所有可租车辆2.选择车型、租车量3、展示租车清单,包括:总金额、总载货量及其车型、总载人量及其车型二、项目分析1.数据模型分析a.通过对现实世界与事物主要特征的分析、抽象,为信息系统的实施提供数据存取的数据结构以及相应的约束。b.数据结构组成:操作(方法)、属性车分为:载客(载客量):小汽车(5人以下)、客车(10人以上)载货(载货量):轻型5T、重型5T-20T既载货又载人:皮卡2.业务模型分析a.在设计应用程序之前,应该明确该应用程序必须执行那些任务。分析业务需求是应用程序开发中最重要的步骤之一。确认业务需求的目的在于创建一个能同时满足零售商和消费折需要解决方案。b.答答租车系统中,只需要考虑消费业务需求即可。业务流程:选车-》租车天数-》统计金额-》载客、货量思路:选车-》多辆汽车(创建车对象)3.显示和流程分析a.显示:用户可以看到的信息提示界面。b.流程:显示信息的执行过程、步骤。c.答答租车系统中,要以命令行的方式显示提示信息和输出结果信息,要考虑其样式,用户输入的数据不同,信息该如何显示、如何处理并显示出结果,这部分知识囊括了显示与流程的内容。


 附带代码:

//父 类
 public abstract class Car 
{ private int price;//车的租金 
private String name;//车的名称 
private int passengerLoad; //载客人数 
private double goodsLoad;//载货数量
 public int getPrice() { return price; } 
 public void setPrice(int rent) { this.price = rent; } 
 public String getName() { return name; } 
 public void setName(String name) { this.name = name; } 
 public int getPassengerLoad() { return passengerLoad; } 
 public void setPassengerLoad(int passengerLoad) { this.passengerLoad = passengerLoad; } 
 public double getGoodsLoad() { return goodsLoad; } 
 public void setGoodsLoad(double goodsLoad) { this.goodsLoad = goodsLoad; } 
 }


//只载人 
public class KeCar extends Car { 
public KeCar(String name ,int price,int passengerLoad){ 
this.setPrice(price); this.setName(name); 
this.setPassengerLoad(passengerLoad); } 
public String toString() { 
return this.getName()+"----"+this.getPrice()+"元/天---- 载客"+this.getPassengerLoad()+"人"; } }




//只载客
 public class Truck extends Car {
public Truck( String name,int price ,int goodsLoad){ 
this.setPrice(price); this.setName(name); this.setGoodsLoad(goodsLoad); } 
public String toString() { return this.getName()+"----"+this.getPrice()+"元/天---- 载货"+this.getGoodsLoad()+"吨"; } }


//既载客又载人的 BothCarry类 
public class BothCarry extends Car { 
public BothCarry(String name,int price,int passengerLoad,double goodsLoad)
{ this.setName(name); this.setPrice(price); this.setPassengerLoad(passengerLoad); this.setGoodsLoad(goodsLoad); } 
public String toString() { 
return this.getName()+"----"+this.getPrice()+"元/天---- 载客"+this.getPassengerLoad()+"人/载货"+this.getGoodsLoad()+"吨"; } }


import java.util.Arrays; import java.util.Scanner; 
public class Test { public static void main(String[] args) { 
Scanner sc=new Scanner(System.in);
 System.out.println("***************欢迎使用打打租车系统***************"); 
 System.out.println(); System.out.println("*******租车请按 (1) 退出请按(0)*******"); 
 
 int num=sc.nextInt();
 Car[] cars={new KeCar("奥迪A4",300,4), new KeCar("雪佛兰5",250,4), new KeCar("宝骏巴士",800,45), new Truck("东风Rl",1000,10), new Truck("依维柯S",1500,25), new BothCarry("皮卡雪Z",600,2,5)}; if(num!=1){ System.out.println("****欢迎下次光临****"); 
 System.exit(0); }else{ for(int i=1;i<=cars.length;i++){ System.out.println("序号"+i+"——————————-"+cars[i-1]); } } 
 System.out.println("请输入你要预定的数量"); int a=sc.nextInt();
 int priceSum=0;//价格总量 double goodsLoadSum=0;//载货总量 
 int passengerLoadSum=0;//载客总量 
 for(int i=1;i<=a;i++)
 { System.out.println("请输入第"+i+"辆要预定车辆的序号"); 
 int on=sc.nextInt(); 
 passengerLoadSum=passengerLoadSum+cars[i-1].getPassengerLoad(); goodsLoadSum=goodsLoadSum+cars[i-1].getGoodsLoad();
 priceSum=priceSum+cars[i-1].getPrice(); } 
 System.out.println("一共需要"+priceSum+"元/天"+" "+"共载货量:"+goodsLoadSum+"吨 "+"共载客量:"+ passengerLoadSum+"人"); System.out.println("************************谢谢惠顾!"); } }


欢迎指点、交流。

原创粉丝点击