面向对象

1.什么是面向对象?

1.1面向过程&&面向对象

  • 面向过程思想:

    • 步骤清晰简单,第一步做什么,第二步做什么……
    • 面对过程适合处理一些较为简单地问题
  • 面向对象思想
    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
  • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去解决

1.2面向对象

  • 面向对象编程(Object Oriented Programming,OOP)
  • 面向对象编程的本质就是:以类的方式组织代码,以对象的形式(封装)数据
  • 抽象
  • 三大特性:
    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是现有对象后有类。对象是具体的事物。类,是抽象的,是对对象的抽象
  • 从代码运行角度考虑是先有类后有对象。类是对象的模板。

2.回顾方法的定义

  • 方法的定义

    • 修饰符
    • 返回类型
    • break和return的区别:break用于跳出switch或者结束循环;return代表结束方法,返回一个结果
    • 方法名:注意规范,见名知义。第一个单词首字母小写,之后每个单词首字母大写
    • 参数列表:(参数类型,参数名)
    • 异常抛出:疑问,后面讲解
  • 方法的调用

    • 静态方法

    • 非静态方法

    • 形参和实参

    • 值传递和引用传递

    • this关键字:后面讲解

静态方法和非静态方法

Student.java

package li.oop.demo01;

//学生类
public class Student { //静态方法
public static void say(){
System.out.println("学生说话了");
} //非静态方法
public void say2(){
System.out.println("学生又说话了");
} }

Demo02.java

package li.oop.demo01;

public class Demo02 {
public static void main(String[] args) { //知识点1:
//静态方法可以直接通过方法名使用
Student.say(); //非静态方法需要实例化这个类 new
//对象类型 对象名 = 对象值;
Student student = new Student();
student.say2();
} //知识点2:
/*这里当a()为static静态方法而 b()不是静态方法时,在方法a()中不能调用b()方法,原因是:
被static 修饰的内容会跟随类的加载而加载,所以静态化的内容可以不用实例化就直接调用(时间片比非静态方法实例化要早),同时两个静态方法之间也可以相互调用
两个非静态的方法可以相互调用是因为它们的类实例化后两个一起被创建(也是时间片问题)*/ //和类一起加载的
public static void a(){ } //类实例化 之后再存在
public void b(){
a();
}
}

形参和实参

package li.oop.demo01;

public class Demo03 {
public static void main(String[] args) {
//实际参数和形式参数的类型要对应!
int add = add(1, 2);
System.out.println(add); } public static int add(int a,int b){
return a+b;
}
}

值传递和引用传递

package li.oop.demo01;

//值传递
public class Demo04 {
public static void main(String[] args) {
int a = 1 ;
System.out.println(a);//1 Demo04.change(a);
System.out.println(a);//1
} //返回值为空
public static void change(int a){
a = 10 ;
}
}
package li.oop.demo01;

//引用传递:传递对象,本质还是值传递
//具体知识设计到:对象的含义以及内存
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null Demo05.change(person);
System.out.println(person.name);//秦疆 } public static void change(Person person){
//person是一个对象:指向的-->Person person = new Person();这是一个具体实例化的人,可以改变属性!
person.name = "秦疆";
}
} //定义了一个person类,有一个属性:name
class Person{
String name;
}

3.类和对象的关系

  • 类是一种抽象的数据类型,它是对某一事物整体描述/定义,但是并不能代表某一个具体的事物
  • 对象是抽象概念的具体实例
    • 张三就是人的一个具体实例,张三家的旺财就是狗的一个具体实例
    • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念

3.1创建和初始化对象

  • 使用new关键字创建对象

  • 使用new关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化以及对类中构造器的调用

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。构造器有以下两个特点:

      1. 必须和类的名字相同
      1. 必须没有返回类型,也不能写void

    构造器必须要掌握

例子

Student.java:

package li.oop.demo02;

//学生类
public class Student { //属性:字段
String name;
int age; //方法
public void study(){
System.out.println(this.name+"在学习");
} }

Application.java:

package li.oop.demo02;

