【阿里云大学】Java面向对象编程笔记(更新中)

  • 之前在阿里云大学公开课上学了一些Java面向对象编程,决定把笔记和代码更新下
  • 本文从面向对象编程开始记录(ps.阿里云老师讲的很有趣 = w =),阿里云大学Java网课网址链接

第一章 类与对象

课时2:面向对象简介

面向过程 面向对象
面对一个问题的解决方案更多情况是面对一个问题的解决方案 模块化设计,可以重用配置

面向对象有三个主要特性:

  • 封装性:内部操作对外部不可见,当内部的操作都不可直接在外部使用时才是安全的;
  • 继承性:在已有结构的基础上继续进行功能的扩充;比如手机是围绕其通话功能进行扩充的。
  • 多态性:在继承性基础上扩充的概念,指的是类型的转化处理

面向对象开发的步骤:(由生活场景进行程序分析最好)

  • OOA:面向对象分析
  • OOD:面向对象设计
  • OOP:面向对象编程

课时3:类与对象简介

  • 区别每个事物的不同是根据其属性,每一个属性的集合构建出一个群体,这个抽象群体就是类;
  • 抽象群体的一个实际群体,就是类的实例化对象。
对象
某一类事物的抽象概念 具体的产物
一个模板 可以使用的模板实例

类中一般有两个组成:

  • 成员属性:比如一个人(事物)的年龄姓名(属性)
  • 操作方法:定义对象处理的行为,比如(事物)会唱、跳、rap(行为)

课时4:类与对象定义

Java中类是一个独立的结构体,所以需要用class来定义

public class Person {
    String name;//姓名属性
    int age;//年龄属性
    void tell() {//tell行为
        System.out.println("name" + name + "age" + age);
    }
}

有了类,如果需要产生对象:

  • 声明并实例化对象:类名称 对象名称 = new 类名称(属性参数)
  • 分步骤完成:
    声明对象:类名称 对象名称 = null;
    实例化对象:对象名称 = new 类名称();

有了对象需要调用对象:

  • 调用属性:实例化对象.对象属性;
  • 调用方法行为:实例化对象.方法名称(需要传给方法行为的参数);

例子如下:

public class C4Person {
    public static void main(String args[])
    {
        Person per = new Person();//声明实例化对象
        per.name = "Tom";
        per.age = 3;
        per.tell();//方法的调用
    }
}

如果并没有进行对象的属性内容设置,则属性内容为属性的默认值(String:null int:0)

课时5:对象内存分析

Java中类属于引用数据类型,困难之处在于要进行内存的管理。所以对内存管理进行一下分析。

  • 通过栈内存找到堆内存,子啊找到对象的具体信息
堆内存 栈内存
保存的是对象的具体信息,在程序中堆内存的空间开辟由new完成 一块堆内存的地址
new的内存分配
  • 课时4的内存分析(声明并实例化对象):


    在这里插入图片描述
  • 分步骤完成对象
    分步骤完成对象

    所有调用类的属性和方法在实例化对象完成后才能执行
  • 错误代码:
    没有实例化

    只是声明了对象但是没有实例化,(栈内存没有指向堆内存的指针,以及堆内存没有开辟,只有引用数据类型有此报错!!!)**,调用后会报NullPointerException空指针异常

课时6:对象引用分析

既然类本身属于引用数据类型,就牵扯到内存的引用传递,可以被不同的栈内存指向,也可以更换指向。

  • 引用传递示例


    引用传递示例

    内存分析
  • 通过方法的引用传递:
    与之前的差别最大的地方在于,此时的程序是将Person类的实例化对象(内存地址、属性的参数)传递到了change()方法中,由于传递的是一个Person对象类型,那么change()接收的也是Person类型。
    通过方法的引用传递

    在这里插入图片描述
  • 引用传递可以发生在方法上,要观察方法里面传的的参数类型,同时也要观察方法的执行过程。

课时7:引用传递与垃圾产生分析

所有的引用传递的本质是一场堆内存的调戏游戏,那么也会造成辣鸡的产生,针对辣鸡产生原因产生简单分析:

  • 一个成功的引用传递


    辣鸡分析

    辣鸡分析
  • 此时原本per2的堆内存空间没有栈内存的指向了,(变成了辣鸡)
  • 所有的辣鸡都被GC(Garbage Collector)收集器不定期回收并且释放内存空间
  • 辣鸡越多会影响GC的处理性能
  • 一个栈内存只能保存一个堆内存的地址数据,如果发生更改,则之前的地址数据将从此栈内存中彻底消失**

第二章 深入分析类与对象

课时8:成员属性封装

