Java|面向对象之类和对象
一、类和对象的引入
- 类是一种抽象的数据类型,是对现实中事务的描述,但并不能代表某一具体的事物。
比如我们可以说猫是一个类,但是我不能说我自己养的猫kitty是一个类。 - 如上所述,我自己养的猫kitty可以说是一个对象,对象是抽象概念的具体实例,例如kitty这只真实存在事物是对猫这个抽象概念的一个具体表现。
- 类是一个模版,描述一类对象的行为和状态
比如linuxos,macos,winos三个可以看作是一类对象
对这些对象抽象出其共性,如name,version,开机方法,关机方法等
就可以抽象出操作系统类。
二、面向对象
- 什么是面向对象?
- 面向对象就是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。再把同类对象抽象出其共性,形成类。
- 类中的大部分数据,只能通过本类中的方法进行处理。
- 类可以通过外部接口与外部发生联系
- 面向过程和面向对象的区别?
- 面向过程的思想是分析出问题的步骤,然后再一步一步的把步骤给实现。
先定好main函数,再一步一步实现main函数中所要用到的其他函数 - 面向对象是把构成问题的事务抽象成程序设计中的对象,是一种自下而上的设计,即先设计组件,再进行拼装。
- 面向过程编程和面向对象编程的区分实例
现在我们有一个问题:我在雨天撑伞避雨。
- 如果按照面向过程的编程思想,我们解决淋雨问题的步骤是这样的
- 下雨
- 打开伞
- 挡雨
- 雨停
- 收伞
然后每一个步骤写一个函数去实现
-
而利用面向对象的编程思想,我们则是先从雨天撑伞避雨这个具体问题中抽象出三个对象:我,伞,雨(me,umbrella,rain)
这三个对象里分别有一些成员变量和成员方法
比如:
“我”里面可以含有以下的成员方法- 撑伞
- 收伞
“伞”这个对象里可以含有如下成员方法
- 挡雨
- 挡太阳
“雨”这个对象里可以含有以下成员方法
- run
- stop
构造出对象后,我们再根据实际问题对对象进行组合,比如本题,我们的解决方法是
- rain.run
- me.撑伞
- rain.stop
- me.收伞
三、类的创建与对象的实例化
- 类的创建 修饰符 + class +类名 {}
- 如创建一个学生类:
public class Student{
String name;
int age
public void study(){
System.out.println("学生在学习")
}
}
- 类的实例化/对象的创建 类名 + 对象名 = new 类名();
- 如实例化一个学生类
public class Test{
public static void main(String[] args){
Student Adam = new Student();
Student Vincent = new Student();
Adam.name = "亚当";
Adam.age = 23;
Vincent.name = "文森特";
Vincent.age = 24;
}
}
4、创建对象时的内存分析
5.构造器/构造方法
- 构造器就是和类名相同但无返回类型的方法。用于将对象的实例化
- 示意代码
//无参构造
public class Person{
String name;
}
->无参构造的调用
public class Test{
public static void main(String args[]){
Person person = new Person();
}
- 如代码所示,在Person类中,并没有定义Person方法,但在调用时,却用到了Person(),这是因为在类被创建出来时,会默认创建一个当前类的无参构造,用于创建对象。
//有参构造
public Person(String name){
this.name = name;
}
->调用有参构造时,自行传参
public class Test{
public static void main(String args[]){
Person person = new Person("Vincent")
System.out.println(person.name);
//至此会输出Vincent
Person person2 = new Person();
System.out.println(person2);
//至此会报错,因为一旦定义了有参构造,就必须显式定义无参构造。
}
- 总结
- 构造器也叫构造方法
- 构造器的作用是实例化对象,使用new关键字实例化对象的本质是调用构造器
- 构造器的定义需注意
- 和类名相同
- 没有返回值
- 在有参构造时,this关键字.之后的变量是指的成员变量,=后的变量是传参的变量
- 一旦定义了有参构造,则默认的无参构造自动失效,若要使用无参构造则必须显式定义