面向对象编程

笔记Notes

  • 面向对象三条学习主线

  • 面向过程 VS 面向对象

  • 类和对象

  • 创建对象例子

  • 面向对象的内存分析

  • 类的属性:成员变量

  • 成员变量 VS 局部变量

  • 类的方法

  • 方法的重载

  • 可变个数形参

  • 面向对象:封装性

  • 访问权限修饰符

  • 构造方法(构造器)

  • 给属性赋值的方法

  • UML类图

  • this 关键字

  • 面向对象学习主线

    • 类及类的成员:属性,方法,构造器,代码块,内部类

    • 面向对象的三大特性:封装性,继承性,多态性

    • 其他关键字:this,super,interface,final,static......

  • 面向过程 vs 面向对象

    • 面向过程:强调的是功能行为

    • 面向对象 :强调具备了功能的对象

  • 类和对象的区别

    • 类:抽象的(汽车设计模板)

    • 对象:具体的,类的实例(根据模板造出的汽车)

  • 类的成员:属性和方法

    • 属性 = field = 成员变量

    • (成员)方法 = 函数 = method

  • 面向对象的例子

1.创建一个类,并在类中提供必要的属性和方法

2.由类派生出对象。(创建对象)

3.调用对象中的属性和方法。(对象名.属性名/方法名)

//创建一个类

class Person{

//属性

String name;

int age;

char sex;

//方法

public void run(){

System.out.println(name + "跑起来");

}

public void say(){

System.out.println(name + "今年" + age);

}

}

// main 方法中

Person person = new Person();

//调用属性 :对象名.属性名

person.name = "王庆港"; //给属性赋值

person.age = 23;

//获取属性的值

String name = person.name;

System.out.println("name=" + name);

//调用方法 :对象名.方法名

person.run();

person.say();

  • 面向对象的内存分析

    • 同一个类创建的多个对象,每个对象独自拥有一份属性。

    • 当修改其中一个对象的属性的值后,其它对象的该属性不会受到影响

  • 类的成员之 :属性(成员变量)

      • 变量的分类:

①按照数据类型分 :基本数据类型 vs 引用数据类型

②按照位置分 :成员变量  vs 局部变量

    • 成员变量和局部变量  相同点:

①变量的声明的格式都是一样的。

②变量都有作用域

③变量都是先声明后使用

    • 成员变量和局部变量 不同点:

①局部变量:在方法里,方法的形参,构造器中,构造器的形参,代码块

②成员变量: 在类中方法等结构外

    • 权限修饰符:

①局部变量:不能使用权限修饰符修饰

②成员变量:可以使用四种权限修饰符(public protected 缺省的(default) private)

    • 内存:

①局部变量:在内存的栈中

②成员变量:在内存的堆(对象)中

    • 默认值:

①局部变量 :没有默认值

②成员变量 :有默认值(和数组元素的默认值是一样的)

byte,short,int,long -> 0

float,double -> 0.0

boolean -> false

char -> \u0000

引用数据类型 -> null

class Animal{

//属性(成员变量)

public String name = "动物";

int legs;

protected boolean isLive = true;

{//代码块

String address = "";//局部变量

}

public Animal(){}

//构造器

public Animal(int sex){//构造器的形参

int a = 10;//局部变量

}

//方法

public void say(int sex){//方法的形参

//局部变量

int age = 10;

age = 20;

name = "大锤";

}

}

    • 不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。

    • 如:new Person().shout();

  • 类的成员:方法(method)

    • Java里的方法不能独立存在,所有的方法必须定义在类里。

    • 方法的声明格式:

修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){

方法体程序代码

return 返回值;

}

    • 权限修饰符 :public protected 缺省的  private (先用public)

①void/具体的类型(基本数据类型、引用数据类型):

②void : 表示该方法没有返回值

具体的类型 :调用该方法会有返回值。

注意:返回数据需要使用return关键字。return 后面跟需要返回的数据。

    • 方法名 :只需要遵守标识符的规则和规范即可

(形参相同的情况下,同一个类中的方法名不能相同)。

    • 形参列表 :可以有0个1个或多个。多个之间使用","隔开。

①作用 :用来通知方法的调用者调用此方法时需要传递数据。

②注意:实参的类型必须和形参的类型保持一致

    • 方法体 :方法功能的具体体现。

注意 :只有调用方法时方法体才会执行。

对象数组题目:

定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。

问题一:打印出3年级(state值为3)的学生信息。

问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息

提示:

1) 生成随机数:Math.random(),返回值类型double;

2) 四舍五入取整:Math.round(double d),返回值类型long。

class Student1{

int  number;

int state;

int score;

@Override

public String toString() {

return "Student1 [number=" + number + ", state=" + state + ", score=" + score + "]";

}

}

