面向对象
定义
面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。*面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。*
类
中文理解:
1.许多相似或相同事物的综合。
2.用于性质或特征相同或相似的事物。
3.类似。
4.姓。
在计算机语言里面,类表示什么东西呢?(思考)
类的概念
类是一种抽象的事物,是现实生活中不存在的东西,是一系列对象具有
相同属性和行为的集合,封装这些对象的公共的属性和行为。它是一个模板,现实生活中不存在东西,是一个抽象的事物。
对象
对象在现实生活中描述的是具体存在的事物(看得见,摸得着的东西,比如一台电脑,一支笔,一部手机,一个行李箱,一瓶水等等.....)对象与类的区别就是对象是现实生活中具体存在事物,而类是现实生活中不存在的东西,它是许多对象的属性和行为的描述。
面向对象的三大特征
-
封装
把对象所拥有的公共的属性和行为抽取去出来放到容器里面,这个容器就叫做类。面向对象编程的第一步就是抽类
如何抽类?
在现实生活中一定要看到对象想到对象所描述的信息,这些信息在同一类对象中都完全拥有,也就是说只要抽取出一个对象的信息,就能偶抽取出大批对象的信息,把这些信息都全部封装到一个容器里面(这个容器就是类)
java语言里面是如何创建一个类的
类的格式:
public class 类名{
//若干属性
//若干行为
}
比如:
public class Computer{
属性cpu 硬盘 内存 声卡 显卡
行为
看爱奇艺视频
计算
发文件等。。。。
}
练习:
1、封装一个人类
属性:姓名,性别,年龄,身高,体重
行为:吃饭 睡觉,玩耍
2、封装一个学生类
属性: 姓名,性别,年龄,专业,学号、
行为: 学习英语,看小说
要求:每一位同学把写的代码截图发到群里里面。
类创建好了之后,有什么作用呢?
可以随意的创建该类对应的对象。
如何创建对象?
Java语言里面创建对象可以调用类提供的构造器创建对象。
什么是构造器:
构造器是类里面的特殊方法,该方法只能通过new关键字调用,该方法调用完毕之后就会创建该类所对应的一个对象,该对象就拥有了类里面所封装的一切属性和行为(方法)
构造器的特点:
构造器就是所谓 的构造器方法,该方法与类的其它方法不同的一点就是该方法没有返回值类型,方法名称和类名完全一致,在创建类的时候如果不显示申明构造器,那么类在创建的时候会创建一个无参数的构造方法供创建对象的时候调用!如果开发人员一旦显示申明有参数的构造器之后,那么无参数的构造器将会失效,这时候必须显示申明无参数构造器,否则将无法调用无参数构造器创建对象(编译器会出错)
今天的代码:
package com.tedu.cn.myclass;
public class Computer {
/**
* 1 表示产品为优
* 2 表示产品为良好
* 3 表示产品合格
*/
public static int flag = 1;
/**
* 每台电脑的发热值,达到一定的峰值以后电脑就会关机
*/
public int cc = 20;
/**
* 封装属性
* 表示类的成员变量
*/
public String main_bord;
public String cpu;
public int memery;
public int hardware;
/**
* 封装行为
* 在类里面表示方法(函数)
*/
public void compute(int i){
System.out.println("电脑会思考"+i);
}
public void watch_vidio(){
System.out.println("看腾讯视频");
}
public void sen_doc(){
System.out.println("电脑会发文件。。。");
}
}
`
package com.tedu.cn.myclass;
public class MyTest {
public static void main(String[] args) {
/**
* 根据Computer类所提供的无参数构造器创建
* 该类所对应的一个对象
*/
Computer computer1=new Computer();
Computer computer2=new Computer();
Computer computer3=new Computer();
Computer computer4=new Computer();
/**
* 小测试
* 下列的代码全部输出false,原因是每一个对象都是一个对立的单元
*/
/*System.out.println(computer1==computer2);
System.out.println(computer3==computer2);
System.out.println(computer4==computer3);*/
/**
* 对象如何访问自己的属性或者方法
* 可以通过对象的引用名称.属性
* 对象的引用名称.方法();
* 也就是对象名.属性名或者
* 对象名.方法名()
*/
System.out.println(computer1.main_bord);
System.out.println(computer1.memery);
/**
* 上面的两行代码28行打印出null
* 29行打印出0
* 为什么?
* 答案是:类在初始化的时候如果发现属性变量没有被初始化
* 那么Java虚拟机会默认初始化相关的属性变量
* 如果变量是属于引用类型,那么该变量的值初始化为null
* 如果是基本数据类型,初始化规则如下:
* byte---->0
* short---->0
* int---->0
* long ---->0
* float---->0.0
* double---->0.0
* char ---->''空字符
* boolean----> false
*/
computer1.main_bord = "华硕"; //初始化成员变量
System.out.println(computer1.main_bord);
/**
* 问什么类的成员变量一般要初始化,如果
* 不初始化,会出现异常
*/
//System.out.println(computer1.cpu.length());
computer1.sen_doc();
computer1.compute(2020);
/**
* 类方法和实例方法:
* 类方法:
* 类方法就是由static修饰方法叫做类方法,该方法的调用如果是在
* 本类的内部调用,那么可以直接通过方法名称取调用,如果在类的外部
* 必须使用类名.方法名称的这种方式取调用
* 实例方法:
* 实例方法就是不含由static修饰方法,该方法的调用必须通过
* 对象名.方法名的这种方式,或者通过反射技术来进行调用
*/
computer1.flag=4;
computer2.flag=5;
computer3.flag=8;
/**
* 以上报红的原因是:java 编译器不推荐使用对象.静态成员变量名称的
* 方式来访问类变量,应该通过类名.静态成员变量名的方式来访问
*/
Computer.flag= 78;
computer1.cc=3;
computer2.cc=4;
computer3.cc=5;
System.out.println(Computer.flag);
System.out.println(Computer.flag);
System.out.println(Computer.flag);
System.out.println(computer1.cc);
System.out.println(computer2.cc);
System.out.println(computer3.cc);
}
}
``
this 关键字:
作用:
1、使用在实例方法中(对象的方法中,非Stati修饰的方法)
如果this关键字出现在实例方法中,表示调用该方法的当前对象,也就是说
哪一个对象调用的该方法,那么该方法里面出现的this就表示哪一个对象。
昨天说过,如何调用对象的方法,是通过对象名.方法名()的形式调用的,其中
对象名就表示方法里面出现的this,this表示一个对象。
2、使用在构造器里面
a、表示调用该构造器创建的当前对象;昨天的知识点说过,创建对象是通过new关键字调用的构造器,例如 new Computer()就表示一个对象,那么构造方法里面出现的this就表示new Computer()这个对象
b、表示当前类的其它构造器,相当于在当前构造器里面调用其它构造器,而且 只能出现在当前的构造器里面的第一行;否则编译器将会出错
this关键字的补充:
每一个对象的实例方法里面都有一个隐含的this,相当有一个隐含的this对象,所以在实例方法中,
this对象在调用自己的其它方法或者访问自己的其它的属性的时候可以省略。
getter与setter方法
一般在面向对象的编程中,属性一般私有化,方法公开化。也就是属性的访问修饰符一般使用private,方法的访问修饰符一般使用public. 方法使用public修饰以后,外界任何地方都可以调用该方法;思考一下,既然不能直接访问私有属性,那么可以不可以在类里面定义一个方法,直接操作私有呢?答案是可以的。这个方法就是getter和setter方法,getter方法用于访问对象的属性,setter方法用于修改对象的属性值。
getter与setter的命名规则:
get+属性名(前提是属性名的首字母大写) set+属性名称(前提是属性名的首字母大写)
比如,电脑类有一个cpu的属性,那么对应的getterr方法就是:getCput(); setCpu("inter");
方法中参数的传递方式:
方法的参数传递主要由两种方式,一种是值传递,另外一种是引用传递。
值传递:函数参数如果选择值传递的方式传递参数,这种传参方式从数据层面来说,它是一种单向的传递方式,也就是说,方法在调用完毕以后,不会改变之前变量的值。它是一种单项的。
引用传递:引用传递从数据层来说,它是一种双向的数据传递方式。也就是方法在调用完毕之后会改变原有的变量值。