Java开发笔记(二)
java笔记目录
- 一、类和对象
- 1.1 static 使用之静态变量
- 1.2 static 使用之静态方法
- 1.3 static 使用之静态初始化块
- 二、封装
- 2.1 java 中的访问修饰符
- 2.2 java中的 this关键字
- 2.3 Java 中的内部类
- 三、继承
- 3.1 final 关键字使用。
- 3.2 super 关键字使用
- 3.3 Object 类
- 四、多态
- 4.1 对象的多种形态
- 4.2 接口
- 4.3 UML(统一建模语言或标准建模语言)
一、类和对象
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();}}
Java开发笔记(二)相关推荐
- (硅谷课堂项目)Java开发笔记4:前端基础知识(二)
文章目录 (硅谷课堂项目)Java开发笔记4:前端基础知识(二) 一.NPM 1.NPM简介 1.1.什么是NPM 1.2.NPM工具的安装位置 2.使用npm管理项目 2.1.创建文件夹npm 2. ...
- Java开发笔记(二十三)数组工具Arrays
数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...
- Java开发笔记(五十)几种开放性修饰符
前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...
- [安卓开发笔记二]android Studio通过jni调用C++代码
[安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云 邮箱: happylifemxy@163.com 期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...
- 微信公众号Java开发-笔记02【开发接入准备、开发接入】
学习视频网址:哔哩哔哩网站 微信公众号开发-Java版 [P01-P02]微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] [P03-P04]微信公众号Java开发-笔记02[开发接入 ...
- 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】
学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...
- Java学习笔记二:数据类型
Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...
- Java开发笔记(三十三)字符包装类型
正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...
- Java开发笔记(一百零三)线程间的通信方式
前面介绍了多线程并发之时的资源抢占情况,以及利用同步.加锁.信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果.日常生活中,经常存在两个前后关联的事务,像 ...
最新文章
- python课程是学什么的-学习Python课程有什么好的学习方法吗?老男孩IT教育
- [简单题]换一个思维,代码简洁度就完全变了(Python实现)
- python3(七)os模块
- 通过JAX-WS Provider在Web服务中利用MOXy
- 如何保证redis高可用?薪资翻倍
- JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)
- 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
- [Xpand] Error	1	Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default
- 硬盘变成raw格式的问题的解决方法
- android 崩溃捕获_Android从相机和图库捕获图像
- LNMP架构 源码安装nginx+mysql+php+memcache+论坛
- wxpython安装不上怎么回事_安装Python - wxPython失败的解决方法
- 蓝牙耳机出口欧盟要做什么CE的哪些指令?
- 开源电子海图和webGIS
- Matlab-数值计算方法作业
- VS2019项目自动包含bin或obj文件夹的问题
- 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)
- 二.微信小程序代码的构成
- 今日学习在线编程题:弓形半径
- Mac老是自动关掉屏幕怎么办?