public class StuInfo {

public static void main(String[] args) {

// 创建对象数组

Student1[] studentArr = new Student1[20];

// 循环创建对象并赋值,传给对象

for (int i = 0; i < 20; i++) {

Student1 student1 = new Student1();

student1.number = i;

student1.state = (int)Math.round( (Math.random()*7));

student1.score = (int) (Math.random()*100);

studentArr[i] = student1;

}

System.out.println("---------打印排序前的学生信息-------------");

for (int i = 0; i < studentArr.length; i++) {

System.out.println(studentArr[i]);

}

System.out.println("----------打印state为3的学生信息---------");

// 循环查找对象数组中state值为3的对象,打印输出对象信息

for (int i = 0; i < studentArr.length; i++) {

if (studentArr[i].state == 3) {

System.out.println(studentArr[i]);

}

}

System.out.println("----------------------------------------");

// 使用冒泡排序按学生成绩排序,并遍历所有学生信息

// 思路:两个循环遍历数组中的对象的成绩,若对象的成绩小于后一个,则交换对象的位置

for (int i = 0; i < studentArr.length -1; i++) { // 外层循环决定冒泡排序的次数,为数组长度-1

for (int j = 0; j < studentArr.length - i -1; j++) { // 内层循环决定每次多少次冒泡,为

if (studentArr[j].score > studentArr[j+1].score) { // 如果前面的对象小于大于后面的,就叫交换类数组地址

Student1 temp = studentArr[j];

studentArr[j] = studentArr[j+1];

studentArr[j+1] = temp;

}

}

}

// 注意!!!!!!!!!!

// 冒泡排序交换的值的数组的下标为内循环的循环变量

System.out.println("------打印排序后的信息-------");

// 打印排序后的信息

for (int i = 0; i < studentArr.length; i++) {

System.out.println(studentArr[i]);

}

}

}

  • 重载的概念、特点、实例

①在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

②与返回值类型无关,只看参数列表,且参数列表必须不同。

