面向对象编程-对象和类
类和对象
面向对象概述
- 分离变量来表示学生有很明显的缺点
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); } }
|
- 什么是OOP
面向对象编程的核心思想是将数据和操作数据的方法封装在一起,形成称为对象的实体
- 面向对象三大特点
封装、继承、多态(同一个方法可以在不同的对象上具有不同的行为)
- 经典面试题
封装将数据和操作封装在类中,通过类的实例化创建对象
继承允许一个类继承另一个类的属性和方法,实现代码的重用和扩展
多态性使得不同类型的对象可以以统一的方式进行操作,提高代码的灵活性和可扩展性
面向对象编程
- 类和对象
类是创建对象的模板或蓝图,它定义了对象的属性和行为
对象是类的实例化结果,它是类的具体实体
- 设计一个类
类有自己相应的属性和方法
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; }
|
- 创建对象
创建对象的过程被称为”实例化”
类名 对象名 = new 类名();
创建对象的过程中,使用new运算符,每创建一个对象就会在内存中创建一组数据.
Student student1 = new Student(); Student student2 = new Student(); Teacher teacher1 = new Teacher(); Teacher teacher2 = new Teacher(); System.out.println(student1.name +","+student1.age+","+student1.gender+","+student1.score);
|
引用类型
引用类型是一种用于操作对象的数据类型
它不直接存储对象的值,而是存储对象的引用或内存地址
通过引用类型,我们可以操作和访问对象的属性和方法
当我们创建一个对象时,实际上是在内存中分配一块空间,空间中存储了对象的属性,并将该对象的引用赋值给引用类型变量
[案例]类与对象示例
package day01;
public class Demo02 { public static void main(String[] args) { Student student1 = new Student(); 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; }
|
- 对象内存分配
构造器
- 什么是构造器
构造器是一种特殊的方法,用于封装对象属性的初始化过程
通过构造器,可以在创建对象时,对对象的属性进行初始化
构造器的名称与类名相同,并且没有返回值类型声明
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; }
|
- 使用new调用构造器
当需要初始化对象属性时,只需要使用new关键字调用构造器,它会执行构造器中封装的对象属性初始化算法,从而初始化新对象的属性
调用构造器,复用构造器中封装的对象属性初始化算法
可以使用以下代码创建Student对象
Student student1 = new Student("tom",20,'男',85.5); Student student2 = new Student("jerry",19,'男',86.5);
|
注意:
- 构造器的名称与类名必须严格一致,包括大小写也必须一致
- 构造器不能声明返回值
- new运算调用构造器创建对象,创建对象过程就是复用构造器初始化对象属性的过程
- null值含义
java中,null是一个特殊的值,表示引用变量没有指向任何对象
当一个引用变量被赋值为null时,她不再指向任何有效的内存空间
- this关键字
this用在构造器中,引用当前对象实例,用于访问当前对象的属性和方法
“”你创建的那个对象 那个对象就是this””
- 默认构造器
java设计了一个巧妙规则保证任何类都有构造器
如果一个类没有声明任何的构造器则java会给类添加一个默认构造器
如果类中定义了构造器,则不再添加默认构造器
默认构造器是一个无参数,空方法体的构造器
- 构造器重载
构造器重载:在一个类中同时声明多个参数不同的构造器
可以有更多的对象创建方式,使用起来更加灵活方便
- this()重用其他构造器
this关键字还有第二个用法:this()重用其他构造器,简化构造器的代码
this()必须在构造器中使用,且必须写在构造器的第一行
public Student(String name) { this(18); this.name = name; } public Student(int age) { this.age = age; }
|
方法
方法的声明与调用
什么是方法
编写软件的时候会出现重复的计算过程,将这些冗余的计算过程封装成方法,在需要使用计算过程时候只需要调用方法就可以复用这个计算过程
方法核心思想是:复用
声明方法
方法用于封装一个特定的功能
通常以一系列的语句所组成,并完成一个动作/功能
定义方法的五个要素:修饰词\返回值类型\方法名\参数列表\方法体
public static int sum (int num1, int num2){
}
|
- 方法的调用
class Account { double balance; String log;
public Account() { this.balance = 1000.0; }
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)); } }
|
关于参数
方法参数是方法运算时候的依赖数据,可以将方法运算时候的可变参数通过方法参数传递到方法中
[案例]
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(); Scanner scanner = new Scanner(System.in); Random random = new 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)); } }
|
方法的重载
- 方法的签名
方法的签名包含:方法名和参数列表
一个类中,不可以有两个方法的签名完全相同
即一个类中,不可以有两个方法的方法名和参数列表都完全一样
- 什么是方法的重载
方法重载:在同一个类中,两个方法的方法名相同,参数列表不同**(参数的个数或者参数的类型有一个不同即可)**和返回值没有关系
public class Calculate {
public int sum(int num1,int num2){ return num1 + num2; }
public double sum(double num1,double num2){ return num1 + num2; }
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对象内存管理
对象内存管理
- Java内存管理规则
编译好的Java程序需要运行在JVM中
JVM内存分为三个大区域:”方法区\ 栈\堆”
堆内存
栈
方法区