Java学习笔记===》5.面向对象

本文介绍了面向对象编程的基础概念,包括类和对象的设计,如何通过定义类获取对象,并通过成员变量和成员方法来使用对象。文章强调了封装的重要性,展示了如何使用private关键字保护成员变量,并提供getter和setter方法。此外,还讨论了构造方法的作用和执行时机,以及this关键字的使用情况。最后,文章提到了对象的内存表示和成员变量与局部变量的区别。
摘要由CSDN通过智能技术生成

面向对象:

为什么要面向对象编程

因为面向对象更符合人类的思维逻辑

一、面向对象学什么?

1.学习获取已有对象并使用

2.学习如何让自己设计对象并使用=====》涉及语法

二、设计对象并使用

1.(1)类和对象

①类(设计图):是对象共同特征的描述

②对象:是真实存在的具体的东西

在Java中,必须先设计类,才能获取对象

(2).如何定义类
public class 类名{
    1.成员变量(代表属性,一般是名词)
    2.成员方法(代表行为,一般是动词)
    3.构造器
    4.代码块
    5.内部类
}
(3).如何得到类的对象

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

Phone p = new Phone;

​ public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)

(4).如何让使用对象

访问属性:对象名.成员变量

访问行为:对象名.方法名(…)

package com.test03_mianxiangduixiang;

public class Demo01_Phone {
    //   //属性
    String brand;
    double price;
    //行为
    public void  call(){
        System.out.println("手机在打电话");
    }
    public void  playGame(){
        System.out.println("手机在玩游戏");
    }
}
package com.test03_mianxiangduixiang;

public class Demo01_Phonetest {
    public static void main(String[] args) {
        //创建手机对象
        Demo01_Phone p = new Demo01_Phone();

        //给手机赋值
        p.brand = "小米";
        p.price = 1999.98;

        //获取手机对象中的值
        System.out.println(p.brand);
        System.out.println(p.price);

        //调用手机中的方法
        p.call();
        p.playGame();


        //给手机赋值
        p.brand = "苹果";
        p.price = 8999.99;

        //获取手机对象中的值
        System.out.println(p.brand);
        System.out.println(p.price);

        //调用手机中的方法
        p.call();
        p.playGame();

    }
}
(5)拿到对象后能干什么?

​ 对象.成员变量;

​ 对象.成员方法(…)

2.类的补充注意事项

★用来描述一类事物的类,专业叫做:JavaBean类

在JavaBean类中,是不写main方法的

★在以前,比爱那些main方法的类,叫做测试类

我们可以在测试类中创建JavaBean类的对象并进行赋值调用

★定义类的补充注意事项:

​ ①类名首字母建议大写,需要见名知意,驼峰模式命名

​ ②一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名

​ 实际开发中建议一个文件定义一个类

​ ③成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;

​ 一般无需指定初始化值,存在默认值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIvqeiIC-1685092029643)(E:\java笔记\笔记图片\对象成员变量的默认规则.png)]

举例:

package com.test03_mianxiangduixiang;
    //创建一个女朋友对象
public class Demo02_Girlfriend {
        //属性
        String name ;
        int age;
        String gender;

        //行为
        public void drink(){
            System.out.println("女朋友在喝水");
        }
        public void  eat(){
            System.out.println("女朋友在吃饭");
        }

}
package com.test03_mianxiangduixiang;

public class Demo02_GirlFriendTest {
    public static void main(String[] args) {
        //创建女朋友对象
        Demo02_Girlfriend gf1 = new Demo02_Girlfriend();
        gf1.name = "诗诗";
        gf1.age = 18;
        gf1.gender = "萝莉";


        System.out.println(gf1.name);
        System.out.println(gf1.age);
        System.out.println(gf1.gender);

        gf1.drink();
        gf1.eat();

        System.out.println("=======================");
        Demo02_Girlfriend gf2 = new Demo02_Girlfriend();
        gf2.name = "甜甜";
        gf2.age = 18;
        gf2.gender = "御姐";


        System.out.println(gf2.name);
        System.out.println(gf2.age);
        System.out.println(gf2.gender);

        gf1.drink();
        gf1.eat();
    }
}

(1)定义类有哪些建议,有什么需要注意的?

★类名首字母建议大写、英文、有意义,满足驼峰模式,不能用关键字,满足标志符规定

★一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名

​ 实际开发中建议一个文件定义一个类

(2)成员变量的的格式是什么样的,有什么特点?

★成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值

★一般无需指定初始化值,存在默认值

3.开发中的设计

★名词提炼法:提炼用到的名词作为属性和行为(方法)

三、封装

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

1、封装:

告诉我们,如何正确设计对象的属性和方法

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

2.封装的好处

★自己会正确的设计对象

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

让编程变得简单,有什么事,找对象,调方法就行

降低我们的学习成本,可以少学,少记,不用记对象有哪些方法,有需要时去找就行

3.private关键字

①是一个关键字,是一个权限修饰符

②可以修饰成员(成员变量和成员方法)

③被private修饰的成员只能在本类中访问

④针对private修饰的成员变量,如果需要被其他类引用,提供相应的操作

⑤提供 setXxx(参数) 方法,用于成员变量赋值,方法用public修饰

⑥提供 getXxx(参数) 方法,用于获取成员变量的值,方法用public修饰

package test;

public class GirlFriend {
	//属性
	private String name;
	private int age;
	private String gender;
//针对于每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
//作用:给成员变量name进行赋值
public void setName (String n) {
	name = n;
}
//作用:对外提供name属性
public String getName() {
	return name;
}

//作用:给成员变量age进行赋值
	public void setAge (int a) {
		if(age >= 18 && age <= 50) {
			age = a;
		}else {
			System.out.println("数据不合法");
		}
	}
	//作用:对外提供name属性
	public int getAge() {
		return age;
	}
	
