经过16年校招,自己在Java基础方面也算有了一个质的飞跃,从原来知其然,到现在知其所以然,现将学习心得总结于此。

  首先需要知道类和对象是什么?
  维基百科定义类为: an extensible program-code-template for creating objects, providing initial values for state (member variables) and implementations of behavior (member functions or methods),即能够为创建对象实例提供可扩展的模板,提供数据和行为操作。在实现角度,其以字节码的形式存储在内存中的方法区,用来实例化对象。
  维基百科定义对象为:a location in memory having a value and possibly referenced by an identifier,即在内存上一段包含数据并由某标识符引用的区域。在实现角度,类对象实体存储在堆内存中,其地址存储在栈上的对象引用中(即类的对象变量,其指向对象所在的内存空间)。
 
  面向对象的特征有哪些方面?(参照Java面试题全集 
  • 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
  • 继承:继承是从已有类得到继承信息创建新类的过程,提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
  • 多态性多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型对象引用子类对象,这样同样的对象调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

  (1)重载与重写

  重载:
    • 方法重载是让类以统一的方式处理不同类型数据的一种手段,函数同名,但参数个数和类型不同;
    • 调用方法的时候,通过传递不同的参数决定使用哪个方法,实现多态;
    • 重载时,函数同名,参数不同,返回值类型可相同也可以不同。
  重写:
    • 父类与子类之间的多态,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,则该方法被重写或覆盖。
    • 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,可采用super关键字调用父类方法;
    • 子类函数的访问修饰权限不能少于父类的。
  注意1:无法以返回值类型区分重载函数
  从封装的角度理解:一个方法包括返回值类型、方法名、参数列表和方法体。方法体被方法封装,方法名和参数是这个封装体对外提供的接口
  至于返回值是与方法体有关,它是方法体执行的结果,它的有无是由方法体决定的。也就是说先有方法体,才有返回值,它不是封装体对外提供的接口,当我们调用方法时就是调用的这个对外的接口(方法名和参数列表),所以不能把返回值作为方法的重载。
  但也有特例,在编译器可以根据语境判断出语义时,如int x=f();也可以区分重载函数。直接 f();是无法区分重载函数的。
  注意2:Java中接口(interface)的存在也体现了运行时多态。
  总结
  多态可从接口实现重载重写三方面解释:
    • 接口与实现的分离,一个接口可以对应不同的实现,实现多态;
    • 重载,一种类中多态性的表现,多种同名、参数不同的方法实现多态,属于编译时多态性
    • 重写,继承产生的多态,子类对父类的方法进行重新定义,从而不同的子类对象对同一消息做出不同的响应,属于运行时多态性
  (2)对象造型(casting),造型转换或者类型转换
  • 向上转型(upcasting),Java中子类对象可以直接赋给父类对象,这个时候父类对象引用的就是子类对象的内存空间。即子类-->父类,父类可以根据子类对象的内存空间,执行不同的行为。父类对象和子类对象引用同一个对象,但编译器将父类对象仍看作父类型
                注意:父类对象引用(引用子类)不可以访问子类对象新增加的成员(属性和方法);
                      可以使用 引用变量 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类
  • 向下转型(downcasting),Java中将父类对象赋给子类对象时,要进行造型转换(即强制类型转换)。即父类-->子类,程序可以通过编译,但需要运行时进行检查,此时根据父类是否引用子类对象的内存空间,会出现不同的结果。
                如果父类变量引用的是正确的子类类型(即父类对象引用的是子类型的内存空间,然后赋给子类对象),则赋值将执行;如果父类变量引用的不是相关的子类型,将产生ClassCastException异常。例如:A是B的父类,A a=new B(); B b=(B) a; 执行时不会报异常。 如果A a=new A(); B b=(B) a; 执行时就会报异常。
                补充:向下转型严格按照上边的标准,数组符合条件也可以进行强制转换。
   
转型举例说明:

         Object[] o={"qw","we","rt"};  //o为Object类型的对象数组  getClass()返回class [Ljava.lang.Object;
Object[] oo=new String[]{"qw","we","rt"};//oo为Object类型数组,但其引用子类String的数组 getClass()返回class [Ljava.lang.String;
Object ooo="qw"; //ooo为Object变量 ,默认为String类型 getClass()返回class java.lang.String; //String[] s=(String[]) o; //运行时会报异常:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
String[]ss=(String[]) oo; //运行正常
String sss=(String) ooo; //运行正常,可将Object转换为String System.out.println(oo);
System.out.println(ss);
System.out.println(ooo);
System.out.println(sss);
System.out.println(ooo.getClass());

输出结果:

[Ljava.lang.String;@28d93b30
[Ljava.lang.String;@28d93b30
qw
qw
class java.lang.String

再举一例:

 public class TestCasting{
public static void main(String args[]){
Animal a = new Animal("a");
Cat c = new Cat("c","catColor");
Dog d = new Dog("d","dogColor"); System.out.println(a instanceof Animal); //true
System.out.println(c instanceof Animal); //true
System.out.println(d instanceof Animal); //true
System.out.println(a instanceof Dog); //false a = new Dog("d2","dog2Color"); //父类引用指向子类对象,向上转型
System.out.println(a.name); //可以访问
//System.out.println(a.folorColor); //!error 不可以访问超出Animal自身的任何属性
System.out.println(a instanceof Animal); //是一只动物
System.out.println(a instanceof Dog); //是一只狗,但是不能访问狗里面的属性 Dog d2 = (Dog)a; //强制转换
System.out.println(d2.folorColor); //将a强制转换之后,就可以访问狗里面的属性了 Dog[] dogs = new Dog[2];
dogs[0] = new Dog("dog1","black");
dogs[1] = new Dog("dog2","yellow");
Animal[] animals = dogs;
Dog[] dogs1 = (Dog[]) animals;
System.out.println(dogs);
System.out.println(dogs1);
}
}
class Animal{
public String name;
public Animal(String name){
this.name = name;
}
}
class Dog extends Animal{
public String folorColor;
public Dog(String name,String folorColor){
super(name);
this.folorColor = folorColor;
}
}
class Cat extends Animal{
public String eyesColor;
public Cat(String name,String eyesColor){
super(name);
this.eyesColor = eyesColor;
}
}

输出结果:

true
true
true
false
d2
true
true
dog2Color
[LDog;@28d93b30
[LDog;@28d93b30

  总结

    • 向上转型,即将子类对象赋给父类对象,父类对象指向子类对象内存空间,可以访问父类中定义的属性和方法,无法调用子类新添加的属性和方法;
    • 向下转型,即将父类对象赋给子类对象,此时根据父类对象引用的空间绝对运行时是否会发生异常;
    • 数组也遵守以上规则。

全文总结:

  • 理解类与对象的基本概念;
  • 面向对象的基本特征:抽象、继承、封装和多态;
  • 多态包括编译时多态和运行时多态,另有接口与实现的分离;
  • 重载与重写的区别;
  • 类型转换:向上转型与向下转型

Java基础一:面向对象的特征的更多相关文章

  1. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  2. java基础6 面向对象的详解

    本文知识点(目录): 1.1.万物皆对象    1.2.面向对象的概述    1.3.面向对象(java语言)与面向过程(C语言)对比    1.4.面向过程    1.5.对象    1.6.面向对 ...

  3. Java学习:面向对象三大特征:封装、继承、多态之封装性

    面向对象三大特征:封装.继承.多态. 封装性在Java当中的体现: 方法就是一种封装 关键字private也是一种封装 封装就是将一些细节信息隐藏起来,对于外界不可见. 问题描述:定义Person的年 ...

  4. 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)

    ---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...

  5. Java学习:面向对象三大特征:封装性、继承性、多态性之多态性。

    面向对象三大特征:封装性.继承性.多态性之多态性. extends继承或者implemens实现,是多态性的前提. 例如:小菜是一个学生,但同时也是一个人.小菜是一个对象,这个对象既有学生形态,也有人 ...

  6. 【java基础】面向对象的三大基本特征之-------继承

    面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类 ...

  7. 【java基础】面向对象的三大特征---多态

    java的引用变量有两种类型,编译时类型和运行时类型,如果编译时类型和运行时类型不一致,就会出现多态. 多态分为: 运行时多态 java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称 ...

  8. Java基础之面向对象以及其他概念

    一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. JR ...

  9. 【Java基础】面向对象下

    面向对象下 这一章主要涉及其他关键字,包括 this.super.static.final.abstract.interface.package.import 等. static 在 Java 类中, ...

  10. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

随机推荐

  1. 初探Lambda表达式/Java多核编程【0】从外部迭代到内部迭代

    开篇 放假前从学校图书馆中借来一本书,Oracle官方的<精通Lambda表达式:Java多核编程>. 假期已过大半才想起来还没翻上几页,在此先推荐给大家. 此书内容及其简洁干练,如果你对 ...

  2. js精要之函数

    数组排序 ,,,,,]; arr.sort(function(a,b){ return a-b; }); console.log(arr); arguments 参数存储对象 function ref ...

  3. W3Cschool学习笔记——CSS教程

    CSS 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现 ...

  4. Webappbuilder自定义widget模板

    Webappbuilder自定义widget模板 by 李远祥 到\\widgets\samplewidgets目录下拷贝 CustomWidgetTemplate 文件并重命名为MyWidget 设 ...

  5. 升级到appcompat v7 21.0.2之后遇到的问题解决方法

    1)一开始是手动直接覆盖文件到对应的lib project下,提示数个style找不到.原因是新旧版本的文件命名和结构不同,所以这个问题只需要把project目录清空,重新复制文件即可解决. 2)发现 ...

  6. java读取Excel文档插入mysql

    /** * 读取excel插入myslq */package com.excel; import java.io.BufferedInputStream;import java.io.File;imp ...

  7. .net是最牛逼的开发平台没有之一

    .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开 ...

  8. CLAHE的实现和研究

    CLAHE算法对于医学图像,特别是医学红外图像的增强效果非常明显. CLAHE  https://en.wikipedia.org/wiki/Adaptive_histogram_equalizati ...

  9. [原创.数据可视化系列之十三]idw反距离权重插值算法的javascript代码实现

    图形渲染中,idw反距离权重插值算法是一个应用非常广泛的方法,但是js实现的比较少,目前实现一个: //idw算法 //输入[[x:0,y:0,v:0],[x:0,y:0,v:0],[x:0,y:0, ...

  10. Error: Cannot find module 'gulp-clone'问题的解决

    安装完gulp环境,并且配置好gulpfile.js,执行静态文件压缩和代码混淆时,出现如下错误: Error: Cannot find module 'gulp-clone' Error: Cann ...