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 )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!!
答:内部类的主要作用如下:
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
-
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
-
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
问:内部类有几种呢?
答:内部类可分为以下几种:
成员内部类
静态内部类
方法内部类
匿名内部类
//外部类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类中的方法,适合所有子类
- toString() 方法 返回对象的哈希code码(对象地址字符串)
- 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();
}
}