//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) { //类:抽象的,它需要实例化
//类实例化后会返回一个自己的对象
//student对象就是一个Student类的具体实例
Student xiaoming = new Student();
Student xh = new Student(); xiaoming.name = "小明";
xiaoming.age = 3; xh.name = "小红";
xh.age = 3; System.out.println(xiaoming.name);
System.out.println(xiaoming.age); System.out.println(xh.name);
System.out.println(xh.age); }
}

3.2构造方法(构造器)

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。

构造器有以下两个特点:

  1. 必须和类的名字相同

  2. 必须没有返回类型,也不能写void

构造器的作用:

1. 使用new关键字,本质是在调用构造器
2. 用来初始化值

注意点:

  1. 定义有参构造后,如果想要使用无参构造,必须显示地定义一个无参的构造

Alt+insert快捷键:构造有参函数

Alt+insert+Select None:构造无参函数

一个类即使什么都不写,也会存在一个默认的构造方法(构造器)

如图,class文件中可以看到:在空类Person的class文件中,存在一个Person()的构造方法

例子:

Person.java:

package li.oop.demo02;

public class Person {

    //一个类即使什么都不写,也会存在一个构造方法

    //显式地定义构造器

    String name;

    /*构造器的作用:
1.使用new关键字,本质是在调用构造器
2.用来初始化值
*/ //无参构造
public Person(){} //有参构造:一旦定义了有参构造,无参构造就必须显式定义,否则有参构造无效
public Person(String name) {
this.name = name;
}
}

Application.java:

package li.oop.demo02;

//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) { //使用 new 关键字实例化了一个对象
Person person = new Person("kuangshen");
System.out.println(person.name);//kuangshen }
}

4.创建对象内存分析

例子

在Pet类中定义一个简单地方法shout()以及两个属性字段

package li.oop.demo03;

public class Pet {

    public String name;
public int age; public void shout(){
System.out.println(name+"叫了一声");
}
}

在Application中new了两个对象,分别是dog和cat,并给两个对象的属性分别赋值,运行

package li.oop;

import li.oop.demo03.Pet;

public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout(); System.out.println(dog.name);
System.out.println(dog.age); Pet cat = new Pet();
cat.name="咪咪";
cat.age=2;
cat.shout(); System.out.println(cat.name);
System.out.println(cat.age); }
}

解析如下图所示

  1. 首先在堆中加载Application类,将该类中的方法放入到堆中的方法区中,类中有main()方法和String常量“旺财”“咪咪”String

注意这里age=3的3就不是常量,只是int类型的数字。因为“旺财”是字符串,String默认是final修饰的,所以是常量

  1. 然后执行main()方法,在main()方法中按顺序执行程序。

  2. 首先是创建了一个dog实例对象:Pet dog = new Pet()

    • 运行到new Pet()时,会在堆方法区中加载 Pet 类。在Pet类中有name和age字段以及shout()方法,在加载对象模板时,name的默认值为null,age默认值为0
    • 当=dog时,通过模板生成了一个具体的dog对象。注意,在栈中的dog只是一个引用变量名,真正的对象在堆中。name的默认值为null,age默认值为0
  3. 接着进行main()方法中的语句 dog.name = "旺财"; dog.age = 3;,将值赋给dog对象的name和age属性。接着的 dog.shout();语句调用Pet类中的shout()方法。

  4. 然后输出dog对象的属性,cat对象的执行过程同理

5.简单小结

  1. 类与对象

    类是一个模板:抽象;对象是一个具体的实例

  2. 方法

    定义、调用

  3. 对象的引用

    引用类型:基本类型(8种)

    对象是通过引用来操作的:栈--->堆(地址),引用指向堆里面真实的地址

  4. 属性:字段Field 成员变量

    默认初始化:

    ​ 数字 : 0 0.0

    ​ char : u0000

    ​ boolean : false

    ​ 引用类型:null

    属性的定义:修饰符 属性类型 属性名 = 属性值

  5. 对象的创建和使用

    • 必须使用new关键字创建对象,还要有构造器

    • 对象的属性: 对象名.属性

    • 对象的方法: 对象名.方法

  6. 类中只有两个东西:属性和方法

    静态的属性 属性

    动态的行为 方法

