面向对象
简介:
面向过程 : procedure oriented programming 缩写 POP
分析出解决问题所需要的步骤,然后把步骤一步一步实现.
面向对象 : object oriented programming 缩写 OOP面向对象的编程语言
以分类方式进行思考,用面向对象思维,用某个工具复杂的问题.面向对象的思想符合一般的认知习惯
比如: 你现在要做一道菜(西红柿炒鸡蛋),对于面向过程来说,就是1.先切菜,打鸡蛋 2.搅拌鸡蛋 3.烧油 4.倒鸡蛋液 5.倒西红柿 6.出锅
对于面向对象: 你speak: “妈,帮我炒个西红柿鸡蛋”
类
类是一个模板,描述一个类型的对象的属性和行为.类时表示客观世界某类群体的一些基本特征的抽象.
图纸/菜谱/类======>零件/菜/对象
类的结构
成员变量: 也就是类中的属性,可以理解为全局变量,(这个类有什么)
方法:对象的行为(类似与其他语言的函数)(这个类能干什么)
构造方法:用于创建对象
内部类:在类中声明的类
块:代码块
类的声明
类的声明格式为: [访问权限修饰符] [修饰符] class Car{}
访问修饰符有两种:public ,default
修饰符:final,abstract
关键字:class 用来定义类
类的命名规范:首字母大写,见名知意,驼峰命名法
package com.cxy.javaClass.day1;
/**
* 主人公类,属性有名字,宽高*/
public class Part {
String name;
int part_width = 20;
int part_hight = 60;
public Part(String name){
this.name = name;
}
public Part(){
this.name = "NULL";
}
public void run(){
System.out.println("I am "+name+", I'm run");
}
/**
* 获取part的x轴起始位置
* */
public int getX(int x) {
return x;
}
/**获取part的y轴起始位置*/
public int getY(int y) {
return y;
}
/**获取最大值,int型*/
public int getMax(int x,int y){
return (x>y)?x:y;
}
/**获取最大值, double型*/
public double getMax( double x, double y){
return (x>y)?x:y;
}
}
对象的创建和使用:
使用new关键字: new Part();
用变量来承接: Part part_one = new Part(); Part是part_one 的变量类型
使用对象.成员变量来调用属性:part_one.name;
使用对象.方法来调用方法: part_one.getMax(x,y);
同一类的每个对象有不同的成员变量存储空间。
同一类的每个对象共享该类的方法。
一个类可以实例化多个对象
//实例化
package com.cxy.javaClass.day1;
public class main_cyc {
public static void main(String[] args) {
Part P1 = new Part("JAM");
Part P2 = new Part();
P1.run();
P2.run();
int x=P1.getX(100);
int y=P1.getY(110);
System.out.println(P1.getMax(5,6)+"\n"+P1.getMax(5.5,6.5));
}
}
变量分类
一个类可以包含以下类型变量:
//成员变量:
成员变量是定义在类中,方法体之外的变量。
成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
在定义成员变量时可以对其初始化,如果不初始化,Java使用默认的值对其初始化。
成员变量在创建对象的时候会从类中复制一份到对象中。
成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量的作用范围为整个类体。
//局部变量:
在方法、构造方法或者语句块中定义的变量被称为局部变量。
局部变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
局部变量在使用前必须初始化赋值。
变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
//类变量:(也叫静态变量)
类变量也声明在类中,方法体之外,但必须声明为static类型.
构造方法
构造方法是在java种用来创建对象的方法,构造方法与类名相同,没有返回值,不需要用viod来修饰
public class Part {
String name;
int part_width = 20;
int part_hight = 60;
public Part(String name){ //构造含参的构造方法
this.name = name;
}
public Part(){ //构造不含参的构造方法
this.name = "NULL";
}
}
方法重载
一个类的方法可以定义有相同的名字,单参数不同,调用的时候,传入的参数是什么类型,就会有不同的方法(方法的重载与返回值类型没有任何关系)
public class Part {
/**获取最大值, int型*/
public int getMax(int x,int y){
return (x>y)?x:y;
}
/**获取最大值, double型*/
public double getMax( double x, double y){
return (x>y)?x:y;
}
public static void main(String[] args) {
Part P1 = new Part("JAM");
System.out.println(P1.getMax(5,6)+"\n"+P1.getMax(5.5,6.5));
}
对象与引用
new car(); 实在对空间种创建了实体,尽管他们是实实在在的实体,但我们无法使用,对象没有名字,我们就无法访问它,我们需要通过对象的引用来间接访问对象.
car car1 = new car();
这样就给对象了一个名字,可以通过名字来访问,使用对象.
car2 = car1; 这痒发生了复制行为,对象本身并没有被复制,被复制了的只有对象的引用,也就是car2和car1两个变量名指向了同一个内存空间.
//值传递与引用传递
//Java中进行方法调用中传递参数时,参数传递有两种:
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
//基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身