面向对象编程-对象和类

类和对象

面向对象概述

  1. 分离变量来表示学生有很明显的缺点
/**
* 分离变量来存储学生信息
*/
public class Demo01 {
public static void main(String[] args) {
//定义一个学生
String name1 = "Tom";
int age1 = 22;
char gender1 = '男';
double score1 = 85.5;

//定义第二名学生
String name2 = "Jerry";
int age2 = 21;
char gender2 = '男';
double score2 = 86.5;

//输出第一名的信息
System.out.println("姓名:"+name1);
System.out.println("年龄:"+age1);
System.out.println("性别:"+gender1);
System.out.println("成绩:"+score1);

//输出第二名的信息
System.out.println("姓名:"+name2);
System.out.println("年龄:"+age2);
System.out.println("性别:"+gender2);
System.out.println("成绩:"+score2);
}
}

  1. 什么是OOP

面向对象编程的核心思想是将数据和操作数据的方法封装在一起,形成称为对象的实体

  1. 面向对象三大特点

封装、继承、多态(同一个方法可以在不同的对象上具有不同的行为)

  1. 经典面试题

封装将数据和操作封装在类中,通过类的实例化创建对象

继承允许一个类继承另一个类的属性和方法,实现代码的重用和扩展

多态性使得不同类型的对象可以以统一的方式进行操作,提高代码的灵活性和可扩展性

面向对象编程

  1. 类和对象

类是创建对象的模板或蓝图,它定义了对象的属性和行为

对象是类的实例化结果,它是类的具体实体

  1. 设计一个类

类有自己相应的属性和方法

/**
* 定义一个类
* 一个java程序可以定义多个类,但是只能有一个public
* 程序的入口main()在public声明的类中
*/
public class Demo02 {
public static void main(String[] args) {

}
}
//定义一个类(声明一个类)
class Student{
//属性(变量)
String name;
int age;
double score;
char gender;

//方法
public void printOf(){
System.out.println("姓名:"+name+age+score+gender);
}
}
//定义老师类
class Teacher{
//属性
String name;
int age;
char gender;
double salary;
}
  1. 创建对象

创建对象的过程被称为”实例化”

类名 对象名 = new 类名();

创建对象的过程中,使用new运算符,每创建一个对象就会在内存中创建一组数据.

// 创建学生类的对象
Student student1 = new Student();
Student student2 = new Student();
Teacher teacher1 = new Teacher();
Teacher teacher2 = new Teacher();
//f访问对象的属性
System.out.println(student1.name +","+student1.age+","+student1.gender+","+student1.score);
  1. 引用类型

    引用类型是一种用于操作对象的数据类型

    它不直接存储对象的值,而是存储对象的引用或内存地址

    通过引用类型,我们可以操作和访问对象的属性和方法

    当我们创建一个对象时,实际上是在内存中分配一块空间,空间中存储了对象的属性,并将该对象的引用赋值给引用类型变量

  2. [案例]类与对象示例

package day01;

/**
* 定义一个类
* 一个java程序可以定义多个类,但是只能有一个public
* 程序的入口main()在public声明的类中
*/
public class Demo02 {
public static void main(String[] args) {
// 创建学生类的对象
Student student1 = new Student();
//为对象的属性赋值field属性 method方法
student1.name ="Tom";
student1.age = 20;
student1.gender ='男';
student1.score = 85.5;
Student student2 = new Student();
student2.name ="Jerry";
student2.age = 19;
student2.gender ='男';
student2.score = 86.5;
Teacher teacher1 = new Teacher();
Teacher teacher2 = new Teacher();
//输出学生的信息
System.out.println(student1.name +","+student1.age+","+student1.gender+","+student1.score);
System.out.println(student2.name +","+student2.age+","+student2.gender+","+student2.score);
}
}
//定义一个类(声明一个类)
class Student{
//成员属性(变量)
String name;
int age;
double score;
char gender;

//方法
public void printOf(){
System.out.println("姓名:"+name+age+score+gender);
}
}
//定义老师类
class Teacher{
//属性
String name;
int age;
char gender;
double salary;
}

  1. 对象内存分配

构造器

  1. 什么是构造器

构造器是一种特殊的方法,用于封装对象属性的初始化过程

​ 通过构造器,可以在创建对象时,对对象的属性进行初始化

构造器的名称与类名相同,并且没有返回值类型声明

//定义一个类(声明一个类)
class Student{
//成员属性(变量)
String name;
int age;
double score;
char gender;

//定义一个构造器(构造器)
public Student(String name,int age, char gender,double score){
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
}
  1. 使用new调用构造器

当需要初始化对象属性时,只需要使用new关键字调用构造器,它会执行构造器中封装的对象属性初始化算法,从而初始化新对象的属性

调用构造器,复用构造器中封装的对象属性初始化算法

可以使用以下代码创建Student对象

Student student1 = new Student("tom",20,'男',85.5);
Student student2 = new Student("jerry",19,'男',86.5);

注意:

  • 构造器的名称与类名必须严格一致,包括大小写也必须一致
  • 构造器不能声明返回值
  • new运算调用构造器创建对象,创建对象过程就是复用构造器初始化对象属性的过程
  1. null值含义

java中,null是一个特殊的值,表示引用变量没有指向任何对象

当一个引用变量被赋值为null时,她不再指向任何有效的内存空间