6.封装

  • 该露的露,该藏的藏

    • 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
  • 封装(数据的隐藏)

    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
  • 封装的意义:

  1. 提高程序的安全性,保护数据
  2. 隐藏代码的实现细节
  3. 统一借口
  4. 系统可维护性增加了

快捷键Alt+insert呼出快捷菜单:选择Getter和Setter可以快速生成get、set方法

day10-面向对象的更多相关文章

  1. 阶段01Java基础day10面向对象05

    10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格 ...

  2. day10<面向对象+>

    面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四 ...

  3. Java相关英语单词

    day1 Java概述 掌握 .JDK abbr. Java开发工具包(Java Developer's Kit) (abbr.缩写) .JRE abbr. Java运行环境(Java Runtime ...

  4. 尚硅谷Java——宋红康笔记【day6-day10】

    day6 一.数组的概述 1.数组的理解:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 2.数组相关的概念: 数组名 元素 ...

  5. day10 浅谈面向对象编程

    面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的.   第四步概括动词设计成方法.动作的产生往往 ...

  6. python day10: 反射补充,面向对象

    目录 pythdon day 10 1. 反射补充 16. 面向对象 16.1 面向对象初步介绍 16.2 面向对象和面向过程区别 16.3 对象的进化 17. 类class 17.1 类的定义 17 ...

  7. Day10 类与对象-面向对象编程(1)

    面向对象编程(OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据. 抽象 三大特征: 封装 继承 多态 从认识论角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的, ...

  8. python 基础知识-day10(面向对象)

    1.面向对象的概念 拥有共同属性的一类进行归类的过程叫做面向对象. 2.注意事项 class定义类的时候,类名的首字母必须大写 3.面向对象案例 1 class Person(object): 2 d ...

  9. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  10. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

随机推荐

  1. Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议

    基于阻塞队列生产者消费者模型线程池的多线程Web服务器 代码地址:WebServer_GitHub_Addr README 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器 ...

  2. iSCSI的客户端messages频繁报错问题解决

    问题现象: 在自己的工作站中安装的RAC测试环境,使用了iSCSI模拟共享存储,环境运行OK,但是在messages信息中频繁报错如下: [root@db01rac2 ~]# tail -20f /v ...

  3. Windows平台安装Oracle11.2.0.4客户端报错INS-30131

    之前为解决EXP-00003错误给出了安装Oracle11.2.0.4的解决方案,自己测试是没问题的,客户自己安装反馈遇到报错INS-30131,MOS有一篇文章: E1: DB: Error INS ...

  4. 小知识:RHEL7上设置Keepalived日志重定向

    1.配置 /etc/sysconfig/keepalived 文件 2.添加keepalived日志保存位置的配置 3.修改 /lib/systemd/system/keepalived.servic ...

  5. delphi中 注意一点,record 类型 参数默认是 值拷贝,class 参数 默认是传地址;值传递,指针传递、引用传递

    作为函数的入参,若是record类型,默认是值拷贝,效率低,若要传指针,需要加 var ; 作为函数的入参,若是 class类型,默认是传地址,不需要加var unit Unit1; interfac ...

  6. Navicat 15 for MySQL 破解【我亲测可用】

    1.去官网下载正版 https://www.navicat.com.cn/ 2.破解下载:https://files-cdn.cnblogs.com/files/del88/NavicatKeygen ...

  7. Java实现文件下载断点续传(一)

    参考文章:https://www.ibm.com/developerworks/cn/java/joy-down/ 1.原理介绍 想象一下我们下载一个10G的文件,当下载到9.99G的时候断网了... ...

  8. 使用 CMake 编写 Windows 静态库

    最近有一个多个 .h .cc .cpp 编译成静态库的需求,故记录下过程 静态库不同于动态库,它不需要 main 入口,只要各个源文件与头文件能对应,也就是源文件和头文件引用的头文件能够找到函数的符号 ...

  9. C++ 值,指针,引用的讨论

    源自 stackoverflow 论坛,很有意义 第一个问题,引用传递和按值传递的场合 There are four main cases where you should use pass-by-r ...

  10. Direct2D CreateBitmap的使用

    当需要设置位图的混合模式时,应该使用ID2D1DeviceContext而不是ID2D1RenderTarget. 代码如下: #define WIN32_LEAN_AND_MEAN #include ...