本文已参与「新人创作礼」活动,一起开启掘金创作之路。
面向对象OOP(上)
1面向过程&面向对象
概念:面向对象程序设计(OOP)是一种程序设计的泛型,同时也是一种程序开发的方法,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性
面向过程(POP): procedure oriented programming 。
面向对象(OOP) :object oriented programming 。
区别:
| 区别 | POP | OOP |
|---|---|---|
| 编程思想 | 一种以==过程==为中心的编程思想 | 一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分 |
| 特点 | 分析出解决问题所需要的==步骤==,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用 | 以==分类==的方式进行思考和解决问题。面向对象先对整体关系作出分类,然后根据不同的类深入细节的处理。面向对象的思想符合人类的认知习惯。 |
| 优势 | ==性能==比面向对象==高==(因为类调用时需要实例化,开销比较大,比较消耗资源) | ==易维护、易复用、易扩展==,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 |
| 缺点 | 没有面向对象易维护、易复用、易扩展 | 性能比面向过程低 |
面向对象无法取代面向过程,他们是相辅相成的。面向对象关注于从宏观 上把握事物之间的关系,在具体到如何实现某个细节时,仍然采用面向过 程的思维方式。
2类&对象
什么是类?
类: 是一类事物属性和行为的集合,可以看做一个模板
人类是一个类,它是对所有个体单位(人)的属性和行为进行抽象归类的一个集合
对象:对象是类的一个实例(对象不是找个女朋友),有属性和行为。
属性(成员变量):对于一个学生对象,属性有学号,班级,姓名
行为(成员方法):行为有上课,跑操,开班会
类与对象的创建
/*
类创建:(不会占内存)
class 类名{//一个java文件中只能有一个public class
成员变量;//属性
成员方法;//行为
}
实例化对象:(占有实际内存)
1.类名 对象名;
对象名 = new 类名();
类名 对象名 =new 类名(参数列表);//构造方法
2.new 类名();
new 类名(参数列表);//构造方法
声明方法:
访问权限修饰符 返回值类型 数据类型 方法名(参数列表){}
调用
对象名.方法名(参数列表)/对象名.方法名;
对象名.变量名;
*/
package JavaSE.Class;
public class people {
public static void main(String[] args){
people p=new people();
p.name="lanlei";
p.age=21;//通过对象访问属性并初始化赋值
p.display();
new people("Vae",35).display();//通过构造方法初始化对象属性
}
public String name;
public int age;
public people(){}//无参构造器
public people(String name, int age){//有参构造器
this.name=name;
this.age=age;
}
public void display(){
System.out.println(name);
System.out.println(age);
return;
}
}
运行结果:
类中的变量
- 成员变量
定义在类中,方法体之外。
基本类型/引用类型。
可不初始化 (java为其赋默认值):整形:0 浮点型:0.0 布尔型:false char: 空 引用类型:null。
在创建对象的时候会从类中复制一份到对象中。
被类中方法、构造方法和特定类的语句块访问 。
作用范围为整个类。
- 局部变量
在方法、构造方法或者语句块中定义的变量
基本类型/引用类型
在使用前必须初始化赋值
声明和初始化都是在方法中,方法结束后,变量就会自动销毁
package Test;
public class temp2 {
public static void main(String[] args) {
temp2 t=new temp2();
t.name="Vae";
System.out.println(t.name);
//System.out.println(t.j);局部变量,对象无法直接使用,只在方法体执行
t.print();
}
//成员变量 可不初始化
private double balance;
public String name;
int i;
//方法
public void print(){
String str;
int j=10;//局部变量,必须初始化才能在方法或代码块中使用
System.out.println(j);
//System.out.println(str);
//报错 Variable 'str' might not have been initialized:变量str未初始化
}
}
运行结果:
类中的方法
/*成员方法:
[访问权限修饰符] 返回值类型 数据类型 方法名(参数列表){
方法体;
[return 返回值]
}
构造方法:
1给对象的属性初始化
2构造方法名与类名相同,无返回值,不用void 修饰
3如果没有显式地为类定义构造方法,Java将会为该类提供一个默认
构造方法,但是只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效
public 类名(){}//无参构造方法
public 类名(int a,String b){}//有参构造方法
*/
package Test;
public class temp2 {
public static void main(String[] args) {
temp2 t=new temp2(133,"vae");//构造方法为其初始化
t.display();//调用成员方法
}
//成员变量 可不初始化
private double balance;
public String name;
int i;
//成员方法
public void display(){
System.out.println(balance+"\r\n"+name);
}
//构造方法
public temp2(){}//无参构造
public temp2(double b,String n){//有参构造
balance=b;
name=n;
}
}
方法的重载
重载:
1.概念:方法名相同,参数不同的多个方法
2.区分:
参数的个数,参数的类型,参数的顺序
==注意==:方法的重载和返回值无关
package homeworks.h5;
public class H5_5 {
public static void main(String[] args) {
System.out.println(max(1,2,3));
System.out.println(max(1,2));
System.out.println(max(1.0,2.0));
System.out.println(max(5.1,1.2,3.4));
max();
}
public static int max(int a,int b,int c){
int max=a>b?a:b;
max=max>c?max:c;
return max;
}
public static int max(int a,int b){
int max=a>b?a:b;
return max;
}
public static double max(double a,double b){
double max=a>b?a:b;
return max;
}
public static double max(double a,double b,double c){
double max=a>b?a:b;
max=max>c?max:c;
return max;
}
public static void max(){
System.out.println("asdfasd");
}
}
运行结果: