Java 类,对象,方法部分的笔记
第六章 Java_类与对象
java 面向对象的语言
面向对象的三大特征:封装、继承、多态
6.1、面向过程与面向对象编程的区别
面向过程:自己去完成
面向对象:不自己去做,让对象去完成
1)面向过程的思维解决问题:
1.凡事亲力亲为,效率比较低
2.不符合现在企业开发的要求 - 效率
如:数组 for循环输出,手写冒泡排序,选择排序 - 底层实现
2)面向对象的思维解决问题:
1.符合目前人们的思维的习惯。
2.效率比较高,符合企业开发的要求。
3.面向对象,把曾经在过程中的 执行者 ,转变为了对象中 指挥者 。
如:Arrays.toString() ;Arrays.sort()
6.2、类与对象概述
1)什么是对象?
对象:在现实世界中,实实在在存在的个体,就是对象,万物皆对象。
通过对象的 特征 和 行为 ,来描述该对象
2)什么是类?
定义类:类用来 描述 对象的特征(属性)和行为(方法),是一个抽象的概念。
类是对象的抽象(模板),对象是类的具体化
先定义类,然后再创建对象
a)什么是属性?
对象的特征
b)什么是方法?
对象的行为
3)类和对象的关系和区别
区别:
类是抽象的;
类是抽象的概念,仅仅代表事物的模板,比如说“女朋友”、“男朋
友”。
对象是具体的;
对象是一个能够“看得到,摸得着的”具体的实体,比如石榴姐。
关系:
- 对象是类在现实世界的体现。类是对象一个抽象描述。
女朋友 这个抽象的概念 具体 来说 : 石榴姐对象
石榴姐 这个 具体的概念 抽象 来说: 女朋友类
- 类是对象定义的数据类型;对象是类的实例化,是实际在内存
中保存的类这种类型的一个值。
4)如何定义类
语法:
public class 类名{
//定义类的属性
数据类型 属性名;
//定义类的方法
public void/返回值类型 方法名(形参){
//方法体
return 返回值;
}
}
案例:
学生类: 属性: 姓名,年龄,地址,性别,邮箱,班级。
方法:study() sleep() eat()
package demo;
public class Student {
//学生的特征(属性) - 定义在类中的变量 - 成员变量(全局变量)
String name; //姓名
int age; //年龄
String address; //地址
char sex; //性别
String email; //邮箱
String classes; //班级
//学生的方法
public void study(){ //学习
System.out.println("姓名是:" + name + ",年龄是:" + age + ",地址是:" + address +
",性别是:" + sex + ",邮箱地址是:" + email + ",班级是:" + classes);
}
public void sleep(){
System.out.println("学完睡觉了");
} //睡觉
public void eat(){ //吃东西
//局部变量
String food;
food = "狗粮"; //如果不赋值那么输出的话编译器会报异常
System.out.println("food = " + food);
}
}
汽车类:
package demo;
//汽车类
public class Car {
String brand = "兰博基尼"; //品牌
String color; //颜色
int num; //轮子数
public void run(){
int count = 2; //局部变量
System.out.println("品牌是" + brand + "的" + num + "个轮子的" + color + "的车在跑");
System.out.println("可以坐" + count + "个人");
}
}
5)如何通过类创建对象
创建对象并且使用的步骤:
语法:
1) 创建对象:
//类是对象定义的数据类型;对象是类的实例化,是实际在内存
中保存的类这种类型的一个值。
类名 对象名 = new 类名();
2)使用对象【调用】属性和方法
调用属性: 对象名.属性名;
给对象属性赋值:对象名.属性名=值;
调用方法:对象名.方法名();
注意:
-
通过类来创建对象,所以肯定是要先定义类,再创建对象
-
只要通过new的方式创建,那么就可以创建多个对象,只要new
了,就一个新对象。
-
不同的对象,地址值是不一样的,开辟了不同的内存空间!
-
不同的对象,是不能重名的!
6)全局变量和局部变量:
全局变量:
1)定义在类中,如果没有给全局变量赋值,那么全局变量(成员变量)会有初始值
2)全局变量的 默认初始值 :
String - null
int - 0
char - 空字符
float - 0.0
double - 0.0
boolean - false
局部变量:
1)定义在方法中,代码块(for,while)中
2)局部变量 必须要赋初始值 ,才能使用,否则会出异常。
案例
1、创建学生对象,并给对象属性赋值,然后调用属性和方法。
//学生类的测试类
package demo;
public class StuTest {
public static void main(String[] args) {
//创建对象s1
Student s1 = new Student();
//调用属性赋值
s1.name = "胡巴";
s1.age = 21;
s1.sex = '男';
s1.address = "湖北";
s1.email = "56565@163.com";
s1.classes = "计科1903班";
//调用方法
s1.study();
s1.sleep();
System.out.println("s1 = " + s1); //打印的是一个地址值 demo.Student@14ae5a5
//创建对象s2
Student s2 = new Student();
s2.name = "张三"; //调用属性赋值
s2.study(); //姓名是:张三,年龄是:0,地址是:null,性别是: ,邮箱地址是:null,班级是:null
s2.eat(); //food = 狗粮
System.out.println("s2 = " + s2); //打印的是一个地址值 demo.Student@7f31245a
}
}
2、创建汽车对象,并给对象属性赋值,然后调用属性和方法。
//汽车类的测试类
class CarTest{
public static void main(String[] args) {
//创建对象
Car car = new Car();
//调用属性赋值
car.color = "红色";
car.num = 4;
//调用方法
car.run();
}
}
7)对象的内存图解
栈内存(stack) : 连续的存储空间,栈内存的原则:先进后出(手枪),
后进先出,一般存储是局部变量。
堆内存(heap):不连续的存储空间,一般存储是new出来的对象,
是类的实例化对象。
方法区(method) : 在堆内存中,存储的是1、类的代码信息 。
基本数据类型在栈内存中,引用数据类型都在堆内存中:数组、类
...
基本数据类型的默认值:
整型: 0
浮点型:0.0
布尔类型:false
char类型:\u0000 空字符
引用数据类型的默认值:null
示意图:
特点:
1)定义在类中属性 - 成员变量(全局变量) - 有默认初始值
2)成员变量保存在堆内存中
3)修改成员变量,实际上,修改的是成员变量在堆内存中的值。
4)局部变量定义在方法中,或者代码块中。
5)局部变量必须要给初始值才能使用!!!
6)局部变量保存在栈内存中!
8)UML类图
UML (Unified Modeling Language) : 统一模型构建语言,用来
对面向对象的系统产品进行说明,可视化,编辑文档的统一语言。
UML类图作用:可视化的来描述类的信息。
示意图
修饰符的说明
public : +
protected : #
default : ~
private : -
定义属性的方式:
修饰符 属性名 : 属性类型 [=默认值]
[]: 表示可有可无
定义方法的方式:
修饰符 方法名(参数列表) : 返回值类型
9)包的使用和定义方式
(1)包的定义
使用包来对 java 类进行管理
(2)包名命名方式
一般使用反域名法来定义包名
百度域名:www.baidu.com
反域名:com.baidu.demo.user.xx.xxx
规范:包名全部小写
IDEA 包名逐层显示
(3)包的访问
package com.xunfang.demo;
//当前类所在的路径
(4)import 导包
import java.util.Scanner;
//导入包路径
10)对象数组
数组 :
double [] scores = new double[5]; : 基本类型的数据
String [] xx = new String[5]; : 字符串类型
对象类型: 类是对象这种数据的类型!!!
对象数组:数组中保存的是 对象 !
数组的类型:类名
6.3、方法
1、方法概念
方法(函数):解决java中的问题的方式和方法。
2、方法的好处
方法的好处1:使用方法来对某些问题进行封装操作来解决问题
方法的好处2:就是面向对象的体现,封装了操作,那么我们只需要通过对象去调用方法,就能解决问题,大大提高了代码的质量和维护效率
在 java 程序中,设计代码的规则:高内聚,低耦合
3、方法如何定义
1)语法
public 返回值类型 方法名(形参类型1 形参名1, 形参类型2 形参名2......){
//方法名
return 返回值;
}
2)解释语法
访问修饰符:public(公共的,公有的),private(私有的),protected(受保护的),default(默认的)
返回值类型:
-
定义了方法的返回值的类型(基本类型,引用类型(对象,String,对象数组,集合......) ),注意:只是定义类型,不是具体的值!
-
返回值类型,只有有返回值时,才定义。
-
返回值类型和返回值,一定是成对出现的!
void :表示没有返回值,不能写 return
方法名:方法的名字,遵循标识符的写法,驼峰命名法
形参类型:形式参数类型,定义了形参的类型(基本数据类型,引用类型(对象,String,对象数组,集合......)),不是具体的值
return:返回的关键字,用来结束方法
返回值:是一个具体的值(表达式,变量...)
4、方法的分类
a)无参无返回值方法
语法
public void 方法名(){
//方法体
//说明:完全依靠方法体来进行操作和输出
}
其他类中,如何调无参无返回值的方法
- 创建对象
对象名.方法名()
b)有参无返回值的方法
语法
public void 方法名(形参类型1 形参名1,形参类型2 形参名2){
//方法体
}
形式参数和实际参数的概念
形式参数:定义在方法的 () 中,用来接收实际参数传递的值的类型,不能设置具体的值。
参数型的范围:基本类型,引用类型(对象,对象数组,String...)
实际参数,定义在调用方法时的方法()中,用来传递实际的参数,
形参和实参注意问题:
1、实际参数和形式参数的类型,必须保持一致!
2、实际参数和形式参数的个数,也要保持一致!
3、实际参数和形式参数的顺序,也要保持一致!
其他类中,如何调用有参无返回值的方法:
-
创建对象
-
对象名.方法名(实参的值...)
c)无参有返回值的方法
语法:
public 返回值类型 方法名(){
//方法体
return 返回值;
}
注意问题:
1.return返回的结果(值,变量,表达式,对象数组,对象)
2.如果方法有返回值类型,那么必须要写return 返回值;
3.调用有返回值的方法时,方法的返回值必须要接收,如果不接收,那么方法调用就没有意义了!
其他类中,如何调用无参有返回值的方法:
1.创建对象
2.返回值类型 返回值名称 = 对象名.方法名();
d)有参有返回值的方法
语法:
public 返回值类型 方法名(形参类型1 形参名1,形参类型2 形参名2){
//方法体
return 返回值;
}
其他类中,如何调用有参有返回值的方法:
1.创建对象
2.返回值类型 返回值名称 = 对象.方法名(参数的值...);
5、定义和调用方法的注意事项
1)形参和实参的类型,个数,顺序要保存一致!
2)如果方法有返回值,必须接收返回值!
3)返回值必须和返回值类型保存一致!
4)形参不能设置具体的值,实参要设置具体的值!
5)如果方法有返回值,那么必须要写return;
6、形参和实参的区别
1、出现位置不同:
形参:写在方法的定义的()中
实参:写在方法调用的()中
2、赋值不同:
形参:接收实参传递的值,只是定义类型
实参:实际给方法的形参传递的值
7、方法重载
1)为什么重载
问题:首先,这些方法的作用类似,方法名称每个都不一样,这样,再调用的时候,容易记不住,使用起来不方便
2)方法重载的规则
1、方法重载必须在同一个类中
2、方法的名称 必须一样 ,但是方法的参数的 个数,类型,顺序 只要有1个不同,就可以实现重载
3、方法的返回值类型对方法重载没有影响
3)案例
package com.xunfang.demo;
import java.util.Scanner;
public class User {
//调用方法,验证用户是否登录成功。根据登录结果提示对应的消息
public String userName = "admin1";
public String pwd = "111111";
public boolean login(String inputUserName,String inputPwd){
if (inputUserName.equals(userName) && inputPwd.equals(pwd)){
return true;
}
return false;
}
}
class UserTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
User user = new User();
System.out.println("请输入用户名:");
String inputUserName = input.next();
System.out.println("请输入密码:");
String inputPwd = input.next();
boolean login = user.login(inputUserName,inputPwd);
if (login){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
}
8、全员变量与局部变量的区别
1)概念
全局变量:定义在类中,方法的外面,也叫做成员变量
作用范围:类中的任何位置都可以使用
局部变量:定义在方法中, 方法的形参中 ,代码块中({} , for, if...)
作用范围:只在当前方法或者代码块中有效
2)区别
初始值不同:
成员变量:默认有初始值,可以直接使用,具体参考之前的笔记
局部变量:需要程序员手动赋初始值才能使用,否则编译异常。
定义的位置不同:
成员变量:定义在类中,方法的外面
局部变量:定义在方法中, 方法的形参中 ,代码块中({} , for, if...)
在内存中位置不同:
成员变量:保存在堆内存的对象中
局部变量:保存在栈内存中的方法中
生命周期的不同:
成员变量:随着对象的销毁,就没有了
局部变量:方法弹栈,局部变量就销毁了
使用范围不同:
全局变量:
作用范围:类中的任何位置都可以使用
局部变量:
作用范围:只在当前方法或者代码块中有效
3)推荐方法
根据实际的需求来:
全局变量: 用在,如果这个变量,需要全局使用,定义成全局的
局部变量:用在,如果该变量,只在当前方法中用,定义成局部的。(推荐)
4)提醒
成员变量和局部变量可以重复定义
当成员变量和局部变量同名的时候,优先使用局部变量
如果全局变量和局部变量都定义成同一个变量名称,调用谁?
结论:优先调用局部变量!!
9、匿名对象
普通创建对象: 类名 对象名 = new 类名();
匿名对象:new 类名().调用方法();
class Test05{
public static void main(String[] args) {
//匿名对象:
//1) 匿名对象也是有名字的:java提供Test05$1,用完之后,会销毁该名字,只能使用一次
//2) 匿名对象只能使用1次
//Test05$1
new TestDemo().showInfo();
new TestDemo().showInfo();
}
}
10、练习
1、对象数组做参数
需求说明:定义学员类,存储学员信息(属性:姓名、成绩;方法:显示个人成绩)。编写修改成绩类,使用学员对象数组作为参数,实现学员成绩修改,条件为:如果学员成绩小于60,集体提高2分。最终输出修改成绩后每个学员的成绩,
package homework;
import java.util.Scanner;
public class Student {
//定义学员类,存储学员信息(属性:姓名、成绩;方法:显示个人成绩)。
// 编写修改成绩类,使用学员对象数组作为参数,实现学员成绩修改,
// 条件为:如果学员成绩小于60,集体提高2分。最终输出修改成绩后每个学员的成绩
String name;
double score;
public void show(String name,double score){
System.out.println(name + "的成绩是:" + score);
}
}
class UpdateScore{
public void update(Student[] students){
for (int i = 0; i < students.length; i++) {
if (students[i].score < 60){
for (int j = 0; j < students.length; j++) {
students[j].score += 2;
}
}
}
}
}
class Test01{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Student[] students = new Student[3];
for (int i = 0; i < students.length; i++) {
Student student =new Student();
System.out.print("请输入学生姓名:");
student.name = input.next();
System.out.print("请输入学生成绩:");
student.score = input.nextDouble();
students[i] = student;
System.out.println();
}
new UpdateScore().update(students);
for (int j = 0; j < students.length; j++) {
students[j].show(students[j].name,students[j].score);
}
}
}
2、带多个参数的方法
需求说明:正确使用带参方法实现学员信息管理,增加学员姓名;在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功
package homework;
import java.util.Scanner;
public class Students {
//正确使用带参方法实现学员信息管理,增加学员姓名;
// 在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功
String[] stuNames;
public void showInfo(){
for (int i = 0; i < stuNames.length; i++) {
System.out.print(stuNames[i] + " ");
}
}
public boolean find(int start,int end,String findname){
for (int j = start - 1; j < end; j++) {
if (findname.equals(stuNames[j])){
return true;
}
}
return false;
}
}
class Tset05{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Students students = new Students();
String[] stuNames = new String[5];
students.stuNames = stuNames;
for (int i = 0; i < stuNames.length; i++) {
System.out.print("请输入学生姓名:");
stuNames[i] = input.next();
}
System.out.println("本班学生列表:");
students.showInfo();
System.out.print("\n\n请输入开始查找的位置:");
int start = input.nextInt();
System.out.print("请输入结束查找的位置:");
int end = input.nextInt();
System.out.print("请输入查找的姓名:");
String findname = input.next();
System.out.println("\n*****查找结果*****");
if (students.find(start,end,findname)){
System.out.println("找到了!");
}else {
System.out.println("没找到!");
}
}
}
本文来自博客园,作者:Thecong,转载请注明原文链接:https://www.cnblogs.com/hwphwc/p/16476557.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!