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

1.面向对象编程

1.1 类与对象

1.类与对象的概念

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

​ *语法

java 复制代码
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.属性如果不赋值,有默认值,规则和数组一致

java 复制代码
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 成员方法

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

java 复制代码
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.成员方法的定义

​ *语法:

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

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

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

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

4.return语句不是必须的

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

*访问修饰符

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

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

*返回类型

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

java 复制代码
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.实参和形参的类型要一致或兼容、个数、顺序必须一致

*方法体

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

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

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

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

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

java 复制代码
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.引用数据类型的传参机制,适用于数组和自定义数据类型。

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

java 复制代码
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);
}
java 复制代码
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);
}
相关推荐
努力变厉害的小超超1 小时前
ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染
笔记·鸿蒙
秃头佛爷1 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
阿伟*rui1 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7896 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot