day5 面向对象
面向对象的特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系.
匿名对象
匿名对象:没有名字的实体,也就是该实体没有对应的变量名引用。
2.2匿名对象的用途
1,当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。
为什么只对方法,而不调用属性呢?因为匿名对象调用属性没意义。
如果对象要多成员进行多次调用,必须给对象起个名字。不能在使用匿名 对象。
2,匿名对象可以实际参数进行传递。
2:匿名对象的简单演示
1:new Car().run();
3:内存结构图
1:new Car().num=5;
2:new Car().clor="blue";
两个new 是两个不同的对象,在堆内存中有不同的空间,相互不相互干扰。
4:匿名对象的使用
1:当只使用一次时可以使用匿名对象。执行完毕到;后该对象就变成了垃圾。
new Car().run();
2:执行方法时,可以将匿名对象作为实际参数,传递进去。
封装
我们日常使用的电脑主机,把cpu、内存、主板等等都封装到机箱里面去。假如没有机箱的话的出现什么问题,主机、主板全部都散落在一处,然后开机没有开机按钮,那么需要我们直接操作接跳线才能把电脑开启。这样子的话假如操作不慎的话,会让机器损坏危险,那么假如用机箱封装起来的话,那么就不需要这样子做了。体现了封装的---安全特性。
你拿电脑去加内存,可以直接给电脑给维修的人,等他加好内存了之后。你拿到的还是那个机箱,里面发生了怎样子的变化你并不知道。封装的第二个好处-将变化隔离。
在机箱里面提供一个开机按钮,而不需要你直接使用跳线开机的话,体现了封装的—便于使用的特性。
只要机箱提供了一个开机的功能,然后无论这个机箱拿到哪里去,都可以使用这个开机的功能.体现了封装的---提供重复性的特性。
1、 没有封装
模拟问题
- 描述Employee类。定义姓名,工号,性别的成员变量,和工作的方法。成员使用public修饰。
- 创建Employee对象,对象.成员的方式进行赋值。最后该对象调用工作方法。
- 总结:如果不使用封装,很容易赋值错误,并且任何人都可以更改,造成信息的 不安全。
- 问题解决:使用封装
封装的实现
1:设置类的属性为private(关键字),不能使用对象名.属性名的方式直接访问对象的属性。
封装的好处
1:隐藏了类的具体实现
2:操作简单
3:提高对象数据的安全性
构造方法
1.我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?
构造方法的作用:对对象进行初始化
构造函数与普通的函数的区别
- 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。
- 构造函数是在对象建立时由jvm调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。
- 普通函数可以使用对象多次调用,构造函数就在创建对象时调用。
- 构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。
- 构造函数没有返回值类型。
构造函数注意的细节
1. 当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。
备注:可以通过javap命令验证。
2.在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。
class Perosn{
private int id; private String name; private int age; public Perosn(){
cry();
}
public Perosn(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} public void cry(){
System.out.println("哇哇哇....");
} }
问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用cry()函数,但是这样子的话造成了代码重复问题,那么怎么解决呢?构造代码块。
构造代码块
构造代码块作用:给所有的对象进行统一的初始化。
class Perosn{
private int id; private String name; private int age; {
cry();// 每个Person对象创建出来都会执行这里的代码
} public Perosn(){
cry();
}
public Perosn(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} public void cry(){
System.out.println("哇哇哇....");
} }
作用
1:给对象进行初始化。对象一建立就运行并且优先于构造函数。
2:与构造函数区别
1:构造代码块和构造函数的区别,构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。
2:构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。
例如孩子一出生统一哭
class Boy { String name;
int age;
String gender;
// 构造代码块,给所有对象进行初始化。
{
System.out.println("哭。。。");
} Boy() {
System.out.println("无参构造");
} Boy(String n, int a, String g) {
name = n;
age = a;
gender = g;
System.out.println("有参构造");
} void run() {
System.out.println("跑...");
} } class Demo9 { public static void main(String[] args) { System.out.println();
Boy b = new Boy(); Boy b2 = new Boy("jack", 1, "男"); }
}
this关键字
疑问:创建的p对象为什么没有值。
解答:name与age在指定的构造函数里面已经存在,当name=name这个语句执行的时候,如果jvm在该方法内能寻找到该变量,则不会去寻找成员变量,那么要想指定给成员变量或对象的属性进行初始化赋值,那么必须指定name是成员属性。
1、this 的概述
this关键字代表是对象的引用。也就是this在指向一个对象,所指向的对象就是调用该函数的对象引用。
1:没有this会出现什么问题
1:定义Person类
1:有姓名年龄成员变量,有说话的方法。
2:定义构造方法,无参的,多个有参的。都要实现。
Vclass Person { String name;
int age;
//无参数构造函数
Person() {
System.out.println("这是无参的构造函数");
} //有参数构造函数
Person(int a) {
age = a;
System.out.println("有参构造1");
}
//有参数构造函数
Person(String n) {
name = n;
System.out.println("有参构造2");
}
//有参数构造函数
Person(int a, String n) {
age = a;
name = n;
System.out.println("有参构造");
} //普通函数
void speak() {
System.out.println("hah");
}
2;假设定义40个成员变量,第一个有参构造初始化20个变量,第二个有参构造需要初始化40个变量。
1:第二个有参构造想要使用第一个有参构造。
2:成员函数相互之间可以调用。构造函数可以吗?
3:编译失败,那么构造函数之间应该存在相互调用的模式。this就可以完成这个工作。
class Person {
String name;
int age; Person() { }
Person(String n){
name=n;
}
Person(String n, int a) {
//编译报错
Person(n);
age = a;
}
}
3:总结:实际工作中,存在着构造函数之间的相互调用,但是构造函数不是普通的成员函数,不能通过函数名自己接调用
所以sun公司提供this关键字。
2:this是什么
1:在构造函数中打印this
2:创建对象,打印对象名p
3:this和p是一样的都是内存地址值。
4:this代表所在函数所属对象的引用。
class Student {
String name;
String gender;
int age; Student() { } Student(String name) {
this();
this.name = name;
} Student(String name, String gender, int age) {
this(name);
System.out.println(this); // Student@c17164 this.gender = gender;
this.age = age;
} void speak() {
run();
System.out.println("姓名:" + name + " 性别:" + gender + " 年龄:" + age
+ " 哈哈!!!");
} void run() {
System.out.println("run.....");
} } class Demo2 { public static void main(String[] args) { Student p = new Student("jack", "男", 20);
System.out.println(p); // Student@c17164 Student p2 = new Student("rose", "女", 18);
System.out.println(p2); p.speak(); }
}
3:递归构造函数调用
1:构造函数的相互调用
在编译时期会报错
class Student {
String name;
String gender;
int age;
//构造函数见相互调用
Student() {
this(null);
}
//构造函数见相互调用
Student(String name) {
this();
this.name = name;
} Student(String name, String gender, int age) {
this(name);
this.gender = gender;
this.age = age;
} void speak() {
run();
System.out.println("姓名:" + name + " 性别:" + gender + " 年龄:" + age
+ " 哈哈!!!");
} void run() {
System.out.println("run.....");
} }
4:this只能在非静态中(没有static修饰的)函数使用
5:构造函数间相互调用必须放在构造函数的第一个语句中,否则编译错误
6:可以解决构造函数中对象属性和函数形参的同名问题。
day5 面向对象的更多相关文章
- python3.x Day5 面向对象
类:类是指:对具有相同属性的事物的抽象.蓝图.原型.在类中定义了这些事物都具备的属性和共同的方法. 对象:一个对象就是一个类实例化以后的实例,一个类必须经过实例化后才能在程序中被使用,一个类可以实例化 ...
- python学习 day19 configparser模块 os模块 subprocess模块
上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...
- PYTHON开发--面向对象基础二
一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1. 私有成员 1.1 普通方法种的私有成员 class Foo: def __init__(self, n ...
- python模块、面向对象编程
目录: 模块补充 xml 面向对象 一.模块补充 shutil: 文件复制模块:进行文件copy.压缩: 使用方法: 将文件内容拷贝到另一个文件中,可以部分内容 shutil.copyfileobj( ...
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
随机推荐
- python 中读取excel
第一步: 先下载一个xlrd 包 # pip install xlrd import xlrd from datetime import date, datetime file = '学生信息表.x ...
- css jquery 实现轮播效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- iOS 转场动画核心内容
CATransition——转场动画 CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点. ...
- php验证身份证号码有效性
<?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...
- linux c编程:网络编程
在网络上,通信服务都是采用C/S机制,也就是客户端/服务器机制.流程可以参考下图: 服务器端工作流程: 使用socket()函数创建服务器端通信套接口 使用bind()函数将创建的套接口与服务器地址绑 ...
- 搭建vps***
快速搭建ShadowSocks wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/tedd ...
- StreamWriter结合UTF-8编码使用不当,会造成BOM(Byte Order Mark )问题生成乱码(转载)
问: I was using HttpWebRequest to try a rest api in ASP.NET Core MVC.Here is my HttpWebRequest client ...
- Win8+VS2012 配置OpenGL SuperBible5 环境
(1)glew: 版本:1.7.0-win32 下载地址:https://sourceforge.net/projects/glew/files/glew/ 安装步骤: 将include文件夹下的.h ...
- UVA - 10305 【全排列】
题意 要求给出一组 包含 1 - N 的数字的序列 要求这个序列 满足 题给的限制条件 比如 1 2 就是 1 一定要在 2 前面 思路 因为 数据规模较小 可以用 全排列 然后判断每个序列 是否满足 ...
- 电话聊天狂人 【STL】
7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...