JAVA学习笔记19(面向对象编程)

本文详细介绍了面向对象编程中的类与对象概念,包括它们的定义、内存存在形式、属性的定义和访问、对象创建、属性访问以及类与对象的内存分配机制。此外,还涵盖了成员方法的定义、调用机制及其注意事项。
摘要由CSDN通过智能技术生成

1.面向对象编程

1.1 类与对象

1.类与对象的概念

​ *对象[属性]/[行为]

​ *语法

class cat
{
	String name;
    int age;
}

main()
{
    //cat1就是一个对象
    //创建一只猫
	Cat cat1 = new Cat();
    
    //给猫的属性赋值
    cat1.name = "123";
    cat1.age = 10;
}

​ *类是抽象的,概念的,代表一类事物,比如人类,猫类…即它是数据类型

​ *对象是具体的,实际的,代表一个具体事物,即是实例

​ *类是对象的模板,对象是类的一个个体

2.类与对象在内存中的存在形式

在这里插入图片描述

3.属性概念

​ *成员变量 = 属性 = field(字段)

​ *属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组)

4.属性注意事项和细节

1.属性的定义语法同变量

eg:访问修饰符 属性类型 属性名;

​ *访问修饰符:控制属性的访问范围

​ public,protected,默认,private

2.属性的定义类型可以为任意类型,包含基本类型或引用类型

3.属性如果不赋值,有默认值,规则和数组一致

Person p1 = new Person();
//p1是对象名(对象引用)
//new Person() 创建的对象空间(数据)才是真正的对象

5.如何创建对象

1.先声明再创建

​ Cat cat; //声明对象cat

​ cat = new Cat(); //创建
2.直接创建

​ Cat cat = new Cat();

6.如何访问属性

​ *语法:

对象名.属性名;

eg:

cat.name;

cat.age;

7.类与对象的内存分配机制

在这里插入图片描述

​ *类与对象赋值直接赋值地址

8.Java内存的结构分析

1.栈:一般存放基本数据类型(局部变量)

2.堆:存放对象(Cat cat ,数组等)

3.方法区:常量池(常量,比如字符串),类加载信息

1.2 成员方法

​ *在某些情况下,我们需要定义成员方法(简称方法),比如人类,除了有一些属性外(年龄,姓名…),还有一些行为比如:说话,跑步…

class Person
{
	String name;
    int age;
    //添加speak成员方法
    //1.public 表示方法是公开
    //2.void 表示方法没有返回值
    //3.speak() speak是方法名,()形参列表
    //4.{}方法体,可以写我们要执行的代码
    public void speak()
    {
		System.out.println("我是一个好人");
    }
    
    //(int n)形参列表
    public void cal02(int n)
    {
        int res =0;
        for(int i =1;i<=n;i++)
        {
            res += i;
        }
        System.out.println("cal02计算结果为:" + res);
    }
}

main()
{
	Person p1 = new Person();
    p1.speak();	//调用方法
}

1.方法的调用机制

在这里插入图片描述

2.成员方法的好处

​ *提高代码的复用性(可以不用重复写方法)

​ *可以将实现的细节封装起来,然后供其他用户来调用即可

3.成员方法的定义

​ *语法:

public(访问修饰符 ) 返回数据类型 方法名 (形参列表)
{
    方法语句;
    return 返回值;
}

1.形参列表:表示成员方法输入cal(int n),getSum(int num1, int num2)

2.返回数据类型:表示成员方法输出,如果为void,表示没有返回值

3.方法主体:表示为了实现某一功能代码块

4.return语句不是必须的

4.成员方法的注意事项和细节

*访问修饰符

(作用是控制 方法使用的范围)

​ 如果不写默认访问,[有四种:public, protected,默认, private]

*返回类型

1.一个方法最多有一个返回值(可以返回数组得到多个值)

class AA
{
    public int[] getSumAndSub(int n1, int n2)
    {
		int[] resArr = new int[2];
        resArr[0] = n1 + n2;
        resArr[1] = n1 - n2;
        return resArr;
    }
}

2.返回类型可以为任意类型,包含基本类型和引用类型(数组,对象)

3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return 值,而且要求返回值类型必须和return的值类型一致或者兼容

4.如果返回值为void,则方法中可以没有return,或者只写return

*形参列表

1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1, int n2);

2.参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int[] map);

3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数

4.实参和形参的类型要一致或兼容、个数、顺序必须一致

*方法体

​ *里面写完成功能的具体语句,方法之中不能再定义方法

class AA
{
    public void f4()
    {
        //public void f5(){};	//错误写法
    }
}
*方法调用细节

1.同一个类中的方法调用:直接调用即可

class A{
    public void print(intn)
    {
		System.out.println("方法调用 n="+ n);
    }
    
    public void sayOk()
    {
        //Sayok调用print
        print(10);
    }
}

2.跨类中的方法A类调用B类方法:需要通过对象名调用,比如对象名.方法名(参数); //在A类中创建B类,再调用方法

class A{
    public void print(intn)
    {
		System.out.println("方法调用 n="+ n);
    }
    
    public void sayOk()
    {
        //Sayok调用print
        print(10);
    }
    
    public void m1()
    {
        //创建B对象
        B b = new B();
        b.hi();
    }
}

class B{
    public void hi()
    {
		System.out.println("B类中的hi()被执行");
    }
}

3.跨类的方法调用和方法的访问修饰符相关

​ *方法传参的机制

1.基本数据类型,传递的是值拷贝,形参的任何改变不影响实参

2.引用数据类型的传参机制,适用于数组和自定义数据类型。

​ *引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参

class B{
    public void test100(int[] arr)
    {
        arr[0] = 200;	//修改元素
        //遍历数组
        System.out.println("test100的数组arr");
        for(int i =0;i<arr.length;i++)
        {
            System.out.print(arr[i]+"\t");
        }
    }
    
    public void test200(Person p)
    {
        p.age = 10000;
    }
}

class Person
{
	String name;
    int age;
}

main()
{
    B b = new B();
    int[] arr = {1,2,3};
    b.test100(arr);//调用方法
    System.out.println("main的arr数组");
    //遍历数组
    for(int i =0;i<arr.length; i++)
    {
        System.out.print(arr[i]+"\t");
    }
    System.out.println();
    
    Person p = new Person();
    p.name = "jack";
    p.age = 10;
    
    b.test200(p);	//传的是p的地址
    System.out.println(p.age);
}
class B{
    public void test200(Person p)
    {
        p = null;	//只是把形参p的名字指向了null,不影响实参p,因此外面输出的还是10
    }
}

class Person
{
	String name;
    int age;
}

main()
{
    B b = new B();
    
    Person p = new Person();
    p.name = "jack";
    p.age = 10;
    
    b.test200(p);	//传的是p的地址
    System.out.println(p.age);
}
  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值