类和对象

来自拉钩教育-JAVA就业集训营

面向对象编程的概念

  • 万物皆对象。
  • 面向对象指以属性和行为的观点去分析现实生活中事务。
  • 面向对象编程指先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程。
  • 面向对象编程是软件产业化发展的需求。
  • 理解面向对象的思想精髓(分装、继承、多态),至少掌握一种编程语言。

类和对象的概念

  • 对象主要指现实生活中客观存在的实体,在Java语言中对象体现为内存空间中的一块存储区域。
  • 类简单来就是“分类”,是对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中体现为一种引用数据类型,里面包含了描述特征/属性的成员变量以及描述行为的成员方法。
  • 类时用于构建对象的模板,对象的数据结构由定义它的类来决定。

类的定义

    // class 类名 {
    //  类体;
    // }
    class Person {
        
    }
  • 注意:

通常情况下,当类名由多个单次组成时,要求每个单次首字母都要大写。

成员变量的定义

  • 语法:
    class 类名 {
        数据类型 成员变量名 = 初始值;
    }
  • 例子:
    class PerSon {
        String name;
    }
  • 注意:

当成员变量由多个单词组成时,通常要求从第二个单词起每个单词的首字母大写。

对象的创建

  • 语法:
    new 类名();
  • 列子:
    new person();
  • 注意:

a.当一个类定义完毕后,可以使用new关键字来创建该类的对象,这个过程叫做类的实例化。
b.创建对象的本质就是在内存空间的堆区申请一块存储区域,用于存放该对象独有特征信息。
创建出来的对象,但是又没有名字的对象叫做匿名对象。

引用的定义

  • 基本概念:

a.使用引用数据类型定义的变量叫做引用类型变量,简称为“引用”。
b.引用变量主要用于记录对象在堆区中的内存地址信息,便于下次访问。

  • 语法格式

类名 引用变量名;
引用变量名.成员变量名;

  • 列子:
    Person p = new Persion();
    p.name = "张飞";
    System.out.println(p.name);

案列题目

  • 编程实现Person类的定义和使用
/*
    编程实现Person类的定义
*/
public class Person {
    
    // 数据类型 成员变量名 = 初始值;  - 其中 = 初始值,通常都省略不写
    String name; // 用于描述姓名的成员变量
    int age; // 用于描述年龄的成员变量
    
    public static void main(String[] args) {
        
        // 1.声明Person类型的引用执行Person类型的对象
        // 数据类型(类名) 引用变量名 = new 类名();
        Person p = new Person();
        
        // 2.打印对象中的成员变量值
        // 引用变量名.成员变量名
        System.out.println("我是" + p.name + ", 今年" + p.age + "岁了"); // null 0
        
        System.out.println("-------------------------------------------");
        
        // 3.修改成员变量的数值
        p.name = "zhangfei";
        p.age = 30;
        // 4.再次打印修改后的数值
        System.out.println("我是" + p.name + ", 今年" + p.age + "岁了"); // zhangfei 30
        
    }
}
  • 运行效果:


  • 执行流程和内存分析


成员变量的初始值

案例题目

编程实现Point类的定义,特征有:横纵坐标(整数),要求在main方法中声明Point类型的引用指向Point对象并打印特征,然后将横纵坐标修改为3和5再次打印。

/*
    编程实现Point类的定义
*/
public class Point {
    
    int x; // 用于描述横坐标的成员变量
    int y; // 用于描述纵坐标的成员变量
    
    public static void main(String[] args) {
        
        // 1.声明Point类型的引用指向Point类型的对象
        Point p = new Point();
        // 打印成员变量的数值
        System.out.println("横坐标:" + p.x + ",纵坐标:" + p.y); // 0 0
        
        System.out.println("-------------------------------------");
        
        // 2.将横纵坐标修改为3和5后再次打印
        p.x = 3;
        p.y = 5;
        System.out.println("横坐标:" + p.x + ",纵坐标:" + p.y); // 3  
    }
}

成员方法的定义

  • 语法:
class 类名 {
    返回值类型 成员方法名(形参列表) {
        成员方法体;
    }
}
  • 列子:
class Person {
    void show(){
        System.out.println("没事秀一下");
    }
}

当成员方法名有多个单次组成时,要求从第二个单词起每个单词的首字母大写。

返回值类型

  • 返回值主要指从方法体内返回到方法体外的数据内容。
  • 返回值类型主要指返回值的数据类型,可以是基本数据类型,也可以是引用数据类型。
  • 当返回的数据内容是66时,则返回值类型写int即可。
  • 在方法体中使用return关键字可以返回具体的数据内容并结束当前方法。
  • 当返回的数据内容是66时,则方法体中写return 66; 即可。
  • 当该方法不需要返回任何数据内容时,则返回值类型写void即可。

形参类表

  • 形式参数主要用于将方法体外的数据内容带入到方法体内部。
  • 形式参数列表主要指多个形式参数组成的列表,语法个数如下:

