01类与对象

发布于:2022-10-27 ⋅ 阅读:(275) ⋅ 点赞:(0)

全员关系总图:

 

1、类:是抽象的、概念的,代表一类事物,比如人类,狗类……即它是数据类型

(1)如何创建对象:

a)先声明后创建:

Cat cat;
cat=new Cat();

 b)直接创建

Cat cat=new Cat();

2、对象:对象是具体的、实际的,代表具体事物,即是实例

▲类和对象的内在分配机制:

(1)基本结构:

 (2)例题分析:

 

(3)具体实现流程:

①先加载Person类信息(属性和方法信息,只会加载一次)

②在堆中分配空间,进行默认初始化(看规则)

③把地址赋给a,a就指向对象

④进行指定初始化,比如a.name="小明",a.age=10

3、属性(成员变量/field(字段)):一般是数据类型,或引用类型(对象、数组)

(1)属性的定义:

a)属性的定义语法同变量(四种访问修饰符:public,proctected,默认,private)
b)属性的定义类型可以为任意类型,包含基本类型或引用类型
c)属性如果不赋值,有默认值,规则和数组一致

(2)如何访问属性:对象名.属性名

cat.name;
cat.age;

4、成员方法

(1)快速入门

//目的:创建不同功能的成员方法
package Project0101;
public class Method01 {
    public static void main(String[] args) {
        //方法使用
        //1、方法写好后,如果不去调用,就不会输出
        Person p1=new Person();//创建对象
        p1.speak();//调用成员方法,输出一句话
        p1.cal01();//调用cal01成员方法,计算从1+……+n的结果
        p1.cal02(5);//调用cal02成员方法接收一个数n,计算从1+……+n的结果,同时n=5
        //调用getSum成员方法,计算两个数的和
        //把方法getSum返回的值,赋给变量returnRes
        int returnRes=p1.getSum(10,20);
        System.out.println("getSum方法返回的值="+returnRes);
    }
}
class Person{
    String name;
    int age;
    //方法(成员方法)
    //添加speak成员方法,输出“我是好人”
    //1、public:表示方法是公开
    //2、void:表示方法没有返回值
    //3、speak():speak是方法名,()形参列表
    //4、{}方法体,可以写我们要执行的代码
    //5、System.out.println("我是好人");表示输出
    public void speak(){
        System.out.println("我是好人");
    }
    //cal01方法:计算1+……100的结果
    public void cal01(){
        int res=0;
        for(int i=1;i<=100;i++){
            res+=i;
        }//累加到n
        System.out.println("计算结果="+res);
    }
    //cal02方法:接收一个数n,计算1+……100的结果
    //(int n)形参列表,表示当前有一个形参n,可以接收用户输入
    public void cal02(int n){
        int res=0;
        for(int i=1;i<=n;i++){
            res+=i;
        }
        System.out.println("计算结果="+res);
    }
    //getSum方法:计算两个数之和
    public int getSum(int num1,int num2){
        int res=num1+num2;
        return res;
    }
}

 (2)成员方法的定义:

访问修饰符 返回数据类型 方法名(形参列表……){
    //方法体(完成具体功能的代码块)
    语句;
    return 返回值;
}
//访问修饰符(控制方法使用的范围,有四种):public,protected,默认(就是空着不写),private
//返回数据类型:
1、一个方法最多有一个返回值
2、返回类型可以为任意类型,包括基本类型和引用类型(数组,对象)
3、返回值类型必须和return的值类型一致或兼容
4、如果方法是void,则方法体中可以没有return语句,或者只写return
//方法名:
1、驼峰命名法,除了第一个单词的首字母小写外其余单词的首字母都大写
2、见名知意
//形参列表:
1、0个参数或多个参数,中间用逗号隔开
2、参数类型可以为任意类型
3、方法定义时的参数称为形式参数,简称形参;方法调用时的参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致
//方法体:
1、方法不能嵌套定义
//方法调用:
1、同一个类中的方法调用:直接调用——》方法名(参数);
2、跨类中的方法A类调用B类方法(注意访问修饰符):需要通过对象名调用——》对象名.方法名(参数);

(3)成员方法调用机制

 (4)成员方法传参机制:

package Project0101;
public class MethodParameter02 {
    public static void main(String[] args) {
        E b=new E();
        int[] arr={1,2,3};
        b.test100(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);
        System.out.println(p.age);
    }
    }
class Person_{
    String name;
    int age;
}
class E{
    public void test200(Person_ p){
        p.age=1000;//测试题1:修改对象属性,结果从10改变为1000
    }
    /*
    测试题2:结果是10
    public void test200(Person_ p){
        p=null;
    }
    */
    /*
    测试题3:结果还是10
    public void test200(Person_ p){
        p=new Person();
        p.name="tom";
        p.age=99;
    }
     */
    public void test100(int[] arr){
        arr[0]=200;//测试题4:改变方法里接收的数组,结果也改变
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }
    //测试题1和4结果改变的本质:main和方法都在栈区,都指向堆里同一个分区,只要其中一个人改变了分区里的东西,其余的人只能从分区里拿到改变后的东西
    //测试题2结果不变的本质:方法里的p指向null,而不指向堆里的分区了,自然就不改变里面的东西
    //测试题3结果不变的本质:方法里的p在堆里开辟了新的分区,然后返回main
    // 此时main里的老p仍然指向老分区,但是main输出用的是老p
}
//划重点:
//1、基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
//2、引用类型传递的是地址(传递的也是值,但是值是地址),可以通过形参影响实参

(5)成员方法的优点:

a)提高代码的复用性

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

5、克隆对象的例题

//目的:(1)编写一个打印二维数组的数据的方法(2)编写一个方法,功能:复制一个对象,返回复制的对象(两个是独立的对象,只是属性相同)
package Project0101;
public class MethodExercise03 {
    public static void main(String[] args) {
        Person03 p=new Person03();
        p.name="milan";
        p.age=100;
        MyTools03 tools=new MyTools03();
        Person03 p2=tools.copyPerson(p);
        //测试p和p2的属性是否相同
        System.out.println("p的属性age="+p.age+"名字="+p.name);
        System.out.println("p2的属性age="+p2.age+"名字="+p2.name);
        //测试p和p2是否为同一个对象
        System.out.println(p==p);//输出为true
        System.out.println(p==p2);//输出为false
    }
}
class Person03{
    String name;
    int age;

}
class MyTools03{
    //编写方法的思路
    //1、方法的返回类型Person
    //2、方法的名字copyPerson
    //3、方法的形参(Person03 p)
    //4、方法体,创建一个新对象,并复制属性,返回即可
    public Person03 copyPerson(Person03 p){
        //创建一个新的对象
        Person03 p2=new Person03();
        //复制属性
        p2.name=p.name;
        p2.age=p.age;
        return p2;
    }
}

注:在B站上听韩顺平老师的课整理的笔记

本文含有隐藏内容,请 开通VIP 后查看