> 技术文档 > Java零基础学习Day07——面向对象编程

Java零基础学习Day07——面向对象编程


一.设计对象

1.类和对象(先设计类才有对象)

1)如何定义类

public class 类名{    成员变量(属性,名词)    成员方法(行为,动词)            构造器     代码块    内部类}
public class phone { //属性 String brand; String model; double price; //行为 public void call(){System.out.println(\"手机在打电话...\");} public void text(){System.out.println(\"手机在发消息...\");} public void playGame(){System.out.println(\"手机在玩游戏...\");}}

2)如何得到类的对象

public class phoneTest { public static void main(String[] args) { //创建手机的对象 phone p = new phone(); //赋值 p.brand = \"华为\"; p.model = \"Mate 40\"; p.price = 4999.99; //获取属性值 System.out.println(\"手机品牌:\"+p.brand); System.out.println(\"手机型号:\"+p.model); System.out.println(\"手机价格:\"+p.price); //调用方法 p.call(); p.text(); p.playGame(); }}

3)类和对象的详细解释

  • 对象在计算机中可以看作一张表,用于存储数据,实际上是堆内存中的区域,通过new操作符,我们可以在堆中创建对象
  • 对象在栈中通过引用进行管理,引向堆中的对象
  • 类是对象的模板,定义了对象的属性和方法
  • 类的本质:就是描述某类事物的“共同模板”,里面写了这类事物有什么特征,能做什么事,但它肯定不是具体的东西
  • 通过创建类和对象,我们可以实现对数据的存储和处理

2.类的通俗解释

拿手机生产来举例,类可以看作是手机的设计图

  • 特征(对应类的 “成员变量”):屏幕尺寸、颜色、内存大小、电池容量(这些是所有手机都有的属性);
  • 功能(对应类的 “方法”):打电话、拍照、联网(这些是所有手机都能做的事)。
// 这就是一个Student类(学生的“设计图”)class Student { // 特征:名字、年龄(成员变量) String name; int age; // 功能:学习(方法) void study() { System.out.println(name + \"在学习\"); }}

3.类的补充注意事项