数据类型 形参变量名1, 数据类型 形参变量名2, ……

  • 当带入的数据内容是"hello"时,则形参列表写String s 即可
  • 当带入的数据内容是66和"hello"时,则形参列表写 int i, String s 即可
  • 若该方法不需要带入任何数据内容时,则形参列表位置啥也不写即可。

方法体的详解

  • 成员方法体主要用于编写描述该方法功能的语句块。
  • 成员方法可以实现代码的重用,简化代码。
/*
    编程实现Person类的定义
*/
public class Person {
    
    // 数据类型 成员变量名 = 初始值;  - 其中 = 初始值,通常都省略不写
    String name; // 用于描述姓名的成员变量
    int age; // 用于描述年龄的成员变量
    
    // 自定义成员方法实现所有成员变量的打印
    // 返回值类型 方法名称(形参列表) { 方法体; }
    void show() {
        // 成员变量和成员方法都属于类内部的成员,因此可以直接访问成员变量不需要在加引用.的前缀
        System.out.println("我是" + name + ", 今年" + age + "岁了");
    }
}

方法的调用

  • 引用变量名.成员方法名(实参列表);
  • 实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数、类型以及顺序都要完全一致
  • 实际参数可以传递直接量、变量、表达式、方法的调用等。
/*
    编程实现Point类的定义
*/
public class Point {
    
    int x; // 用于描述横坐标的成员变量
    int y; // 用于描述纵坐标的成员变量
    
    // 自定义成员方法实现成员变量数值的打印
    void show() {
        System.out.println("横坐标:" + x + ",纵坐标:" + y);
    }
    
    public static void main(String[] args) {
        // 1.声明Point类型的引用指向Point类型的对象
        Point p = new Point();
        // 打印成员变量的数值
        // System.out.println("横坐标:" + p.x + ",纵坐标:" + p.y); // 0 0
        // 方法调用
        p.show();
        
        System.out.println("-------------------------------------");
        
        // 2.将横纵坐标修改为3和5后再次打印
        p.x = 3;
        p.y = 5;
        // System.out.println("横坐标:" + p.x + ",纵坐标:" + p.y); // 3 5 
        p.show();
    }
}

可变长参数

  • 返回值类型 方法名(参数的类型... 参数名)
  • 方法参数部分指定类型的参数个数是可以改变的,也就是0~n个。
  • 一个方法的形参列表中最多只能声明一个可变形参,并且需要参数列表的末尾。

方法的传参过程

int max(int ia, int ib){
    …… …… ……
}
int a = 5;
int b = 6;
int res = m.max(a,b);
  1. 为main方法中的变量a、b、res分配空间并初始化。


  1. 调用max方法,为max方法的形参变量ia、ib分配空间。


  1. 将实参变量的数值赋值到形参变量的内存空间中。


  1. max方法运行完毕后返回,形参变量空间释放。


  1. main方法中的res变量得到max方法的返回值。


  2. main方法结束后释放相关变量的内存空间。

参数传递的注意事项

  • 基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间;
  • 引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间。
  • 当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后在改变指定的内容,则通常不会影响到实参变量执行内容的改变,因为两个变量指向不同的内存空间。
/*
    编程实现参数传递的测试
*/
public class ArgumentTest {
    
    // 自定义成员方法打印参数传入的整数数据
    // int ia = ib = 10
    void show1(int ia) {
        ia = 200;
        System.out.println("show方法中:ia = " + ia);
    }
    
    // 自定义成员方法打印参数传入的数组内容
    void show2(int[] arr1) {
        arr1 = new int[2]; // 加上该行代码后,相当于在堆区中又重新申请一块内存空间
        arr1[0] = 200;
        System.out.println("show方法中:arr[0] = " + arr1[0]);
    }
    
    public static void main(String[] args) {
        
        // 1.声明ArgumentTest类型的引用指向该类型的对象
        ArgumentTest at = new ArgumentTest();
        // 2.使用引用变量调用show1方法进行测试
        int ib = 10;
        at.show1(ib);
        System.out.println("main方法中:ib = " + ib);
        
        System.out.println("----------------------------");
        
        // 3.调用show2方法进行测试
        int[] arr2 = new int[]{10, 20};
        at.show2(arr2);
        System.out.println("main方法中:arr[0] = " + arr2[0]);
    }
}

内存结构之栈区

  • 栈用于存放程序运行过程当中所有的局部变量。一个运行的java程序从开始到结束会有多次方法的调用。
  • JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
  • 当某一个方法调用完成后,其对应的栈帧将被清除。

传参的相关概念

  • 参数分为形参和实参,定义方法时的参数叫形参,调用方法时传递的参数叫做实参。
  • 调用方法时采用值传递把实参传递给形参,方法内部其实是在使用形参。
  • 所谓值传递就是当参数是基本类型时,传递参数的值,比如传递i=10,真实传参时,把10复制给了形参。当参数是对象时,传递的是对象的值,也就是把对象的地址赋值给形参。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容