day10-面向对象
面向对象
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关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化以及对类中构造器的调用
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写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构造方法(构造器)
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。
构造器有以下两个特点:
必须和类的名字相同
必须没有返回类型,也不能写void
构造器的作用:
1. 使用new关键字,本质是在调用构造器
2. 用来初始化值
注意点:
- 定义有参构造后,如果想要使用无参构造,必须显示地定义一个无参的构造
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);
}
}

解析如下图所示:

- 首先在堆中加载Application类,将该类中的方法放入到堆中的方法区中,类中有main()方法和String常量“旺财”“咪咪”String
注意这里age=3的3就不是常量,只是int类型的数字。因为“旺财”是字符串,String默认是final修饰的,所以是常量
然后执行main()方法,在main()方法中按顺序执行程序。
首先是创建了一个dog实例对象:
Pet dog = new Pet()- 运行到new Pet()时,会在堆方法区中加载 Pet 类。在Pet类中有name和age字段以及shout()方法,在加载对象模板时,name的默认值为null,age默认值为0
- 当=dog时,通过模板生成了一个具体的dog对象。注意,在栈中的dog只是一个引用变量名,真正的对象在堆中。name的默认值为null,age默认值为0
接着进行main()方法中的语句
dog.name = "旺财"; dog.age = 3;,将值赋给dog对象的name和age属性。接着的dog.shout();语句调用Pet类中的shout()方法。然后输出dog对象的属性,cat对象的执行过程同理
5.简单小结
类与对象
类是一个模板:抽象;对象是一个具体的实例
方法
定义、调用
对象的引用
引用类型:基本类型(8种)
对象是通过引用来操作的:栈--->堆(地址),引用指向堆里面真实的地址
属性:字段Field 成员变量
默认初始化:
数字 : 0 0.0
char : u0000
boolean : false
引用类型:null
属性的定义:修饰符 属性类型 属性名 = 属性值
对象的创建和使用
必须使用new关键字创建对象,还要有构造器
对象的属性: 对象名.属性
对象的方法: 对象名.方法
类中只有两个东西:属性和方法
静态的属性 属性
动态的行为 方法
6.封装
该露的露,该藏的藏
- 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
封装的意义:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一借口
- 系统可维护性增加了
快捷键Alt+insert呼出快捷菜单:选择Getter和Setter可以快速生成get、set方法

day10-面向对象的更多相关文章
- 阶段01Java基础day10面向对象05
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格 ...
- day10<面向对象+>
面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四 ...
- Java相关英语单词
day1 Java概述 掌握 .JDK abbr. Java开发工具包(Java Developer's Kit) (abbr.缩写) .JRE abbr. Java运行环境(Java Runtime ...
- 尚硅谷Java——宋红康笔记【day6-day10】
day6 一.数组的概述 1.数组的理解:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 2.数组相关的概念: 数组名 元素 ...
- day10 浅谈面向对象编程
面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的. 第四步概括动词设计成方法.动作的产生往往 ...
- python day10: 反射补充,面向对象
目录 pythdon day 10 1. 反射补充 16. 面向对象 16.1 面向对象初步介绍 16.2 面向对象和面向过程区别 16.3 对象的进化 17. 类class 17.1 类的定义 17 ...
- Day10 类与对象-面向对象编程(1)
面向对象编程(OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据. 抽象 三大特征: 封装 继承 多态 从认识论角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的, ...
- python 基础知识-day10(面向对象)
1.面向对象的概念 拥有共同属性的一类进行归类的过程叫做面向对象. 2.注意事项 class定义类的时候,类名的首字母必须大写 3.面向对象案例 1 class Person(object): 2 d ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
随机推荐
- electron useContentSize的详解
useContentSize作用就是 由于window窗体有边框和title区域menu等,该区域不能显示自己的html页面(new BrowserWindow 时设置frame=false禁用边框 ...
- C++——编译和链接原理笔记
我们在学习和开发C++程序中,理解编译和链接的原理至关重要.下面将学习一下C++程序是如何从源代码转换为可执行文件的过程,并结合示例代码进行说明.也是为了解开自己在刚学习C++的时候,编译时间长的疑惑 ...
- CF1851
A 氵 B 把奇数和偶数拿出来分别排序,然后按下标归并,看看得出的结果是不是排好序的. C 如果头尾同色,就找有没有 \(k\) 个位置和头尾同色: 否则从头找 \(k\) 个和头同色的,然后再在这之 ...
- Ubuntu安装typecho博客
Ubuntu安装typecho博客 简介 名称的来历 Typecho 是由 type 和 echo 两个词合成的,来自于开发团队的头脑风暴. Type,有打字的意思,博客这个东西,正是一个让我们通过打 ...
- NC25064 [USACO 2007 Mar G]Ranking the Cows
题目链接 题目 题目描述 Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate ...
- 蔚来杯2022牛客暑期多校训练营3 AC
比赛链接 A 题解 知识点:LCA. 队友写的,俺不会qwq.预处理出关键点序列的在树A B上的前缀LCA和后缀LCA,枚举去掉的关键节点并使用前后缀LCA算出剩余节点的LCA比较权值即可. 时间复杂 ...
- RocketMQ—RocketMQ消息重复消费问题
RocketMQ-RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题: 生产者多次投递消息:如果生产者发送消息时,连接有延迟,MQ还没收到消息,生产者又发送了一次消息 ...
- java 注解结合 spring aop 自动输出日志新增拦截器与过滤器
auto-log auto-log 是一款为 java 设计的自动日志监控框架. 前面已经写过了两篇: java 注解结合 spring aop 实现自动输出日志 java 注解结合 spring a ...
- 惠普CP1025 因转印离合器导致打印不全大片空白的问题
问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似 ...
- 【Unity3D】动态路障导航
1 NavMeshObstacle组件 导航系统.分离路面导航中路障都是静态的,程序运行过程中烘焙的导航网格一直不变,本文将进一步讲解动态路障场景下导航的实现. 对于动态路障游戏对象,除了要设 ...