这一周的第一天的内容是面向对象的封装,以及对方法的调用。实在时没法单独拿出来单说,就结合这一节一起说了。

我实在是被继承中的super用法给弄的有点晕,程序总是不能按照我想的那样,不是说结果,而是实现过程,很明显复杂,后来进行推敲后,原来是我的理解出了差错。

先把前对象的的内容补补

在开始面向对象之前,我们先来了解一下,Java的内存分配:(在之前我也说过,只是简单的提到)

Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域

一、面向对象的三大特性:

  封装、继承、多态。

1、封装

  在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

  封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

  要访问该类的代码和数据,必须通过严格的接口控制。

  封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

  适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

1.1 封装的优点

  • 1. 良好的封装能够减少耦合。

  • 2. 类内部的结构可以自由修改。

  • 3. 可以对成员变量进行更精确的控制。

  • 4. 隐藏信息,实现细节。

1.2 实现Java封装的步骤

 1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

    public class Person { private String name; private int age; } 

  这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

 2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

 public class Person{
private String name;
private int age; ​
public int getAge(){
return age;
} ​
public String getName(){
return name;
} ​
public void setAge(int age){
this.age = age;
} ​
public void setName(String name){
this.name = name;
}
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

1.3 this

this指针:(实际上,每个非static方法中都隐含这一个this指针指向当前正在调用该方法的对象。)

1.4 static

static(静态的):

1、如果在一个属性的前面加上static ,那么这个属性就不是某一个对象的了,而是N个对象共用的了。在静态区存放,不释放。
static属性变量是属于类本身的,没有对象我们仍然可以通过类名的方式进行访问该类内部的static属性。(static方法也可以)
注意:类可以直接调用,实例化出来的对象当然也可以进行调用。
理解:模型都可以,模型造的对象当然可以。

2、加上static的确是属于类本身的,但是要去访问它必须控制符是非私有的,如果控制符是私有的,则不能直接通过类名进行访问!!
理解:private static void a(){} private static int i;都是不可以直接通过类名进行访问,因为前面的控制符是private

3、非静态的方法可以访问静态成员,反之不可以。非私有的静态成员才能通过类名直接调用。
理解:静态的方法和静态的变量属于类本身,不是静态的方法必须通过对象进行调用,在实例化对象的同时也包含了静态的方法,当然可以。反之不可以。

下面,我们用实例来理解static的作用:

实例1:实现一个类只允许有一个对象

 package com.wyh.Iterator;

 /**
* @author WYH
* @version 2019年11月10日 上午10:18:07
* 该程序证明:
* 实现一个类只允许实例化一个对象
*/ class A2{
public int i = 2; private static A2 aa = new A2(); private A2() { } public static A2 getA2() {
return aa;
}
} public class static03 {
public static void main(String[] args) {
A2 aa1 = A2.getA2();
A2 aa2 = A2.getA2();
aa1.i = 90;
System.out.println("aa2:"+aa2.i);//说明aa1和aa2是同一个对象 if(aa1 == aa2) {
System.out.println("说明aa1和aa2是同一个对象");
}else {
System.out.println("说明aa1和aa2不是同一个对象");
}
} }

实例2:一个类无论实例化多少对象,其中一个变量只有一个。

  package com.wyh.Iterator;

 /**
* @author WYH
* @version 2019年11月10日 上午9:32:57
*/
public class static01 {
private static int i; public static01() {
i = i+1;
} // static void add() {
// i = i+1;
// }
// public static void main(String[] args) {
static01 s1 = new static01();
// s1.add();
static01 s2 = new static01();
// s2.add();
static01 s3 = new static01();
// s3.add();
static01 s4 = new static01();
// s4.add();
static01 s5 = new static01();
// s5.add();
System.out.println("总共实例化了:"+i+"个对象");
} }

2、继承

