面向对象和面向过程
面向对象是一种编程风格,是一种程序设计思想(除此以外,还有面向过程,指令式编程,函数式编程...) 现在主流的编程思想是面向对象和面向过程 早期程序比较简单,先有面向过程,后来程序越来越复杂,弊端比较多,所以就诞生了面向对象这一编程思想.
面向过程
核心:将功能实现的过程(步骤)封装成函数.在每一步执行时,调用对应的函数即可. 典型的语言: c语言
以函数为单位进行代码组织的,相对于面向对象的语言扩展能力差.
面向对象
核心:以类为单位处理问题, 将同一类事务的属性和行为封装到一个类中 解决某一类问题时,找对应的类即可.
类与类之间还可以存在继承关系,使得代码的扩展性更好,维护性更好.
面向对象是一种宏观的设计思想,分析出完成某件事情,需要哪些类
面向过程是一种微观具体的设计思想,是具体落地实现
程序设计时,二者相辅相成 不可分割
类和对象
类
类是具有相同特征事务的抽象定义 ,是一个模版,用来记录事务的属性和方法(行为)
例如 人类(类) ----->属性: 姓名 年龄 性别 等变量(名词)
----->方法: 吃饭 学习 工作 睡觉 等动作 行为 功能 (动词)
编程时,先分析事务由哪些类构成,将不同类型的功能定义在各自类中(先设计类,由类创建对象)
对象
通过类这个模版,所创建出的一个个具体的实例就是对象.
例如:人类是抽象概念,不能直接使用.而张三,李四是具体的人, 也就是对象(实例),可以进行具体的操作(定义属性和功能).对象(实例)就是具体存在的东西
区别
现实生活中,是先有对象(具体), 后有类(抽象).
编程中,是先根据具体事务设计类(抽象), 再由类创建出对象(具体).
类的结构
变量 属性 名词
方法 行为 动词
public final/abstract class Car {
[访问权限修饰符] [修饰符] 关键字(用来定义类) 类名(首字母大写)
类的成员(定义在类的{}中的内容): 1.成员变量(属性): 在成员方法,构造方法 代码块中使用,作用域为整个类体 故可以成为全局变量 定义在类中,方法体(main 自己定义的方法)之外 例如名称 颜色 价格 2.成员方法}
package day1;
public class Car {
//成员变量
String name ;
String color;
float price;
int[] a;//成员变量可以是基本类型,也可以是引用类型(除基本类型之外的都是引用数据类型 例如数组)
//成员方法
public void start(){
//int b;局部变量
//System.out.println(b);
//局部变量不赋值会报错,但是成员变量不赋值不会报错,系统会给他赋默认值
System.out.println(name+"启动");
}
public void run(){
System.out.println(name+"行驶");
}
public void showinto(){
System.out.println("名称"+name+" "+"颜色"+color+" "+"价格"+price);
}
}
类的创建和变量声明
创建对象 new Car()
声明变量 Car bm/bc
package day1;
public class TestCar {
public static void main(String[] args) {
//创建对象 new Car() 在内存中开辟了一块空间
//声明变量 Car bm/bc
Car bm = new Car();//把右边开辟的空间赋给左边的对象地址
bm.name = "宝马";
bm.color = "红色";
bm.price = 400000;
bm.start();
bm.run();
bm.showinto();
//以类为模版,创建出两个车对象bm bc(实例)
//每new出一个对象 这个对象都具有类中定义的功能
Car bc = new Car();
bc.name = "奔驰";
bc.color = "黑色";
bc.price = 300000;
bc.start();
bc.run();
bc.showinto();
}
}
构造方法
方法的重载
在一个类中,有多个同名的方法称为方法的重载,可以通过参数(类型 个数 顺序)进行区分 且与返回值无关
package day1;
public class Person {
String name;
int age;
char gender;
public Person(){
System.out.println("这是Person类的无参数构造方法,作用是为对象成员变量赋默认值");
}
public void eat(){
System.out.println(name+"吃东西");}
public void showinfo(){
System.out.println("姓名"+name+"年龄"+age+"性别"+gender);
}
//定义了有三个参数的构造方法
public Person(String n, int a, char g){
System.out.println("有三个参数的构造方法");
name = n;
age = a;
gender = g;
}
public Person(String n, int a){
System.out.println("有两个参数的构造方法");
name = n;
age = a;
}
public Person(int a , String n){
System.out.println("有两个参数的构造方法");
name = n;
age = a;
}
public Person(int a, char g){
System.out.println("有两个参数的构造方法");
}
}
new+构造方法()
1.作用: 构造方法就是为创建出来的成员变量进行初始化赋值zhangsan.showinfo();
2.特点: 构造方法的名字与 类名 相同,不需要用void修饰
一个类中如果没有定义构造方法,系统会提供一个默认的无参构造方法
3.注意:类中默认的构造方法是会失效的,例如:一旦在类中定义了有参的构造方法,默认的无参构造方法就失效被覆盖了
所以一般在类中定义了有参的构造方法,都会把默认的无参构造方法定义出来
package day1;
public class TestPerson {
public static void main(String[] args) {
Person zhangsan = new Person();
/* new+构造方法()
作用: 构造方法就是为创建出来的成员变量进行初始化赋值zhangsan.showinfo();
特点: 构造方法的名字与 类名 相同,不需要用void修饰
一个类中如果没有定义构造方法,系统会提供一个默认的无参构造方法
注意:类中默认的构造方法是会失效的,例如:一旦在类中定义了有参的构造方法,默认的无参构造方法就失效被覆盖了
所以一般在类中定义了有参的构造方法,都会把默认的无参构造方法定义出来
*/
zhangsan.showinfo();
new Person();
Person lisi = new Person();
lisi.name ="李四";
lisi.age =20;
lisi.gender='男';
lisi.showinfo();
Person wangwu =new Person();
wangwu.name ="王五";
wangwu.age =23;
wangwu.gender='男';
wangwu.showinfo();
}
}