  1. this关键字

this用在构造器中,引用当前对象实例,用于访问当前对象的属性和方法

“”你创建的那个对象 那个对象就是this””

  1. 默认构造器

java设计了一个巧妙规则保证任何类都有构造器

如果一个类没有声明任何的构造器则java会给类添加一个默认构造器

如果类中定义了构造器,则不再添加默认构造器

默认构造器是一个无参数,空方法体的构造器

  1. 构造器重载

构造器重载:在一个类中同时声明多个参数不同的构造器

可以有更多的对象创建方式,使用起来更加灵活方便

  1. this()重用其他构造器

this关键字还有第二个用法:this()重用其他构造器,简化构造器的代码

this()必须在构造器中使用,且必须写在构造器的第一行

   
public Student(String name) {
this(18);//必须写在第一行
this.name = name;
}

public Student(int age) {
this.age = age;
}

方法

方法的声明与调用

  1. 什么是方法

    编写软件的时候会出现重复的计算过程,将这些冗余的计算过程封装成方法,在需要使用计算过程时候只需要调用方法就可以复用这个计算过程

    方法核心思想是:复用

  2. 声明方法

方法用于封装一个特定的功能

通常以一系列的语句所组成,并完成一个动作/功能

定义方法的五个要素:修饰词\返回值类型\方法名\参数列表\方法体

public static int sum (int num1, int num2){

//方法体;

}
  1. 方法的调用

/**
* 银行账户类
*/
class Account {
double balance; //账户余额
String log; //交易记录

//无参构造器
public Account() {
this.balance = 1000.0;
}
//存钱的方法

/**
*
* @param amount 存钱金额
* @param msg 交易记录
*/
public void add(double amount,String msg){
this.balance += amount;
this.log +="收入:"+amount+",当前余额:"+balance+",备注:"+msg;
}
public boolean isEnough(double amount){
return (this.balance-amount)>=0;
}
}

public class MethodDemo1 {
public static void main(String[] args) {
Account a1 = new Account();//调用默认无参构造方法
a1.add(500,"劳务费");
a1.add(80,"红包");
System.out.println(a1.log);
System.out.println(a1.isEnough(1500));
}
}

  1. 关于参数

    方法参数是方法运算时候的依赖数据,可以将方法运算时候的可变参数通过方法参数传递到方法中

  2. [案例]

/**
* 创建一个类Sort
* 提供一个方法bubble 返回值是一个int类型的数组 参数是一个int类型的无序数组
* 采用冒泡排序算法 排序这个无序数组 返回从小到大排序的有序数组
*/
public class Sort {
//冒泡排序
public int[] bubble(int[] arr){
for (int i = 0; i <arr.length-1; i++) {
for (int j = 0; j <arr.length-i-1 ; j++) {
if (arr[j] > arr[j+1]){
int temp =arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
}

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class TestSort {
public static void main(String[] args) {
Sort sort = new Sort();//创建sort对象
Scanner scanner = new Scanner(System.in);
Random random = new Random();//创建random对象
int[] arr1 = new int[scanner.nextInt()];
for (int i = 0; i <arr1.length ; i++) {
int num = random.nextInt(101)+1;
arr1[i] = num;
}
System.out.println(Arrays.toString(arr1));
int [] arr2 = sort.bubble(arr1);
System.out.println(Arrays.toString(arr2));
}
}

方法的重载

  1. 方法的签名

方法的签名包含:方法名和参数列表

一个类中,不可以有两个方法的签名完全相同

即一个类中,不可以有两个方法的方法名和参数列表都完全一样

  1. 什么是方法的重载

方法重载:在同一个类中,两个方法的方法名相同,参数列表不同**(参数的个数或者参数的类型有一个不同即可)**和返回值没有关系

/**
* 计算类
* 编写三个方法sum
* 第一个方法 计算两个整数的和
* 第二个方法 计算两个浮点数的和
* 第三个方法 计算三个整数的和
*/
public class Calculate {
/**
* 计算两个整数的和
* @param num1 整数1
* @param num2 整数2
* @return 返回两个整数的和
*/
public int sum(int num1,int num2){
return num1 + num2;
}

/**
* 计算连个浮点数的和
* @param num1 浮点数1
* @param num2 浮点数2
* @return 两个浮点数的和
*/
public double sum(double num1,double num2){
return num1 + num2;
}

/**
* 计算三个整数的和
* @param num1 整数1
* @param num2 整数2
* @param num3 整数3
* @return 返回三个整数的和
*/
public int sum(int num1, int num2, int num3){
return num1 + num2 + num3;
}

public static void main(String[] args) {
Calculate calculate = new Calculate();
int sum1 = calculate.sum(1,3);
double sum2 = calculate.sum(2.5,5.6);
int sum3 = calculate.sum(1,5,9);
System.out.println(sum1);
System.out.println(sum2);
System.out.println(sum3);
}
}

java对象内存管理

对象内存管理

  1. Java内存管理规则

编译好的Java程序需要运行在JVM中

JVM内存分为三个大区域:”方法区\ 栈\堆”

堆内存

方法区