什么是继承?在我们的后面实际操作过程中,很多时候,许多的对象拥有一些重复的操作,而且,这些对象都是同一种现实属性的派生。例如,我们的男人和女人都是人类,那么人类就是男人,女人的父类,男人和女人继承了人类这个父类,称之为子类

1、继承,我们用extends来表示:比如刚刚说的男人继承了人类这个类   public class man extends human{}

2、提到了继承父类,那继承过来的成员变量和一些方法,我们怎么去使用呢?

2.1 super

  终于讲到令人头疼的super了。

  

重写:当子类需要父类的功能,而子类有新的内容,可以重写父类中的方法。在实际开发过程中,随着代码量的逐渐增加,维护成了一个很大的问题,如果需要对某个方法进行修改,其本身代码以及其子类代码都会受到影响,而重写则很好的解决了这个问题。方法重写又称为方法覆盖、方法复写。

方法重写特点

在子类和父类中,出现了方法声明相同的情况
子类的方法声明要和父类相同
子类要重写的方法,方法的权限修饰符不能比父类更低(public 、protected  、default  、private 权限依次增加)
父类私有的方法,子类不能进行方法重写

方法重写和方法重载的区别:

方法重写:子类和父类中方法相同,两个类之间的关系,函数的返回值类型、函数名、参数列表都一样
方法重载:指在同一个类中,多个方法名相同,他们的参数列表不同(个数不同,数据类型不同)

重写方法时要注意的地方:

1.方法重写时, 方法名与形参列表必须一致。
2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。
4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。 Exception(最坏) RuntimeException(小坏)

  先来看一个例子:

A类:(父类)

 package day02;

 /**
* @author WYH
* @version 2019年11月12日 下午2:52:37
*/
public class A { protected String name;
protected String health;
protected String love; public String getName() {
return name;
}
public String setName(String name) {
return this.name = name;
}
public String getHealth() {
return health;
}
public void setHealth(String health) {
this.health = health;
}
public String getLove() {
return love;
}
public void setLove(String love) {
this.love = love;
}
public A() {
super();
// TODO Auto-generated constructor stub
}
public void eat()
{
System.out.println("吃饭!");
}
public void work()
{
System.out.println("工作!");
}
public void sleep()
{
System.out.println("睡觉!");
} }

B类:(子类,继承了A父类)

 package day02;

 /**
* @author WYH
* @version 2019年11月12日 下午2:53:02
*/
public class B extends A{
private int i; public int getI() {
return i;
} public void setI(int i) {
this.i = i;
} public B(){
super();
} public void work()
{
super.work(); //使用super关键字调用父类方法
System.out.println("学习!");
System.out.println("娱乐!"); }
}

D类:(子类,继承了A父类)

 package day02;

 /**
* @author WYH
* @version 2019年11月12日 下午2:53:02
*/
public class D extends A{
private int i; public int getI() {
return i;
} public void setI(int i) {
this.i = i;
} public D(){
super();
} public void work()
{
super.work(); //使用super关键字调用父类方法
System.out.println("学习!");
System.out.println("娱乐!"); }
}

C类:(测试类,主类)

 package day02;

 /**
* @author WYH
* @version 2019年11月12日 下午2:53:34
*/
public class C {
public static void main(String[] args) {
/*A aa = new A();
aa.work();*/ A bb = new B();
A dd = new D();
bb.name = bb.setName("456");
dd.name = dd.setName("123");
System.out.println(bb.name);
System.out.println(dd.name);
System.out.println(bb.getName());
bb.work();
} }

解说:

  我们可以看到,我现在父类,A类种定义了name;health;love;三个成员变量,为了可以实现继承,我们不将它定义成私有变量,同时父类里面拥有三个方法,吃饭,睡觉,工作。

   B类和D类继承了A类,同时我们将work方法进行了重写,添加了自己特有的方法。

然后,我们来看看结果:

  

