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; 执行时就会报异常。

补充:向下转型严格按照上边的标准,数组符合条件也可以进行强制转换。

   

转型举例说明:

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

输出结果:

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

再举一例:

 1 public class TestCasting{ 2     public static void main(String args[]){ 3         Animal a = new Animal("a"); 4         Cat c = new Cat("c","catColor"); 5         Dog d = new Dog("d","dogColor"); 6  7         System.out.println(a instanceof Animal);    //true 8         System.out.println(c instanceof Animal);    //true 9         System.out.println(d instanceof Animal);    //true10         System.out.println(a instanceof Dog);        //false11 12         a = new Dog("d2","dog2Color");        //父类引用指向子类对象,向上转型13         System.out.println(a.name);                //可以访问14         //System.out.println(a.folorColor);   //!error   不可以访问超出Animal自身的任何属性15         System.out.println(a instanceof Animal);    //是一只动物16         System.out.println(a instanceof Dog);        //是一只狗,但是不能访问狗里面的属性17 18         Dog d2 = (Dog)a;    //强制转换19         System.out.println(d2.folorColor);    //将a强制转换之后,就可以访问狗里面的属性了20 21         Dog[] dogs = new Dog[2];22         dogs[0] = new Dog("dog1","black");23         dogs[1] = new Dog("dog2","yellow");24         Animal[] animals = dogs;25         Dog[] dogs1 = (Dog[]) animals;26         System.out.println(dogs);27         System.out.println(dogs1);28     }29 }30 class Animal{31     public String name;32     public Animal(String name){33         this.name = name;34     }35 }36 class Dog extends Animal{37     public String folorColor;38     public Dog(String name,String folorColor){39         super(name);40         this.folorColor = folorColor;41     }42 }43 class Cat extends Animal{44     public String eyesColor;45     public Cat(String name,String eyesColor){46         super(name);47         this.eyesColor = eyesColor;48     }49 }

输出结果:

truetruetruefalsed2truetruedog2Color
[LDog;@28d93b30
[LDog;@28d93b30

  总结

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

Java基础之面向对象的特征。的相关文章

Java基础和面向对象

Java基础和面向对象 一.数据类型和运算符 标识符 组成:字母.数字.下划线.$ 首字母:不能是数字 见名知义 不能是关键字(48个) 正确的:name.name123.age._name.$name 错误的:1name.public.123.na%me 标识符主要给一个元素起名字,需要符合起名字的以上4种规则.比如说,类的名字:首字母大写:变量名称:小写:方法名称:驼峰命名:数组名称.接口名称.集合名称. //你定义为汉字也可以,不过不推荐,因为国际语言以English为主.为了面向世界,使

【从0开始学Java】1.面向对象的特征有哪些方面

+Q325957484可以领取学习视频 1.面向对象的特征有哪些方面 1.Java基础培训,从0开始学Java:抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.Java基础培训,从0开始学Java:继承 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为

Java基础之一 面向对象

Java 是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java有功能强大和易用两个特征. 面向对象的程序设计(Object Oriented Programming),一种将程序分解为封装数据及相关操作的模块而进行的编程方式. 面向对象的做法确实是把属性和功能封装起来,但是其核心是归类和抽象. 把相关的属性和功能集中起来,把可以分离的部分隔绝开来,从而把复杂的业务逻辑切割成互相之间可以相对独立的部分,降低开发的难度. 所以面向对象绝

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

面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类,如果一个类没有声明继承于谁,那么默认就是继承于java.long.Object类 通过继承,子类可以获得父类的全部的属性和方法,同时进行拓展. 代码示例: 1 package extendss; 2 3 /** 4 * 类的继承演示代码 5 * 这是一个父类 train 火车类 6 * 默认继承于

Java基础知识—面向对象(八)

概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封装: 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的.class 子类 extends 父类{}.implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔). 2.super 与

java基础教程-面向对象(一)

一.面向对象 1.1 java键盘输入 1.1.1这种方法我认为是最简单,最强大的,就是用Scanner类 import java.util.Scanner; public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println(“请输入你的姓名:”); String name = sc.nextLine();//字符串输入 System.out.println(“请输入

Java基础之面向对象

面向对象 1.面向对象思想: (1)概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象: (2)思想特点: A:是符合人们思考习惯的一种思想: B:将复杂的事情简单化了: C:将程序员从执行者变成了指挥者: 比如我要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机, 至于怎么洗我不管. (3)特征: 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式 继承: 多个类中存在相同属性和行为时,将这些内容抽取

Java基础总结--面向对象2

1.存在相关的多个方法就封装在一个类中,方法没调用到特有数据,需要静态化2.假如一个类所有方法都是静态方法,为了保证不被其他创建对象,可以将该类的构造方法私有化3.文档注释javadoc-按照规定注释--提取注释保存为Html格式(不重要按照规定来就行)设计模式:对问题行之有效的解决方法--是一种思想Java存在23种设计思想--OOP语言设计模式通用------继承------1.继承的概述两个/多个类不断的对其进行向上的抽取其共性的东西--把这些共性的东西封装在父类中,产生父子关系--is

Java基础总结--面向对象1

---面向对象的概念---1.面向过程与面向对象的区别面向过程:是一种思维习惯,解决一个问题的时候靠的是一个个方法调用--核心是动作面向对象:是一种更接近生活中解决问题的思维习惯,解决特定的问题靠对象完成--核心是对象eg:对于把大象装进冰箱分析面向过程思维习惯打开冰箱--装入冰箱--关闭冰箱(由3个动作实现)面向对象的思维习惯分析问题涉及的对象:大象 冰箱(打开 存储 关闭)冰箱打开--冰箱存储大象--冰箱关闭2.面向对象的特点封装数据和方法在对象中使得复杂问题简单化(面向多个函数--面向一个