(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。

③示例:

//返回两个整数的和

int add(int x,int y){return x+y;}

//返回三个整数的和

int add(int x,int y,int z){return x+y+z;}

//返回两个小数的和

double add(double x,double y){return x+y;}

注意!!:

①不同的形参列表 :形参的个数,顺序,类型不同

②方法的重载和权限修饰符,返回值类型,形参的名字无关。

③判断方法:只看 方法名 + 形参列表(看形参和实参的类型)

  • 可变个数形参

    • 格式 :变量的类型 ... 变量名

    • 说明:

①可变形参的底层就是一个数组

②在可变形参的方法中,和可变形参相同类型的数组的方法不构成重载。

③在形参列表中可变形参只能放在最后

④在同一个方法的形参列表中只能有一个可变形参。

⑤ 可变形参的个数可以是0个1个或多个

  • 方法的参数传递

    • 基本数据类型的参数传递

    • 引用数据类型的参数传递

    • 方法的参数传递

    • 面向对象:封装

      • 为什么要使用封装性?

在创建对象以后,就可以通过对象名.属性名这种方式对属性直接进行操作。这种操作对于属性只有类型和范围的限制。但是在实际开发中我们会有更多的其它的限制条件。而这些限制条件又不能在属性的声明处加以限制。我们采取取如下方式

①使用权限修饰符对属性进行权限的限制,那么在类的外部就不能随意的再调用类中的属性

②提供公共的方法,在方法中可以加以限制其它的条件。然后可以通过该方法给属性赋值和获取属性的值。

      • 封装性的体现(狭义上):

①将属性私有化。(private修饰属性)

②提供公共的set/get方法。(set方法用来给属性赋值,get方法用来获取属性的值)

      • 封装性的体现(广义上):

①可以使用四种权限修饰符:private,缺省的,protected,public

②四种权限修饰符可以修饰 :属性,方法,构造器,内部类

③类只能被public和缺省的修饰。

  • 四种访问权限修饰符

  • 构造方法(构造器)

    • 构造器的特征

      • 它具有与类相同的名称

      • 它不声明返回值类型。(与声明为void不同)

      • 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值

    • 构造器的作用:创建对象;给对象进行初始化

      • 如:Order o = new Order();    Person p = new Person(“Peter”,15);

    • 根据参数不同,构造器可以分为如下两类:

      • 隐式无参构造器(系统默认提供)

      • 显式定义一个或多个构造器(无参、有参)

    • 注  意:

      • Java语言中,每个类都至少有一个构造器

      • 默认构造器的修饰符与所属类的修饰符一致

      • 一旦显式定义了构造器,则系统不再提供默认构造器

      • 一个类可以创建多个重载的构造器

      • 父类的构造器不可被子类继承

    • 构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。

  • 给属性赋值的方法

    • 赋值的位置:

① 默认初始化:int a;

② 显式初始化:int a = 0;

③ 构造器中初始化

④ 通过“对象.属性“或“对象.方法”的方式赋值

    • 赋值的先后顺序:

① - ② - ③ - ④

  • JavaBean:Java语言编写的可重用组件

    • 定义:是一个普通的Java类,但是符合如下标准

    • ①类是公共的

    • ②有一个无参的公共的构造器

    • ③有属性,且有对应的get、set方法

  • UML类图

      • ①+ 表示 public 类型, - 表示 private 类型,#表示protected类型

      • ②方法的写法:方法的类型(+、-)  方法名(参数名:参数类型):返回值类型

    • this 关键字

      • this 是什么?

①它在方法内部使用,即这个方法所属对象的引用;

②它在构造器内部使用,表示该构造器正在初始化的对象。

      • this作用域:this 可以调用类的属性、方法和构造器

      • 适用情形:当在方法内需要用到调用该方法的对象时,就用this。

具体的:我们可以用this来区分属性和局部变量。

public void setAge(int age){

age = age;//局部变量 :就近原则(属性名和局部变量名相同时默认调用的是局部变量)

System.out.println("===========" + age);

}

    • this 调用构造器

总结Summary

  • 面向对象的内存分析

  • 成员变量与局部变量

  • 构造器

  • 函数重载

Java编程基础阶段笔记 day 07 面向对象编程(上)的更多相关文章

  1. Java编程基础阶段笔记 day01 Java语言概述

    ​目录内容 DOS命令 电脑配置 Java语言的特性 Java两种核心机制 Java语言环境搭建 第一个Java程序 注释 Java语句说明 编程风格 作业 常用的DOS命令 dir :    列出当 ...

  2. Java编程基础阶段笔记 day04 Java基础语法(下)

    day04 Java基础语法 (下) 笔记Notes要点 switch-case语句注意 switch-case题目(switchTest5) 循环执行顺序 if-else 实现3个整数排序 Stri ...

  3. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  4. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  5. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  6. Python(三)基础篇之「模块&面向对象编程」

    [笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  7. Python基础入门(6)- 面向对象编程

    1.初识面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本篇随笔将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象 ...

  8. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  9. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

随机推荐

  1. Ruby中的数值

    数值类型 Ruby中所有数值都是Numeric类的子类对象,数值都是不可变对象. 数值类型的继承关系如下: Integer是整数,Float是浮点数类型,Rational是分数. 对于整数,要么是Fi ...

  2. mysql报错(Not unique table/alias)

    Not unique table/alias 错误编号:1066 问题分析: SQL 语句中出现了非唯一的表或别名. 解决方法: 1.请检查出现问题位置的 SQL 语句中是否使用了相同的表名,或是定义 ...

  3. Python之Pandas库学习(三):数据处理

    1. 合并 可以将其理解为SQL中的JOIN操作,使用一个或多个键把多行数据结合在一起. 1.1. 简单合并 参数on表示合并依据的列,参数how表示用什么方式操作(默认是内连接). >> ...

  4. ZOJ 3795:Grouping(缩点+最长路)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5303 题意:有n个人m条边,每条边有一个u,v,代表u的年龄大于等于v,现在要 ...

  5. Java 集合类Hashmap

    一.HashMap 简介 HashMap在程序员的开发过程中是一个十分常用的集合类,它是一个以键值对形式存在的集合类, 在开发中我们可以利用的它的一个key存在即替换的特性,实现一个更新的去重的操作. ...

  6. 12306抢票系统——ER图及数据表

    12306自动抢票系统——ER图及数据表 1. 抢票系统ER图 数据表 2.抢票系统数据结构表 (1)列车表 Trains table 字段名 数据类型 说明 是否为主键 Train_id strin ...

  7. 关系型数据库MySql简介

    什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就 ...

  8. SpringBoot 2.0.3 源码解析

    前言 用SpringBoot也有很长一段时间了,一直是底层使用者,没有研究过其到底是怎么运行的,借此机会今天试着将源码读一下,在此记录...我这里使用的SpringBoot 版本是  2.0.3.RE ...

  9. 搭建Spring Initializr服务器

    前言 按照网上很多教程,出错特别多.首先是GitHub和maven仓库的网络环境比较差,踩了很多坑:其次是SpringInitializr更新迭代几个版本,0.7.0我也没能弄成功.索性就用了旧版本0 ...

  10. Java EE核心框架实战(1)

    内容前言:本书适合具有一定Java编程基础的读者阅读,增强其项目实战能力. 2014年9月第1版 下载本书所有源代码可通过  http://pan.baidu.com/s/1i3sshXr 本书配套的 ...