后来,我们发现,通过super,可以调用父类的方法,以及可以通过super调用父类的成员变量。这个例子很好的概括,this指针,super的用法,重写的用法。

多态我们后续进行补充。。。

大数据之路week01--day02我实在时被继承super这些东西搞的头疼,今天来好好整理以下。的更多相关文章

  1. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  2. 大数据之路week04--day06(I/O流阶段一 之异常)

    从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房 ...

  3. C#码农的大数据之路 - 使用C#编写MR作业

    系列目录 写在前面 从Hadoop出现至今,大数据几乎就是Java平台专属一般.虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势. ...

  4. 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作

    一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...

  5. 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例

    一.引言 基于Hive+Hadoop模式构建数据仓库,是大数据时代的一个不错的选择,本文以郑商所每日交易行情数据为案例,探讨数据Hive数据导入的操作实例. 二.源数据-每日行情数据 三.建表脚本 C ...

  6. 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM

    引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...

  7. 胖子哥的大数据之路(7)- 传统企业切入核心or外围

    一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...

  8. 胖子哥的大数据之路(四)- VisualHBase功能需求框架

    一.引言 大数据在结构化数据存储方面的应用需求越来越明确,但是大数据环境下辅助开发工具的不完善,给数据库管理人员和开发人员带来的不变难以言表,基于此创建了开源项目VisualHBase,同时创建了Vi ...

  9. 大数据之路week01--自学之集合_1(Collection)

    经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...

随机推荐

  1. 关于ajax提交表单的一些实例及遇到的问题和解决办法

    ajax提交的表单有两种情况: 第一种:input type类型没有file上传文件类型的表单 第二种:input type类型有file上传文件类型的表单 之所以分为两种:是因为原生ajax是不能提 ...

  2. MacOS 安装MysqlDB 问题解决方案( 解决 IndexError: string index out of range)

    pip install MySQL-python时报错如下: Command "python setup.py egg_info" failed with error code 1 ...

  3. 案例——TCP上传图片

    TCP上传图片   继续做一个TCP的相关案例,在客户端上传一张图片到服务端,服务端收到图片后,给客户端回馈上传成功信息. 实现细节: 对于一些文件的读取,若文件偏大,可以始用缓冲区去读取和写入,可以 ...

  4. Ubuntu和开发板用网线直连ping不通的问题

    我装的Ubuntu 18.04双系统,在通过网络加载内核和文件系统那一步一直连接不上,uboot里面ping我的主机IP地址,提示: ping failed; host 192.168.1.111 i ...

  5. STM32SPI连续读写多个字节会产生时间间隔

    最近在做一个音频芯片的项目用到SPI接口配置寄存器,发现只要连续两次向从机发送(接收)帧,当STM32处于主机模式时,这两帧数据中间会产生一个时钟的间隙. 起初我想能不能利用状态标志来去除间隙,后来怎 ...

  6. Vue 全家桶,深入Vue 的世界

    内容简介: Vue 实例上的属性 Vue 生命周期 Vue 数据绑定 computed 计算属性 watch 监听器 Vue 组件 Vue 组件 extend Vue 组件高级属性 Vue 的rend ...

  7. 原生无缝Banner轮播图

    话不多说,先展示效果图.由于录制工具,稍显卡顿,实际是流畅的.可以看到实现了无缝轮播,鼠标悬停,点击左右上下按钮切换Banner的功能,如图1所示. 图1 原生无缝banner效果展示 以我这个轮播图 ...

  8. 简单使用OpenSSL生成密钥

    一.生成自签名证书 1.1.创建root CA私钥 openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 ...

  9. 这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)

    本文作者 | HelloGitHub-小猪蹄 Markdown 是一个轻量级的标记语言,语法简单.容易上手,它深受程序员.博客主等人群的钟爱.随着越来越多的博客系统支持 Markdown,它也开始越来 ...

  10. HDU 3873 Invade the Mars(带限制条件的Dijkstra)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路: 军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间). ...