面向对象(上)
Java语言基本元素:类和对象
- 类的成员:
- Field 属性 行为
4.3 对象的创建和使用
-
对象的生命周期
-
内存解析
-
栈stack中为局部变量
-
匿名对象
4.4 属性
4.5 方法
- 方法里面不可定义方法
测验
- 开发时一般一个源文件里脂肪进一个类
- 功能类和测试类分开放入两个源文件
- 计算圆面积
- 学生成绩:功能封装在方法中
package com.shc.exe;
public class Student {
private int number;
private String name;
private double score;
public void info() {
System.out.println("学号:"+number+",姓名:"+name+",成绩:"+score);
}
public static void main(String[] args) {
new Student().info();
}
}
package com.shc.exe;
/**
*
* @Description
* @author shc Email:200110732@stu.hit.edu.cn
* @version
* @date 2021年4月28日下午4:42:08
*
*/
public class TestStudent {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student[] stus = new Student[50];
for(int i=0;i<50;i++) {
stus[i]=new Student();
// stus[i].setName()
}
TestStudent ts = new TestStudent();
ts.print(stus);
System.out.println("============================");
ts.sort(stus);
System.out.println("============================");
ts.search(stus);
System.out.println("============================");
}
/**
*
* @Description 对学生成绩进行排序 并输出
* @author shc
* @date 2021年4月28日下午4:41:17
*/
public void sort(Student[] stus) {
System.out.println("sort");
}
/**
*
* @Description 查找目标学生
* @author shc
* @date 2021年4月28日下午4:41:54
*/
public void search(Student[] stus) {
System.out.println("search");
}
/**
*
* @Description 输出学生成绩
* @author shc
* @date 2021年4月28日下午4:42:23
*/
public void print(Student[] stus) {
System.out.println("print");
}
}
print
============================
sort
============================
search
============================
复习
内存复习
-
内存解析出现在运行的时候(stack,heap…
-
- 编译完源程序之后生成一个或多个字节码文件.class
我们使用JVM中类的加载器和解释器对生成的字节码文件进行解释运行。
这意味着,需要把字节码文件对应的类加载到内存中,涉及到内存解析
-
虚拟机(JVM)栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中。
-
堆:我们将new出来的结构(比如:数组,对象)加载在堆空间中。)补充:对象的属性(非static的)加载在堆空间中
-
方法区:类的加载信息,常量池,静态域。
属性 VS 局部变量
-
- 相同点
- 定义变量的格式:数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有对应的作用域
-
- 不同点
-
在类中声明的位置的不同
- 属性:直接定义在类的一对{}内
- 局部变量:声明在方法内、方法形参、代码块内、构造器内
-
权限修饰符的不同
- **属性:可以在声明属性时,指明权限。**使用权限修饰符private,public,缺省,protected
- 局部变量:不可以使用权限修饰符
-
默认初始值情况
- 属性:有默认初始化值
- 局部变量:无默认初始化值
- 意味着我们再调用局部变量之前,一定要显示赋值。特别的,形参在调用时,我们赋值即可
-
在内存中你加载的位置
- 属性:加载到堆空间中(非static)
- 局部变量:加载到栈空间中
-
变量的分类
-
方式一:按照数据类型
- 数据类型
- 基本数据类型
- 数值型
- 整形
- 浮点型
- 字符型(char)
- bool型(boolean)
- 数值型
- 引用数据类型
- 类(class)(字符串在这里)
- 接口(interface)
- 数组([ ])
- 基本数据类型
- 数据类型
-
方式二:按照在类中声明的位置
- 所有变量
- 成员变量
- 实例变量:不用static修饰
- 类变量:用static修饰
- 局部变量
- 形参(方法,构造器中定义的)
- 方法局部变量(方法内定义)
- 代码块局部变量(在代码块中遍历)
- 成员变量
- 所有变量
-
方法
万物皆对象
-
- Java语言范畴中,我们都将功能,结构体等封装到类中,通过类的实例化,来调用具体的功能结构。
- Scanner,String等
- 文件:File
- 网络资源:URL
-
- 如图。涉及到Java语言与Html,后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类,对象
对象数组内存解析
4.6
重载
可变个数的形参
package com.shc.java1;
/**
*
* @Description
* 探究可变形参个数
* 1.jdk5.0之后引入
* 2.具体使用
* 2.1 可变个数的形参格式:数据类型 ... 变量名
* 2.2 当调用可变个数形参的方法时,传入的个数可以是:0,1,2...
* 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
* 2.4 可变个数形参的方法与本类中的方法名相同,形参类型也相同的数组不构成重载。即二者不能共存
* 2.5 可变个数形参必须声明再参数表的末尾
* 2.6 因此可变个数形参在方法中最多只能有一个
* @author shc Email:200110732@stu.hit.edu.cn
* @version
* @date 2021年4月29日下午2:33:57
*
*/
public class MethodArgsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MethodArgsTest mas = new MethodArgsTest();
mas.show();
mas.show("hello");
mas.show("hello","world");
mas.show(new String[]{"hello","world"});
}
public void show(){
System.out.println("null");
}
public void show(String word) {
System.out.println(word);
}
// jdk5.0之后引入
public void show(String ...words) {
// System.out.println(words); [Ljava.lang.String;@7637f22
for(int i=0;i<words.length;i++) {
System.out.print(words[i]+" ");
}
System.out.println("");
}
// 与下面不共存
// public void show(String[] words) {
//
// }
//对应于mas.show(new String[]{"hello","world"});
public void show(int i,String ...strs) {
}
// public void show(String ...strings ,int i) {
// // TODO Auto-generated method stub
// }
}
null
hello
hello world
hello world
4.7 封装
封装性体现:权限
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一工程 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 他们可以用来修饰属性、方法、构造器、内部类。
- 修饰类的话,只能用缺省,public
4.8 类成员之三 构造器
- 自己如果写了非空参数构造器,那么系统默认给的空构造器就没有了
- 父类的构造器不可以被子类继承
4.8 拓展 JavaBean
-
JavaBean是一种Javaui眼写成的可重用组件
-
所谓JavaBean,是指符合如下标准的Java类
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get,set方法
-
系统默认提供的构造器的权限和类的权限是相同的
4.8 拓展 UML
4.9 this的使用
4.10 关键字之package
-
- 为了更好的实现项目中类的管理,提出包的概念
-
- 使用package声明类或接口所属的包,声明在类文件的首行、
-
- 包,属于标识符,遵循标识符的命名规则,见名知意
-
- 每” . “一次,就代表一层文件目录
- 补充:同一包下,不能命名同名的接口或者类,不同的包下可以命名同名的接口,类
4.10 关键字之import
4.9 MVC设计模式
Bank练习
-
class
- Customer 客户
- Account 账户
- Bank 银行
- BankTest 测试类 类里面只有一个main函数 没有方法,属性。
-
Account.java文件 package com.shc.exe1; public class Account { //账户 private double balance; public Account(double init_balance) { this.balance = init_balance; } //查看余额 /** * * @Description 文档注释试用 查看余额 * @author shc * @date 2021年4月29日下午7:30:10 * @return */ public double getBalance() { return balance; } //存钱 public void deposit(double amt) { if(amt>=0) balance+=amt; else System.out.println("你这是取钱不是存钱 操作错误"); } //取钱 public void withDraw(double amt) { if(balance>=amt) balance-=amt; else System.out.println("余额不足"); } }
-
Customer.java文件 package com.shc.exe1; public class Customer { private String firstName; private String lastName; private Account account; public Customer(String firstName,String lastName){ this.firstName =firstName; this.lastName = lastName; } //设定账户 public void setAccount(Account account) { this.account = account; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public Account getAccount() { return this.account; } }
-
Bank.java package com.shc.exe1; public class Bank { private int maxn; private Customer[] customers = new Customer[maxn];//数组类引用变量管理数组 private int numberOfCustomers; public Bank() {} public Bank(int maxn) { this.maxn = maxn; customers = new Customer[maxn]; } //添加客户 public void addCustomer(String firstName,String lastName) { if(numberOfCustomers>=maxn) System.out.println("已满 加入失败"); else{ customers[numberOfCustomers++] = new Customer(firstName, lastName); } return ; } //查询客户 public Customer getCustomers(int idx) { if(idx<0||idx>=numberOfCustomers) { System.out.println("用户不存在"); return null; }else return customers[idx]; } //查询客户个数 public int getNumberOfCustomers() { return numberOfCustomers; } }
-
BankTest.java package com.shc.exe1; public class BankTest { public static void main(String[] args) { Bank bank = new Bank(50); bank.addCustomer("pp", "p"); //连续操作!! 缺点:有空指针的时候不好排查 bank.getCustomers(0).setAccount(new Account(100)); bank.getCustomers(0).getAccount().withDraw(66); //bank---get--->Customer----get---->Account double balance = bank.getCustomers(0).getAccount().getBalance(); //bank---get--->customer----get---->account----get--->balance System.out.println(bank.getCustomers(0).getLastName()+bank.getCustomers(0).getFirstName()+"账户的余额为"+balance); } }
-
ppp账户的余额为34.0
项目二
没写上来