如何理解面向对象

我们说面向对象具有三大特征:封装性、继承性和多态性,那么我们怎么去理解所谓的封装、继承、多态?

1、封装:功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可。

如:房子、电脑、手机、饮料等等都可以认为是一次封装,而他们怎么做出来的,你不需要关心。

2、继承:你从父辈那继承了家产,你身体流淌着父母的血液,这也就是所谓的继承,继承你也可以把它想象成基础的类。

我们说学一样东西一定要把基础打牢,那为什么需要把基础打牢呢?因为不管多么复杂的东西,都是从简单才到复杂的,也就是说它是根据基础演变而来。

说更简单一点,我们说猫啊,狗啊,老虎,虽然它们形态各异,但它们始终都有其共同点,吃喝拉撒睡,那不是人吗?人不也是动物嘛,既然它们这么相似,于是就有人把它们分到一个类中,也就是所谓的动物。

那么为什么需要分类呢?个人感觉,一切为了方便,就好像为什么要分男的和女的,你说你要找一个人,在这种不明确的情况下,肯定需要花费很多时间,但如果你说你要找女的,那么就可以减少一半的时间,虽然没有一半,但这肯定是减少了很多的时间,从另外一个角度来讲,可以和其他类做区分,比如,我们说要吃水果,那肯定就不是鱼啊,包子之类的。

所谓的基类就是,这一个类中所有成员的共性,比如:男人和女人,他们是不是有共同点,而这些共同点就可以把它抽象成“人”。所以当我们说人时,你既可以把它想象成是一个男人,也可以想象成是一个女人,所谓的多态就是从这演变出来的。

3、多态:同一类事物有多种形态,注意是同一类事物

刚刚还是晴空万里,瞬间倾盆大雨,这就是天空的多态。春天的树,新枝嫩叶,冬天的树叶都枯萎了,说明树具有多态性。

构造器

构造器也叫构造方法(constructor),用于对象的初始化。在我们初始化对象时,如果希望设置一些默认值,那么就可以使用构造器。

构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。

构造器的名称应与类的名称一致。

Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。

class Test{
private String name;
Test(String n){
name = n;
}
public String getName(){
return name;
}
} public class app {
public static void main(String[] args){
Test test = new Test("小王");
String n = test.getName();
System.out.println(n);
}
} // 小王

并且可以发现这个构造器是在new的时候执行的。如果是继承至某个父类,那么我们可以在子类中调用super来手动执行父类中的构造器。

class Test{
private String name;
Test(String n){
name = n;
}
public String getName(){
return name;
}
} class Test2 extends Test{
Test2(String n){
super(n);
}
} public class app {
public static void main(String[] args){
Test2 test = new Test2("老王");
String n = test.getName();
System.out.println(n);
}
} // 老王

前面之所以说是手动是因为,就算你不去调用父类的构造器,它还是会被执行,只是它执行的是没有参数的构造器。我们不妨来看看下面这段代码

class Test{
Test(){
System.out.println("Test");
}
} class Test2 extends Test{
Test2(){
System.out.println("Test2");
}
} public class app {
public static void main(String[] args){
Test2 test = new Test2();
}
} // Test
// Test2

程序自动调用了父类的构造器,而且还比子类构造器先执行,之所以父类的构造器先执行是有原因的,你想啊,子类往往需要用到父类中的一些变量或方法,如果不先初始化父类中的构造器,那么肯定就会出现一些问题。

要点:

  1. 通过new关键字调用!!

  2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。

  3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!

  4. 构造器的方法名必须和类名一致!

垃圾回收机制

我们知道一个方法,可以无数次的被调用,因此如果没有一个合理的规范,那么每次执行都会加大内存的消耗,而且有些方法执行完毕以后就没有任何意义了,因此一些语言中加入了垃圾回收,对于一些没有用处的进行回收,当然垃圾回收不仅仅针对方法。

但是话说回来你也不能乱回收对吧,得有一个规范,而这个规范就是,如果一个对象没有被引用,或被设置成null,又或者当前对象被其他对象所覆盖,那么它就会变成垃圾,会被垃圾收集器所回收。

内存管理

  Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。

  对象空间的分配:使用new关键字创建对象即可

  对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达”对象的内存空间。

垃圾回收过程

  任何一种垃圾回收算法一般要做两件基本事情:

  1. 发现无用的对象

  2. 回收无用对象占用的内存空间。

  垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量引用该对象。Java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

 垃圾回收相关算法

      1. 引用计数法

2. 引用可达法(根搜索算法)

方法的重载(overload)

方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。

class Test{
public void a(){
System.out.println("正常");
}
public void a(String t){
System.out.println("第二个a" + t);
}
}
class app{
public static void main(String[] args){
Test test = new Test();
test.a("啊"); // 函数被重载
test.a(); // 未被重载
}
}
------Output------
第二个a啊
正常

重载的方法,实际是完全不同的方法,只是名称相同而已!

构成方法重载的条件:

1.不同的含义:形参类型、形参个数、形参顺序不同。

2.只有返回值不同不构成方法的重载。如下:不构成方法重载

int a(String str){}与 void a(String str){}

  

3.只有形参的名称不同,不构成方法的重载。如下:不构成方法重载

int a(String str){}与int a(String s){}

  

方法的重写

通俗讲就是覆盖,在Java好像对同一个类中,不支持重写,下面这段代码,运行就报错了。

class Test{
public void a(){
System.out.println(0);
}
public void a(){
System.out.println(1);
}
}
class app{
public static void main(String[] args){
Test test = new Test();
test.a();
}
} ------Output------
app.java:5: ??: ??? Test?????? a()
public void a(){
^
1 ???

一般来说,也没人会这么写,使用重写,基本上是在继承中,比如下面这段代码。

class Test{
public void a(){
System.out.println(0);
}
} class Test2 extends Test{
public void a(){
System.out.println(1);
}
}
class app{
public static void main(String[] args){
Test2 test = new Test2();
test.a();
}
} ------Output------
1

Test2重写了Test中的a方法,不过在Java中,如果你想要重写某个方法,需要遵守几个规则,重写的函数返回类型需要和父类中返回的类型相同,形参相同,访问权限不能比父类中的小,比如下面这个就有问题

class Test{
public int a(){
return 0;
}
} class Test2 extends Test{
private int a(){
return 1;
}
}
class app{
public static void main(String[] args){
Test2 test = new Test2();
test.a();
}
} 报错

这段代码之所以报错是因为,Test2的方法a比父类的a权限小,但反过是可以的。

JAVA的面向对象1的更多相关文章

  1. java的面向对象

    Java是1995年诞生.前身oak,后来改名为java. 面向对象的编程思想:对象是万事万物. 对象是由两部分组成的:属性和方法 1:属性是对象的静态特性(名词) 2:方法是对象的动态特性(动词) ...

  2. (Java)《head first java》值得Java或面向对象基础的新手看。

    看完这本书后本人收获良多. 内容对Java以及面向对象的入门者非常友好. 抽象的内容惯用图解的方法来剖析,通俗易懂 之前看C#入门经典的面向对象时,依然浓浓的一头雾水. (1)很不解为何实例化要写成A ...

  3. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  4. Java之面向对象相关问题集

    面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解所有问题,而仅仅是选择当中的一部分,临时不用部分细节. 抽 ...

  5. Java与面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应 ...

  6. java基础面向对象之类与对象

    java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...

  7. Java与面向对象之随感(2)

    我们知道Java语言的一大特性就是相比于c语言和c++语言,其更加安全.那么Java安全性的一个重要保证就是它取消了指针,并且坚决反对数组的出界(c++对当数组超出上限但是还进行读写操作时允许的!), ...

  8. 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点

    前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...

  9. Java的面向对象(初涉)

    Java的面向对象(初涉) 面向对象的分析根据抽象关键的问题域来分解系统.面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成"现实世界&qu ...

  10. JAVA(一)JAVA基础/面向对象基础/高级面向对象

    成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...

随机推荐

  1. 通过ADB调试安卓程序

    ADB,即 Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具. 1.下载ADB后,将以下四个文件放到某个文件夹下即可.因为打开Cmd默认路径是 C:\Use ...

  2. Viola–Jones object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻译 及 matlab实现(见文末链接)

    ACCEPTED CONFERENCE ON COMPUTER VISION AND PATTERN RECOGNITION 2001 Rapid Object Detection using a B ...

  3. Spark RDD学习笔记

    一.学习Spark RDD RDD是Spark中的核心数据模型,一个RDD代表着一个被分区(partition)的只读数据集. RDD的生成只有两种途径: 一种是来自于内存集合或外部存储系统: 另一种 ...

  4. VmWare 网络模式

    VMware虚拟机三种联网方法及原理 一.Brigde--桥接:默认使用VMnet0 1.原理: Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在" ...

  5. php 限制标题长度,将一个中文转换成一个字符

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...

  6. kalilinux 渗透测试笔记

    声明:本文理论大部分是苑房弘kalilinux渗透测试的内容 第五章:基本工具 克隆网页,把gitbook的书记下载到本地 httrack "http://www.mybatis.org/m ...

  7. poi的基本导入

    一.获取列的值 private String getCell(Cell cell){ if(null == cell){ return ""; } try{ cell.setCel ...

  8. LEANGOO用户设置

    转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_kanban_user.html#toggle-id-7 1. 点击屏幕右上角头像或用户名 ...

  9. 安卓开发之Toolbar返回键

    本文前三步演示了为Toolbar添加返回键并实现返回的步骤,第四步给出了设置返回键颜色的方法. 1.在xml布局中引用toolbar: <android.support.design.widge ...

  10. djnago中间件

    前言 在form表单中当我们提交表单时会有这样的错误>>>>请求post时候的会出现403 forbidden,那我们就说说这个类中间件,(csrf只是中间件的一种) 以前我们 ...