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.两个对象的内存图