	//作用:给成员变量name进行赋值
	public void setGender (String s) {
		gender = "萌妹子";
	}
	//作用:对外提供name属性
	public String getGander() {
		return gender;
	}
	//行为
    public void sleep() {
        System.out.println("女朋友在睡觉");
    }
    public void eat() {
        System.out.println("女朋友在吃饭");
    }
   }

	package test;

public class GirlFriendTest {
	public static void main(String[]args) {
		//创建女朋友的对象
		GirlFriend gf1 = new GirlFriend();
		//赋值
		gf1.setName("小诗诗");
		gf1.setAge(20);
		gf1.setGender("女");
	String name= gf1.getName();
	int age = gf1.getAge();
	String gender = gf1.getGander();
	
	System.out.println(gf1.getName());
	System.out.println(gf1.getAge());
	System.out.println(gf1.getGander());
	
	gf1.eat();
	gf1.sleep();
} 
}

四、this关键字

1.成员变量:

​ 定义在方法外面、类的里面的变量称为局部变量

2.局部变量:

​ 定义在方法里面的变量称为局部变量

3.就近原则

​ 要使用的变量距离那个定义的变量越近,就使用哪个(近水楼台先得月)

当成员变量和局部变量重名时,就需要用到this关键字

package com.test03_mianxiangduixiang;

public class Demo06_this {
    private int age;
    
    public void method(){
        int age  = 10;
        
        
        System.out.println(age); //就近原则,获取局部变量的值10
        
        System.out.println(this.age);//获取成员变量的值0
        
    }
}

五、构造方法

1.构造方法概述:

构造方法也叫做构造器、构造函数

作用:在创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的

2.构造方法的格式
public class Student{
    修饰符 类名(参数){
        方法体;
    }
}

★特点:

①方法名与类名相同,大小写也要一致

②没有返回值类型,连void也没有

③没有具体的返回值,(不能由return待会结果数据)

★构造方法分类:

①无参构造方法:在初始化的对象的时,成员变量的数据均采用默认值

②有参构造方法:在初始化对象的时候,同时可以为对象进行赋值

public class Student{
    private String name;
    private int age;
    
    punlic Stufent(){
        ...      //空参构造方法,默认初始化值
    }
    
    public Student(String name,int age){
        ...       //带全部参数构造方法
    }       
}

★执行时机:

①创建对象的时候由虚拟机调用,不能手动调用构造方法

②每创建一次对象,就会调用一次构造方法

3.构造方法注意事项
①构造方法的定义

★如果没有定义构造方法,系统将给出一个默认的无参数构造方法

★如果定义了构造方法,系统将不在提供默认的构造方法

②构造方法的重载

★带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这就叫方法的重载

③推荐的使用方式

★无论是否适用,都手动书写无参数构造方法和带全部参数构造方法

六、标准JavaBean

1.类名需要见名知意,驼峰命名
2.成员变量使用private修饰
3.提供至少两个方法

①无参构造方法

②带全部参数的构造方法

4.成员方法

①提供每一个成员变量对应的setXxx/getXxx

​ ②如果有其他行为也需要写

package com.test06JavaBean;

public class User {
    //属性
    private String username;
    private String password;
    private String email;
    private String gender;
    private int age;

      //ptg插件一键生成
    


    //快捷键生成
    //空参和带参快捷键
    public User(String username, String password, String email, String gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }

    public User() {
    }
    //set和get方法生成
    //alt+I====》getter and setter

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "User{username = " + username + ", password = " + password + ", email = " + email + ", gender = " + gender + ", age = " + age + "}";
    }
}






    //空参构造方法
    public  User(){}

    //带全部参数的构造方法
    public User(String username,String password,String email,String gender,int age){
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;

    }

    //set 和 get 方法
    public void setUsername(String username){
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
        public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getGender() {
        return gender;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

七、对象内存图

1.一个对象的内存图、

Student s = new Student( );

①加载class文件

②申明局部变量

③在堆内存中开辟一个空间

④默认初始化

⑤显式初始化

⑥构造方法初始化

⑦将堆内存中的地址值赋给左边的局部变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjhi0naa-1685092029645)(E:\java笔记\笔记图片\一个对象的内存图.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exPLD3S1-1685092029645)(E:\java笔记\笔记图片\一个对象内存图2.png)]

2.多个对象的内存图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wq9X9cV-1685092029646)(E:\java笔记\笔记图片\多个对象的内存图.png)]

3.两个变量指向同一个对象内存图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvpc2BUH-1685092029647)(E:\java笔记\笔记图片\两个引用指向一个对象.png)]

4.基本数据类型和引用数据类型的区别
(1)从内存的角度去解释:

**基本数据类型:**数据是存储在自己的空间中,

​ 特点:赋值给其他变量,也是赋的真实的值

​ int a = 10;

​ int b = a;

**引用数据类型:**数据值是存储在其他空间暗中,自己空间中存储的是地址值。

​ 特点:赋值给其他变量,赋的是地址值

Student s1 =  new Student  ();

​ Student s2 = s1;

5.this的内存原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7JdLfy1-1685092029647)(E:\java笔记\笔记图片\this的内存原理.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58aR83bW-1685092029648)(E:\java笔记\笔记图片\this的内存原理2.png)]

八、成员变量、局部变量区别

成员变量:类中方法外的变量

局部变量:方法中的变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfcLYXbg-1685092029649)(E:\java笔记\笔记图片\成员变量和局部变量的区别.png)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值