在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,需要有较高的安全性,需要进行保护,需要采用封装性对属性进行保护。

  • 反例:类内部属性不封装时,类外部能修改属性


    在这里插入图片描述
  • 封装后,类外部不能访问其属性,但是对类内部可见。
    下面代码会报错,因为进行了类外部不能访问类内部封装好的属性

    在这里插入图片描述

  • 【setter、getter】设置或取得属性可以使用setXxx()、getXxx()方法

  • private String name为例

  • 设置属性方法public void setName(String n)

  • 获取属性方法public String getName()

    在这里插入图片描述

    在这里插入图片描述

  • 在需要对传入属性的获取判断时,在setXxx()里面添加条件判断闭并进一步修改值

set判断
  • 类中的所有属性都必须使用private封装
  • 访问属性必须setXxx() getXxx()

课时9:构造方法与匿名对象

现在的程序在使用类的时候一般都按照了如下的步骤进行:

  • 声明并实例化对象,这个时候实例化对象中的属性并没有任何的的数据存在,都是其对应数据类型的默认值
  • 需要通过一系列的setter()方法设置属性值

传统调用:

在这里插入图片描述

这样的调用很麻烦,每次都要setter getter,所以可以通过构造方法实现实例化对象中的属性初始化处理,只有在关键字new的时候使用构造方法。

  • 构造方法名称必须与类名称保持一致
  • 构造方法不允许设置任何返回值类型,没有返回值定义
  • 构造方法时关键字new实例化对象的时候自动调用的


    在这里插入图片描述
Person per = new Person("Tom",18);//调用有参构造
  • 每个类都会提供构造方法,如果没有定义构造方法,那么默认的是无参的构造方法,是程序编译的时候自动创建的。
  • 如果这个类的构造方法已经明确在类中定义了,那么这个默认的构造方法将不会被自己创建。比如类中明确定义了有参,但是类外调用的是无参构造,那么就会报构造器参数的错。

疑问为什么构造方法不设置返回值类型;如果不返回数据,为什么不用void定义方法呢?

  • 编译器是根据代码结构进行编译的(突然想学《编译原理》),执行的时候也是根据代码结构执行。
  • 如果是void,那么此结构就与普通方法定义相同了,编译器会认为跟普通方法是一样的。
  • 然而构造方法是实例化对象的是时候调用的,而普通方法是对象产生之后调用的。

构造方法重载

升序或降序定义构造函数:
在这里插入图片描述
构造方法 setter getter
在实例化对象的时候设置对象的属性 除了拥有设置属性的功能,还有修改属性的功能

实例化对象的创建步骤:

  1. 定义对象名称: 类名称 对象名称 = null
  2. 实例化对象:对象名称 = new 类名称()

所以:只通过实例化对象进行类的操作也是可以的,这种形式的对象叫做匿名对象

new Person("Tom",18).tell();

以上代码通过对象进行了tell()方法的调用,但是没有任何的引用,所以使用过后会变成内存辣鸡,将被GC进行辣鸡回收与释放。

以下代码显示了构造方法(只要是方法)能传递数据类型(包括类)

class Message{
    private String title;
    public Message(String t) {
        title = t;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String t) {
        title = t;
    }
}
class Person{
    private String name;
    private int age;
    public Person(Message msg,int a ) {
        name = msg.getTitle();
        age = a;
    }
    public Message getInfo(){
        return new Message(name + ":" + age)
    }
    public void tell() {
        System.out.println("姓名" + name + "年龄" + age);
    }
}
public class No1PersonMessage {
    public static void main(String args[]) {
        Message msg = new Message("mldn");
        Person per = new Person(msg,20);
        msg = per.getInfo();
        System.out.println(msg.getTitle());
    }   
}
在这里插入图片描述

第三章 this关键字

课时10:this调用本类属性

this有三类结构

  • 当前类中的属性this.属性
  • 当前类中的方法(普通方法,构造方法):this(),this.方法名称();
  • 描述当前对象

setter getter方法可以对属性进行赋值,但是在赋值的时候,采用的是如下的格式:

在这里插入图片描述

在Java程序之中“{ }”是作为结构体的边界符,那么在程序里面进行变量(参数、属性都成为变量)使用的时候都会以“{ }”作为一个查找边界(作用域),按照就近取用的原则,此时的构造方法并没有能够访问类中的属性,所以为了明确标记类中的属性和参数的区别,往往会在属性前追加一个this,表示本类的属性。
所以只要是访问本类中的属性的时候,都要加this

public Person(String n,int a) {
    this.name = n;
    this.age = a;
}
public void tell() {
    System.out.println("姓名:" + this.name + "、年龄:" + this.age);
}

课时11:this调用本类方法

  • 构造方法调用:this.()使用关键字new实例化对象的时候才会调用构造方法
  • 普通方法调用:this.名称() 实例化对象产生之后就可以调用普通方法
    构造方法调用this.setter方法 实现属性赋值
    在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容