Java开发笔记(二)

一、类和对象

1.1 static 使用之静态变量

大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!

Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~

使用 static 可以修饰变量、方法和代码块。
在这里插入图片描述
在这里插入图片描述

1.2 static 使用之静态方法

与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如:
在这里插入图片描述
在这里插入图片描述
需要注意:

1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。

2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,

3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。

1.3 static 使用之静态初始化块

Java 中可以通过初始化块进行数据赋值。如:
在这里插入图片描述

在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
在这里插入图片描述
在这里插入图片描述
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。

二、封装

将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的某些方法来实现对隐藏信息的操作和访问。

2.1 java 中的访问修饰符

在这里插入图片描述

2.2 java中的 this关键字

a、this关键字代表当前对象。
this.属性 操作当前对象的属性。
this.方法 调用当前对象的方法。
b、封装对象的属性的时候,经常会使用this关键字。

2.3 Java 中的内部类

问:什么是内部类呢?

答:内部类( 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();
	}
}

java中的成员内部类
在这里插入图片描述
在这里插入图片描述
从上面的代码中我们可以看到,成员内部类的使用方法:

1、 Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等

2、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );

另外

1、 外部类是不能直接使用内部类的成员和方法滴。
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。

静态内部类

静态内部类是 static 修饰的内部类,这种内部类的特点是:

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问

2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
在这里插入图片描述
在这里插入图片描述
方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
在这里插入图片描述
一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
在这里插入图片描述
在这里插入图片描述

三、继承

语法:class 子类 extends 父类
方法重写
返回值类型、方法名、参数类型以及个数都要与父类继承方法相同,才叫方法重写。
初始化(先父类----->子类)
构造方法初始化后执行

3.1 final 关键字使用。

在这里插入图片描述

3.2 super 关键字使用

在对象的内部使用,也可以代表父类对象。
1.访问父类的属性
super.age
2.访问父类的方法
super.eat()

3.3 Object 类

Object 类是所有类的父类。所有类默认继承Object类。
Object类中的方法,适合所有子类

  1. toString() 方法 返回对象的哈希code码(对象地址字符串)
  2. equals() 方法 比较的是对象的引用是否指向同一块内存地址。

四、多态

4.1 对象的多种形态

1.引用多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
2.方法多态
创建本类对象时,调用的方法为本类方法。
创建子类对象时,调用的方法为子类重写的方法或者继承的方法。
在这里插入图片描述

4.2 接口

一种特殊的类,由全局常量和公共的抽象方法所组成。
在这里插入图片描述
接口使用中经常与匿名内部类配合使用。
匿名内部类就是没有名字的内部类,
多用于关注实现而不关注实现类的名称。
在这里插入图片描述
在这里插入图片描述

4.3 UML(统一建模语言或标准建模语言)

是一个支持模型化和软件系统开发的图形化语言。
为软件开发的所有阶段提供模型化和可视化支持。
用例图
用例图能够可视化的方式,表达系统如何满足所收集的业务规则,以及特定的用户需求等信息在这里插入图片描述
序列图
序列图用于按照交互发生的一系类顺序,显示对象之间的这些交互。
在这里插入图片描述
类图
UML 类图、业务逻辑和所有支持结构异同被用于定义全部的代码结构。
在这里插入图片描述
在这里插入图片描述

package com.imooc.practice;

import java.util.*;

//所有类型的车可以提取出车这个父类,包含车名、载人数、载货量、租金4个属性

public abstract class Car {

	//使用封装概念,只能通过指定的方法读写属性

	private int rent; //日租金;

	private int personnum; //载人数;

	private int cargo; //载货量;

	private  String name; //车名;

	//使用set、get方法读写属性

	public int getRent() {

		return rent;

	}

	public void setRent(int rent) { 

		this.rent = rent; 

	}

	public int getPersonnum() { 

		return personnum;

	}

	public void setPersonnum(int person) {

		this.personnum = person;

	}

	public int getCargo() {

		return cargo;

	}

	public void setCargo(int cargo) {

		this.cargo = cargo;

	}

	public String getName() {

		return name;

	}

	public void setName(String name) {

		this.name = name;

	}

}

//创建乘用车子类

public class PassengerCar extends Car {

