Java——类和对象
文章目录
- 一、认识类和对象
- 二、了解面向对象编程和面向过程编程
- 三、类的定义和使用
- 四、构造方法
- 五、 this关键字
一、认识类和对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
类:类是“模板”的概念,描述一类事物共有的属性和行为。类是抽象的概念,如狗,猫,人等,不能具体到某个实体。
对象:对象就是通过类这个模板构造出来的一个实体,有了对象后,这些属性便有了属性值,行为也有了意义。
二、了解面向对象编程和面向过程编程
面向过程编程:把问题拆成“一步一步怎么做“。
面向对象编程:把问题拆成“由哪些东西组成、这些东西各自能做什么”。
用洗衣服举个例子:
面向过程编程
会一步一步的按照顺序执行。
优缺点:
简单直观、贴近机器执行流程;
项目一大,数据和函数星罗棋布,牵一发而动全身;
复用靠“复制粘贴 + 改”,维护成本高。
面向对象编程:
相当于把洗衣服过程的数据和操作被封装到对象内部。
优缺点:
优缺点
1.高内聚低耦合,易于扩展和维护;
2.建模贴近人类思维,适合大型系统;
高内聚:一个模块内部的元素彼此高度相关,只干同一件事。
1.代码易读:一看名字就知道职责。
2.可维护:改 bug 只在一处动刀。
3.复用性强:整块搬走即可。
低耦合:模块之间依赖关系尽量少、尽量弱,接口清晰。
低耦合的模块就像乐高积木,哪里需要哪里搬,减少重复造轮子。
面向对象编程和面向过程编程对比
维度 | 面向过程 | 面向对象 |
---|---|---|
核心单元 | 函数(过程) | 对象(类) |
设计起点 | 算法步骤 | 领域模型(名词) |
数据与行为 | 分离 | 封装在一起 |
复用手段 | 公用函数库、复制粘贴 | 继承、组合、多态 |
扩展方式 | 改函数内部 → 易牵一发动全身 | 添加新类/方法 → 开闭原则 |
代表语言 | C、Pascal、Shell | Java、C++、Python、C# |
三、类的定义和使用
前面已经解释过类的定义了,接下来直接举例说明。
class dog
{public String name;//姓名属性public int age;//年龄属性public void eat(){System.out.println(name+"吃饭");//吃饭的行为}public void sleep(){System.out.println(name+"睡觉");//睡觉的行为}
}
这个类里面简单的介绍了狗共有的属性和行为。
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的,有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
类的使用,对象的实例化:
public static void main(String[] args) {dog doga=new dog();doga.name="旺财";doga.age=5;doga.eat();doga.sleep();}//输出结果//旺财吃饭//旺财睡觉
用new 关键字用于创建一个对象的实例。
使用 . 来访问对象中的属性和方法。
同一个类可以创建对个实例。
四、构造方法
1.构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同没有返回值类型,设置为void也不行,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
class dog
{public String name;//姓名属性public int age;//年龄属性public void eat(){System.out.println(name+"吃饭");//吃饭的行为}public void sleep(){System.out.println(name+"睡觉");//睡觉的 行为}public dog(String name, int age) {//构造方法this.name = name;this.age = age;}public static void main(String[] args) {dog doga=new dog("旺财",2);doga.eat();doga.sleep();}
}
构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
2.构造方法可以重载
public dog(String name, int age) {//构造方法this.name = name;this.age = age;}public dog(){this.name="小黑";this.age=1;}
3.如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户定义,编译器则不再生成。
4.构造方法中,可以通过this调用其他构造方法来简化代码
public dog(String name, int age) {//构造方法this.name = name;this.age = age;}public dog(){this("小黑",1);//通过this调用构造方法}
但是不能形成环,而且this(…)必须是构造方法中第一条语句
public dog(String name, int age) {//构造方法this();}public dog(){this("小黑",1);//通过this调用构造方法}
这样就是形成了环,你调用我,我调用你。
五、 this关键字
1.区分同名的成员变量和形参
public dog(String name, int age) {//构造方法this.name = name;this.age = age;}
就像这样,有this的是成员变量,没有this的是形参。
2.在构造器里调用兄弟构造器
public dog(String name, int age) {//构造方法this.name = name;this.age = age;}public dog(){this("小黑",1);//通过this调用构造方法}
3.把自身引用当参数/返回值传出去
class Counter {private int count;Counter add() { ++count; return this; }
}
在内部类里指向外部类对象
class Outer {int value;class Inner {int value;void test() {System.out.println(this.value); // Inner 自己的System.out.println(Outer.this.value); // 外部类的}}
}
this 永远代表“正在执行这段代码的那个对象。