  • 有main方法的称为测试类,没有的称为Javabean类
  • 定义类时,首字母大写,有意义,驼峰模式
  • 一个Java文件可定义多个class类,但只能有一个类是public修饰,且该类名必须是代码文件名
  • 实际开发中建议:一个文件定义一个class类
  • 成员变量完整格式:修饰符数据类型变量名称 = 初始化值
  • 实际使用场景:登录界面,考试系统网页等,多个类里的属性行为

二.封装

1.对封装的简单解释

面向对象的三大特征:封装,继承,多态

封装即对象代表什么,就得封装对应的数据,并提供数据对应的行为

2.private(隐私)关键字

权限修饰符,可修改成员变量和方法,被private修改过的成员只能在本类中访问

将上述的代码例子中的price和prvate修改处理

3.set和get方法

存储用set,取用get

public class phone { //属性 private java.lang.String brand; java.lang.String model; private double price; //针对private的成员变量,提供getter和setter方法 public double getPrice(){ return price; } public void setPrice(double p){ if(price>0){ price = p; } else{ System.out.println(\"价格不能为负数\"); } } //对brand进行private处理,提供getter和setter方法 public java.lang.String getBrand(){ return brand; } public void setBrand(java.lang.String b){ brand = b; } //行为 public void call(){System.out.println(\"手机在打电话...\");} public void text(){System.out.println(\"手机在发消息...\");} public void playGame(){System.out.println(\"手机在玩游戏...\");}}
import java.lang.String;public class phoneTest { public static void main(String[] args) { //创建手机的对象 phone p = new phone(); //赋值 //p.brand = \"华为\"; p.setBrand(\"华为\"); p.model = \"Mate 40\"; //p.price = 4999.99; p.setPrice(-4999.99); //获取属性值 //System.out.println(\"手机品牌:\"+p.brand); System.out.println(\"手机品牌:\"+p.getBrand()); System.out.println(\"手机型号:\"+p.model); //System.out.println(\"手机价格:\"+p.price); System.out.println(\"手机价格:\"+p.getPrice()); //调用方法 p.call(); p.text(); p.playGame(); }}

三.this关键字

  • this关键字的作用:区别成员变量和局部变量,当变量重名时,使用this指定访问对象的变量
  • 本质:所在方法调用者的地址值
  • 成员变量(方法外的)和局部变量(方法内的),就近原则进行赋值
  • 成员变量:类中方法外的变量
  • 局部变量:方法中的变量
  • 两者区别:类中位置不同,初始化不同,内存位置不同,生命周期不同,作用域不同
public class phone { //属性 private java.lang.String brand; java.lang.String model; private double price; //针对private的成员变量,提供getter和setter方法 public double getPrice(){ return price; } public void setPrice(double price){ if(price>0){ //局部变量表示测试类中调用方法时传入的实参 //成员变量表示类中定义的属性 //this表示当前对象 //this.price表示当前对象的属性 this.price = price; } else{ System.out.println(\"价格不能为负数\"); } } //对brand进行private处理,提供getter和setter方法 public java.lang.String getBrand(){ return brand; } public void setBrand(java.lang.String brand){ this.brand = brand; } //行为 public void call(){System.out.println(\"手机在打电话...\");} public void text(){System.out.println(\"手机在发消息...\");} public void playGame(){System.out.println(\"手机在玩游戏...\");}}

四.构造器

1.含义

  • 定义:没有自行定义构造器时,系统会自动默认给空参构造
  • 本质:根据 “类(设计图)” 生产具体对象的工具,而且生产时还能顺便给对象的 “特征” 赋初始值(比如生产手机时直接装好系统、调好颜色)。
  • 作用:创建对象时,由虚拟机调用,给成员变量进行初始化,简化代码
  • 重载:有参和无参的方法名相同时,参数不同
// new Student() 就是调用无参构造器(生产线启动),造一个具体的学生对象Student zhangsan = new Student(); // 此时对象的属性是默认值:zhangsan.name = null,zhangsan.age = 0// 之后需要手动给属性赋值:zhangsan.name = \"张三\";zhangsan.age = 18;
class Student { String name; int age; // 这就是有参构造器(括号里的参数是“定制需求”) Student(String studentName, int studentAge) { name = studentName; // 生产时直接把“定制名字”赋给对象 age = studentAge; // 生产时直接把“定制年龄”赋给对象 } void study() { System.out.println(name + \"在学习\"); }}

2.注意事项

写了有参必须写上无参,不然会报错,最好是有参和无参都写上去

名字必须和 “类名” 完全一样(比如Student类的构造器就叫Student);

没有返回值(不像普通方法有int、void这些,因为它的作用是 “造对象”,不是 “返回数据”)。

五.JavaBean(实体类,是一种特殊类)

1.要求

  • 类名:见名知意
  • 成员变量:用private全部私有化
  • 成员方法:提供public每个成员变量的setter和getter方法,可以用快捷键全部生成
  • 构造方法:无参构造器必写,有参构造器可选择性写
  • 本质:一个用来保存数据的java类,可以用它来创建对象,保存某个事物的数据

2.例子:用户的注册页面

public class User { // 属性 private java.lang.String name; private java.lang.String password; private java.lang.String email; private java.lang.String gender; private int age; public User() { } public User(String name, String password, String email, String gender, int age) { this.name = name; this.password = password; this.email = email; this.gender = gender; this.age = age; } //get和set //快捷键 alt+insert alt+Fn+insert public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getName() { return name; } public void setName(java.lang.String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}

3.快捷键的使用

alt+insert alt+Fn+insert

按快捷键,选中Constructor

选底部的select none生成空参构造

ctrl+A全选点击ok生成带参构造

选择getter and setter

按住shift向下拉全选然后点击ok

4.JavaBean实际应用场景

实体类的对象只负责数据存取,而对数据的业务处理交给其他类的对象来完成,以实现数据和数据业务处理相分离

实体类的对象只负责数据的存取

数据的业务处理会交给一个单独的操作对象

这是软件开发中的重要思想:分层

六.Static

1.含义

叫做静态(没有实际含义),可以修饰成员变量和成员方法

成员变量按照有无static修饰,可以分为两种:

静态变量(类变量):有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享

                                  类名.静态变量(推荐)

                                  对象名.静态变量(不推荐)

实例变量(对象的变量:无static修饰,属于每个对象的

                                        对象.实例变量

2.规范

如果这个方法只是为了一个功能且不需要直接访问对象的数据,这个方法直接定义成静态方法;

如果这个方法是对象的行为,需要访问对象的数据,这个方法必须定义成实例方法

public class Student{ //静态变量 static String name; //实例变量(对象的变量) //实例就是对象的意思 int age;}

3.静态变量的应用场景

如果某个数据只需要一份,且希望能被共享(访问,修改),则该数据可以定义成静态变量来记住

注:访问自己类中的类变量,可以省略类名不写,但是在某个类中访问其他类里的类变量,必须带类名访问

注:工具类没有创建对象的需求,建议将工具类的构造器进行私有 ,别人就只能拿类名去调用

4.Static的注意事项

  • 静态方法中可以直接访问静态成员(变量,方法),不可以直接访问实例成员
  • 实例方法中既可以直接访问静态成员,也可以直接访问实例成员
  • 实例方法中可以出现this关键字,静态方法中不可以出现this关键字

七.对象内存图

栈,堆,方法区,本地方法栈,寄存器

栈:方法运行时所进入的内存,变量

 堆:new出来的东西在这块内存开辟并产生地址值

方法区:字节码文件加载时进入的内存

进完内存之后要出去

1.一个对象的内存图

2.两个对象的内存图