	public PassengerCar(String name, int personnum, int cargo, int rent) {

		this.setName(name);

		this.setPersonnum(personnum);

		this.setRent(rent);

		this.setCargo(cargo);

	}

	

	//重写toString方法返回乘用车车辆信息

	public String toString() {

		return this.getName()+"\t\t"+this.getPersonnum()+"\t\t"+this.getCargo()+"\t\t"+this.getRent();

	}

}

//创建货运车子类

public class Truck extends Car {

	public Truck (String name, int personnum, int cargo, int rent) {

		this.setName(name);

		this.setPersonnum(personnum);

		this.setCargo(cargo);

		this.setRent(rent);

	}

	

	//重写toString方法返回货运车信息

	public String toString() {

		return this.getName()+"\t\t"+this.getPersonnum()+"\t\t"+this.getCargo()+"\t\t"+this.getRent();

	}

}

//创建皮卡子类

public class Pickup extends Car {

	public Pickup(String name, int personnum, int cargo, int rent) {

		this.setName(name);

		this.setPersonnum(personnum);

		this.setCargo(cargo);

		this.setRent(rent);

	}

	

	//重写toString方法返回皮卡车信息

	public String toString() {

		return this.getName()+"\t\t"+this.getPersonnum()+"\t\t"+this.getCargo()+"\t\t"+this.getRent();

	}

}

public class DadaTestDrive {



	public static void main(String[] args) {

		// TODO Auto-generated method stub

		//对各类车实例化并保存到数组

		Car[] cars = {

			new PassengerCar("奥迪A4",4,0,500), 

			new PassengerCar("马自达6",4,0,400), 

			new Pickup("皮卡雪6",4,2,450), 

			new PassengerCar("金龙",20,0,800), 

			new Truck("松花江",0,4,400), 

			new Truck("依维柯",0,20,1000)

		};

		//进入提示显示步骤

		System.out.println("欢迎使用达达租出系统!");

		System.out.println("***租车请按1,不租车请按2***");

		//读取用户键入的信息并判断

		Scanner input = new Scanner(System.in);

		int key = input.nextInt();

		if(key !=1) {

		System.out.println("期待您下次光临!");

		input.close();

		return;

		}else if(key == 1) {

			System.out.println("您可租的车型及价目表如下:");

			System.out.println("序号"+"\t车名"+"\t\t载人数(人)"+"\t载货量(吨)"+"\t租金(元/天)");

			//输出实例化的各类车

			for(int i=0; i<cars.length; i++) {

				System.out.println((i+1)+"\t"+cars[i]);

			}

		}

		//输入想租的车的数量

		System.out.println("请输入要租车的数量:");

		int carcount = input.nextInt();

		//更新车辆数组

		Car[] newCars = new Car[carcount];

		int totalRent = 0;

		int totalPerson = 0;

		int cargo = 0;

	

		for(int i=0; i<carcount; i++) {

			System.out.println("请输入第"+(i+1)+"辆车的序号");

			int serialNum = input.nextInt();

			newCars[i] = cars[serialNum-1];

		}

	

		System.out.println("请输入您想租车的天数:");

		int days = input.nextInt();

	

		//计算租金

		for(int i=0; i<carcount; i++) {

			totalRent += newCars[i].getRent()*days;

		}

		//输出账单

		System.out.println("您本次的租车账单:");

		System.out.print("\n");

		//列出所选乘用车并计算总的载人数

		System.out.println("已选载人车:");

		for(int i=0; i<carcount; i++) {

			if(newCars[i].getPersonnum() != 0) {

				System.out.println(newCars[i].getName());

				totalPerson += newCars[i].getPersonnum();

			}

		}

		System.out.print("\n");

		System.out.println("已选载货车:");

		//列出所选货运车并计算总的载货量

		for(int i=0; i<carcount;i++) {

			if(newCars[i].getCargo() != 0) {

				System.out.println(newCars[i].getName());

				cargo += newCars[i].getCargo();

			}

		}

		System.out.print("\n");

		System.out.println("共可载客"+totalPerson+"人");

		System.out.println("共可载货"+cargo+"吨");

		System.out.println("请付租金"+totalRent+"元");

		System.out.print("\n");

		System.out.print("谢谢惠顾,欢迎下次光临");

		input.close();

	}

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值