目录
1. 笔记
1.1 类与对象
1. 面向对象 这是一种思想,在学习过程中,知识点很杂、也很难! 1.1 面向过程与面向对象 开饭店: 调研(饭店开在哪一块最合适,饭店主要方向是什么) 找门面 装修 开业 进货 招待客户 做菜 收银 打扫卫生 .... 面向过程:以过程,步骤为主,考虑怎么做!自己是执行者 面向对象:以对象(谁)为主,考虑谁来做,谁能做!自己是指挥者 1.2 类和对象 类: 人类(一个抽象的概念) 狗类 具有相同特征和相同行为的对象的集合! 对象: 张三、李四...(真正存在的实体) 万事万物皆对象 真正存在的实体(可以通过属性和行为描述的事务),就可以将其称之为对象! 张三的身高是175,体重是70kg,学历是本科... 会唱歌、会跑、会跳、会敲代码... 类和对象的关系: 类是对一类事物的描述,是抽象的 对象是一类事物的实例,是具体的 类是对象的模板,对象是类的实体 生产手机: 手机设计图(理解为类) 手机(理解为对象) 在java中是先有类,在有对象的!(对象是类的实例) 1.3 类的定义(设计图的研发) 属性:人的姓名:String name;人的年龄:int age;人的性别:char gender 成员变量 行为: 方法 成员方法 之前定义的类,都属于测试类,目的是运行main方法! 定义一个人类:Person 1.4 对象的创建和使用 ① 对象名的定义 ② 对象名=new 类名(); 实例化一个对象,将该对象赋给对象名 合二为一: 类名 对象名 = new 类名(); 自定义的类就是自己创建的数据类型,都是引用数据类型! ③ 对象的属性访问 a.赋值 对象名.属性名=值; b.取值 对象名.属性名; 1.5 内存问题 根据类创建对象,在new的时候,会在堆内存开辟空间 为所有的属性赋初始值(当前数据类型的默认值) 每个对象都有自己的一块独立区域(用于自己的属性值存储)
1.2 成员变量
1 类的五大成员( 成员变量、成员方法、构造器、初始化块、内部类) 1.1 成员变量 ①分类 实例变量 ★ (变量是属于对象) 类变量 (变量是属于类的--->将static再讲) ②实例变量如何声明 【修饰符】 数据类型 变量名 【=值】 值得设置,相当于在实例化对象的时候,该成员变量的默认值 后期是可以覆盖的! ③如何使用实例变量 前提:必须得有对象 访问方式:对象名.成员变量名 1.2 成员变量的特点 ①成员变量是有默认值的(默认值是多少,看数据类型) ②实例变量的值是每个对象独立的 1.3 成员变量和局部变量的区别 ①位置不同 成员变量:直接在类体中 局部变量:某个局部(方法内、if内、循环内...) ②作用范围不一样 成员变量:本类以及其他类都能使用(要符合访问修饰符) 局部变量:只能在当前大括号内使用 ③初始化值得不同 成员变量:有默认值 局部变量:没有初始化,不允许使用 ④内存中位置不同 成员变量:在堆内存 局部变量:在栈内存 ⑤生命周期不同 成员变量:对象被回收的时候销毁 局部变量:当前大括号运行完毕,就销毁 1.4 成员变量的类型可以使任意类型(基本数据类型、引用数据类型)
1.3 成员方法
1.类的第二大成员 ---> 成员方法 类:一组具有相同特征(属性),相同行为(方法)的对象的集合,抽象出来的概念 属性:通过变量去存储数据 方法:一段可以运行的代码(实现某些需求) 2.最简单的方法 public void 方法名(){ //n行代码--> 在main方法可以写的代码,在此处都可以写 } 3.方法的原则 ①先声明后使用 ②调用一次执行一次,不调用不执行 调用一次,在栈中压入一个方法栈。(回头解释) 4.成员方法的分类 ①实例方法 属于对象的,必须有对象才可以 ②类方法(在static中详细介绍) 属于类 5.方法的语法 【修饰符】 返回值类型 方法名(【形参列表】){方法体} ①修饰符 可有可无,后期讲 ②返回值类型 ☆ ③方法名 自定义名字(符合变量命名的规则和规范) ④形参列表 ☆ ⑤方法体 main方法中可以写的,该位置都可以写 6.方法的形式 a.无参无返回值 【public】 void print(){代码体} 无参:方法名的小括号内无任何内容 无返回值:返回值位置写void b.有参无返回值 【public】void print(参数列表){代码体} 有参:在方法名的小括号内,指定参数列表 参数列表:可以是任意数据类型(基本数据类型,引用数据类型) 调用方法的时候,必须按照指定的参数列表传值(类型、个数、顺序) 无返回值:返回值位置写void c.无参有返回值 【public】 返回值类型 方法名(){代码体} 无参:方法名的小括号内无任何内容 有返回值: 返回值类型需要指定 返回值类型只能指定一个(思考:如果想要返回多个数据) 如果是多个相同类型的数据,可以使用数组 如果类型是不一样的多个数据,可以使用集合(后面也是一个重要知识点) 返回值类型可以是任意数据类型(基本、引用) 调用方如何接收返回值: 数据类型 变量名=对象.方法(); //接受数据的数据类型要和返回值类型相一致 return关键字 功能:结束当前方法(遇到return,方法就会立刻结束) 如果无返回值,返回值类型位置写void,方法内默认是存在一个return语句 如果有返回值,方法中必须检测到有return是执行的,执行到就立刻结束方法 d.有参有返回值 参数:和之前一样 返回值:和之前一样 7.遇到需求的时候,要自己分析,方法的参数列表是什么,返回值类型是什么 8.方法声明的位置是类体中(方法中不能嵌套方法) 9.实例方法的调用 9.1 在本类内 直接调用 语法: 【this.】本类的方法(); this是当前对象,是当前方法的调用者! 9.2 在其他类内 必须通过对象去调用! 10.方法调用内存相关 ☆ 方法是调用一次执行一次,不调用不执行 11.形参和实参 形参:方法声明是指定的参数列表 实参:方法调用时,传递的真正的数据
2. 练习
2.1 实例变量的练习
练习一:声明矩形类
需求:声明矩形类,包含长、宽两个实例变量,并创建矩形对象,求面积
public class Field_Demo1 {
public static void main(String[] args) {
//创建对象
Rectangle r = new Rectangle();
r.length = 1;
r.width = 2;
System.out.println("长:" + r.length);
System.out.println("宽:" + r.width);
System.out.println("面积:" + r.length*r.width);
}
}
class Rectangle{
double length;
double width;
}
练习二:声明员工类
需求:声明员工类,包含姓名、性别、薪资三个实例变量,并创建员工对象,打印信息
public class Field_Demo2 {
public static void main(String[] args) {
//创建对象
Employee emp = new Employee();
emp.name = "柴林燕";
emp.gender = '女';
emp.salary = 10000;
System.out.println("姓名:" + emp.name);
System.out.println("性别:" + emp.gender);
System.out.println("薪资:" + emp.salary);
}
}
class Employee{
String name;
char gender;
double salary;
}
练习三:声明日期类
需求:声明日期类,包含年、月、日三个实例变量,并创建日期对象,显示信息
public class Field_Demo3 {
public static void main(String[] args) {
//创建对象
MyDate today = new MyDate();
today.year = 2019;
today.month = 7;
today.day = 5;
System.out.println("今天是" + today.year + "年" + today.month + "月" + today.day);
}
}
class MyDate{
int year;
int month;
int day;
}
练习四:声明丈夫和妻子类
需求:
丈夫类:包含姓名和妻子属性
妻子类:包含姓名和丈夫属性
创建一对夫妻对象,并打印信息
public class Field_Demo4 {
public static void main(String[] args) {
//创建丈夫对象
Husband husband = new Husband();
//创建妻子对象
Wife wife = new Wife();
//指定属性
husband.name = "邓超";
wife.name = "孙俪";
husband.wife = wife;
wife.husband = husband;
System.out.println("丈夫:" + husband.name + ",他妻子是:" + husband.wife.name);
System.out.println("妻子:" + wife.name + ",他丈夫是:" + wife.husband.name);
}
}
class Husband{
String name;
Wife wife;
}
class Wife{
String name;
Husband husband;
}
上述代码内存图:
2.2 定义和调用实例化方法练习
练习一:比较两个数据是否相同
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数列表
。
明确返回值:比较整数,比较的结果只有两种可能,相同或不同,因此结果是布尔类型,比较的结果相同为true。
明确参数列表:比较的两个整数不确定,所以默认定义两个int类型的参数。
class Count {
/*
定义比较两个整数是否相同的方法
返回值类型,比较的结果布尔类型
参数:不确定参与比较的两个整数
*/
public boolean compare(int a, int b) {
if (a == b) {
return true;
} else {
return false;
}
}
}
public class Method_Exer1 {
public static void main(String[] args) {
// 创建对象
Count c = new Count();
//调用方法compare,传递两个整数
//并接收方法计算后的结果,布尔值
boolean bool = c.compare(3, 8);
System.out.println(bool);
}
}
练习二:计算两个整数的最大值
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数列表
。
明确返回值:比较整数,比较的结果是它们中的一个,所以是int。
明确参数列表:比较的两个整数不确定,所以默认定义两个int类型的参数。
class Count{
public int max(int a,int b){
return a>b?a:b;
}
}
public class Method_Exer2{
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入一个整数:");
int x = input.nextInt();
System.out.print("请输入另一个整数:");
int y = input.nextInt();
Count c = new Count();
int max = c.max(x, y);
System.out.println(x + "," + y + "中的最大值是:" + max);
}
}
练习三:计算1+2+3+...+100的和
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数
。
明确返回值:1~100的求和,计算后必然还是整数,返回值类型是int
明确参数:需求中已知到计算的数据,没有未知的数据,不定义参数
class Count {
/*
定义计算1~100的求和方法
返回值类型,计算结果整数int
参数:没有不确定数据
*/
public int getSum() {
//定义变量保存求和
int sum = 0;
//从1开始循环,到100结束
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
return sum;
}
}
public class Method_Exer3 {
public static void main(String[] args) {
// 创建对象
Count c = new Count();
//调用方法getSum
//并接收方法计算后的结果,整数
int sum = c.getSum();
System.out.println(sum);
}
}
练习四:实现不定次数打印HelloWorld
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数
。
明确返回值:方法中打印出
HelloWorld
即可,没有计算结果,返回值类型void
。明确参数:打印几次不清楚,参数定义一个整型参数
class PrintUtil {
/*
定义打印HelloWorld方法
返回值类型,计算没有结果 void
参数:不确定打印几次
*/
public void printHelloWorld(int n) {
for (int i = 0; i < n; i++) {
System.out.println("HelloWorld");
}
}
}
public class Method_Exer4 {
public static void main(String[] args) {
// 创建对象
PrintUtil p = new PrintUtil();
//调用方法printHelloWorld,传递整数
p.printHelloWorld(9);
}
}
练习五;实现打印不确定(行数、列数、组成的符号)矩形的图形
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数
。
明确返回值:方法中打印出line行column列由sign组成的矩形即可,没有计算结果,返回值类型
void
。明确参数:打印几行,几列,什么符号组成不清楚,参数定义三个参数
public class Method_Exer5 {
public static void main(String[] args) {
//创建对象
PrintUtil pu = new PrintUtil();
//调用printRectangle方法
pu.printRectangle(5, 10, "&");
}
}
class PrintUtil{
public void printRectangle(int line, int column, String sign){
for (int i = 0; i < line; i++) {
for (int j = 0; j < column; j++) {
System.out.print(sign);
}
System.out.println();
}
}
}
练习六:声明圆类
需求:声明一个圆
包含实例变量radius保存圆对象半径的值
包含实例方法getArea求圆对象的面积
包含实例方法getPerimeter求圆对象的周长
包含实例方法getInfo获取圆对象的详细信息
分析:定义方法实现功能,需要有两个明确,即
返回值
和参数
。
明确返回值:
getArea()方法需要返回面积值,所以是double类型
getPerimeter()方法需要返回周长值,所以是double类型
getInfo()方法需要返回圆对象的完整信息,所以是String类型
明确参数:
getArea()方法,求面积值通过实例变量radius计算即可,所以不需要再设计参数
getPerimeter()方法,求周长通过实例变量radius计算即可,所以不需要再设计参数
getInfo()方法,返回圆对象的完整信息,由实例变量radius的值,和通过getArea()方法计算的面积值,通过getPerimeter()方法计算的周长的值组成,所以不需要再设计参数
public class Method_Exer6 {
public static void main(String[] args) {
//创建对象
Circle c = new Circle();
c.radius = 1.2;
System.out.println(c.getInfo());
}
}
class Circle{
double radius;
public double getArea(){
return 3.14 * radius * radius;
}
public double getPerimeter(){
return 2 * 3.14 * radius;
}
public String getInfo(){
return "半径:" + radius + ",面积:" + getArea() + ",周长:" + getPerimeter();
}
}
练习七:声明客户和账户类、银行类
声明账户类Account
包含:账户和余额两个实例变量
包含save存款方法
包含withdraw取款方法
声明客户类Customer
包含:姓名和手机、身份证号、拥有的一个账户,四个实例变量
声明银行类BankClerk
包含open方法,给某个客户对象开户,关联Customer和Account两个对象的信息
class Account{
String id;
double balance;
public void save(double money){
if(money > 0){
balance += money;
}else{
System.out.println("参数有误");
}
}
public void withdraw(double money){
if(money <0){
System.out.println("参数有误");
}else if(money > balance){
System.out.println("余额不足");
}else{
balance -= money;
}
}
}
class Customer{
String name;
String tel;
String cid;
Account account;
}
class BankClerk{
public void open(Customer c, Account a){
c.account = a;
}
}
public class Method_Exer6 {
public static void main(String[] args) {
//创建客户对象
Customer c = new Customer();
c.name = "柴林燕";
c.tel = "10086";
c.cid = "111111111111111111";
//创建银行卡账号对象
Account a = new Account();
a.id = "12345678910";
a.balance = 0;
//银行对象
BankClerk b = new BankClerk();
b.open(c, a);
System.out.println("姓名:" + c.name + ",电话:" + c.tel + ",身份证号:" + c.cid + ",账号:" + c.account.id + ",余额:" + c.account.balance);
//存款
c.account.save(1000);
System.out.println("姓名:" + c.name + ",电话:" + c.tel + ",身份证号:" + c.cid + ",账号:" + c.account.id + ",余额:" + c.account.balance);
//取款
c.account.withdraw(2000);
//显示信息
System.out.println("姓名:" + c.name + ",电话:" + c.tel + ",身份证号:" + c.cid + ",账号:" + c.account.id + ",余额:" + c.account.balance);
}
}