一、面向对象
小白:Java是一门完全面向对象的编程语言!嗯?什么是面向过程?什么又是面向对象呢?
大佬:在我们正式进入学习这部分前,了解一下面向过程和面向对象这两个概念,对于我们 接下来的学习有很大的好处。别急,下面我就来和你说一说。
面向过程——步骤化
面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可
面向对象——行为化
面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
小白:面向过程还挺明白的,面向对象也太难理解了吧(哭了)
大佬:我再来举个例子再给你好好说一说
故事:
很早很早以前的编程是面向过程的,比如实现一个算术运算1+1 = 2,通过这个简单的算法就可以解决问题。但是随着时代的进步,人们不满足现有的算法了,因为问题越来越复杂,不是1+1那么单纯了,比如一个班级的学生的数据分析,这样就有了对象这个概念,一切事物皆对象。将现实的事物抽象出来,注意抽象这个词是重点啊,把现实生活的事物以及关系,抽象成类,通过继承,实现,组合的方式把万事万物都给容纳了。实现了对现实世界的抽象和数学建模。这是一次飞跃性的进步。
举个最简单点的例子来区分 面向过程和面向对象
有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择
1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。
2、去饭店,张开嘴:老板!来一份鱼香肉丝!
看出来区别了吗?这就是1是面向过程,2是面向对象。
面向对象有什么优势呢?首先你不需要知道鱼香肉丝是怎么做的,降低了耦合性。如果你突然不想吃鱼香肉丝了,想吃洛阳白菜,对于1你可能不太容易了,还需要重新买菜,买调料什么的。对于2,太容易了,大喊:老板!那个鱼香肉丝换成洛阳白菜吧,提高了可维护性。总的来说就是降低耦合,提高维护性!
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。
面向对象的三大特性:
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
小白:大佬!大佬!这三大特性不理解!!拜托!能讲的通俗点吗?
大佬: 没问题!安排!
-
封装就是将数据包装起来,比如:你有一万块钱放在一个盒子里这就是封装但是你还要取出来就要弄个口才能从外面取出来。
-
继承通俗点就叫做继承家产,比如说:儿子肯定有一个父亲,最后肯定是儿子继承父亲的家产
-
多态:比如说:你们俩个人都在玩游戏,肯定有一个人玩的比较好,一个人玩的就没有那么好,同样是玩游戏就有差别。
- 从认识的角度考虑是先有对象后有类。对象是具体的事物,类是抽象的,是对象的抽象 。
- 从代码运行角度考虑是先有类后有对象,类是对象的模板。
二、回顾方法的定义
众所周知:代码是写到main方法里面,而main方法是写到类里面。
方法的定义:
修饰符 返回值类型 方法名(参数列表){
/// 方法体
return 返回值 ;
}
修饰符:(常见)public static
返回类型:void 和数据类型
break和return的区别:一个是结束循环(break)另一个是结束返回值(return)
方法名:注意规范就行,见名如意
参数列表: (参数类型参数名…)
异常抛出:疑问
三、方法的调用:
1. 静态方法
静态方法:要想在学生类里写的代码再方法的回顾类里运行如下
//学生类
public class students {
//静态方法
public static void say() {
System.out.println("你说话了");
}
}
//方法的回顾类
public class 方法的回顾 {
public static void main(String[] args) {
//输出学生类
students.say();
}
}
2. 非静态方法:
非静态方法:要想在学生类里写的代码再方法的回顾类里运行如下
//学生类
public class students {
//非静态方法
public static void say() {
System.out.println("你说话了");
}
}
//方法的回顾类
public class 方法的回顾 {
public static void main(String[] args) {
//首先要实例化这个类new students,再调用say方法;
new students().say();
//不过我们一般会这样写方便理解,比较麻烦,但是经常会在面向对象用到的。还是要先实例化
//对象类型 对象名 = 对象值 ;
students students = new students();
students.say();
}
}
实际参数和形式参数
回顾一下:实际参数和形式参数
public class dome3 {
public static void main(String[] args) {
//实际参数3,5
int add = dome3.add(3, 5);
System.out.println(add);
}
//形式参数int a,int b对应实际参数的值
public static int add(int a,int b){
return a+b;
}
}
值传递
思考:输出a是什么数?
public class dome4 {
public static void main(String[] args) {
int a=0;
System.out.println(a);
dome4.b(a);
}
public static void b(int a){
a=99;
}
}
输出:0
0
引用传递
package com.yushen;
//引用传递:对象,本质还是值传递
public class dome5 {
public static void main(String[] args) {
sion sion =new sion();
System.out.println(sion.name);
dome5.c(sion);
System.out.println(sion.name);
}
public static void c(sion sion){
//c是个对象:指向的—————— sion sion =new sion();这是个具体人,可以改变属性。
sion.name="好好学";
}
}
//定义一个sion类,有一个属性:name
class sion{
String name;//默认值:null
}
四、类对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义但是并不能代表某一个具体的事物。
- 动物、植物、手机、电脑。。。。。
- person类、pet类、car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为,
- 对象是抽象概念的具体实例
- 张三就是人一个具体实例,张三家里的旺财就是狗的一个具体实例。
- 能够体现除特点,展现除功能的是具体的实例,而不是一个抽象的概念。
创建一个对象与初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的额时候,处理分配内存空间之外,还会给 创建好的对象进行,默-认的初始化以及对类中构造器的调用。
- 类中的构造器也称为构造方法,实在进行创建的时候必须要调用的并且构造器有以下俩个特点:
- 1,必须和类的名字相同
- 2.必须没有返回类型也不能写void
构造器必须要掌握
1. 使用new关键字创建对象
public class dome4 {
public static void main(String[] args) {
dome5 xiaoming =new dome5();
dome5 xiaohong =new dome5();
xiaoming.name="小明";
xiaoming.age=99;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
xiaohong.name="小红";
xiaohong.age=9;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
public class dome5 {
String name;
int age;
public void student(){
System.out.println(this.name+"在学习");
}
}
2.构造器
- 1.和类名相同
- 2.没有返回值
- 作用:
- 1.new 本质在调用构造器
- 2.初始化对象的值
- 注意点:
- 1.定义有参构造器之后,如果想使用无参构造器,显示的定义一个无参的构造
- 2.快捷键:alt+insert
无参构造器
//一个项目应该只存在一个main方法
public class dome6 {
public static void main(String[] args) {
//实例化一个对象
dome7 dome7= new dome7();
System.out.println(dome7.name);
}
}
public class dome7 {
String name;
//使用new关键字,本质是在调用无参构造器
public dome7(){
this.name="junpu";
}
有参构造:一旦定义了有参构造器了,无参就必须显示定义
public dome7(Strin name){
this.name=name;
}
}
参构造器
public class dome7 {
String name;
//使用new关键字,本质是在调用无参构造器
public dome7(){}
有参构造:一旦定义了有参构造器了,无参就必须显示定义
public dome7(Strin name){
this.name=name;
}
}
//一个项目应该只存在一个main方法
public class dome6 {
public static void main(String[] args) {
//实例化一个对象
dome7 dome7= new dome7(junpu:);
System.out.println(dome7.name);
}
}
重点:构造器必须掌握
创建对象内存分析
看案例:
public class dome8 {
public static void main(String[]args){
//实例化名为dog
pet dog =new pet();
//将对象dog的name赋值旺财
dog.name="旺财";
//将对象dog的age赋值8
dog.age=8;
//对象dog调用shout方法并输出
dog.shout();
//实例化名为cat
pet cat =new pet();
//将对象cat的name赋值猫
cat.name="猫神";
//将对象cat的age赋值2
cat.age=2;
//对象cat调用shout方法并输出
cat.shout();
}
}
public class pet {
public String name;
public int age;
//shout方法
public void shout(){
System.out.println("名字:"+name+"年龄:"+age+" 叫了一声");
}
}
运行显示
看图理解
使用this
- 在Java中关键字this总是指向调用当前方法的对象,根据this出现的位置不同,this作为对象的默认引用有以下两种情形。
- 在构造器中引用该构造器执行初始化的对象。
- 在方法中引用调用该方法的对象。
例子:
public class day8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
day8 cc =new day8();
cc.hu();
}
public String color="粉";
public void hu(){
String color="蓝";
System.out.println("你的衣服是"+color+"色");
System.out.println("你的衣服是"+this.color+"色");
}
}
输出:
你的衣服是蓝色
你的衣服是粉色
对象小结
- 类与对象
类是一个模板:抽象 。对象是一个具体的实例。 - 方法
定义,调用 - 对应的引用
引用类型:基本类型(8)
对象是通过引用来操作的:栈---->堆 - 属性:字段field成员变量
默认初始化:
数字:0,0.0
char: u0000
boolean: false
引用:null
修饰符 属性类型 属性名 = 属性值! - 对象的创建和使用
必须使用new关键字创建对象,构造器: pet dog =new pet();
对象的属性 :dog.name
对象的方法 :dog.pet();
6.类
静态的属性 属性
动态的行为 方法
重点:理解透彻后才能往下看