首页 > 编程知识 正文

java面向对象的特点,java面向对象程序设计课后答案

时间:2023-05-06 16:38:29 阅读:32071 作者:2815

一、面向对象的概念

面向对象是符合人类思维习惯的编程思想。 现实生活中存在着各种形态的东西,这些东西之间有各种各样的联系。 程序中用客体来映射现实事物,用对象关系来表达事物之间的联系,这一思想是面向客体的。

说到面向对象,自然会想到面向过程。 所谓面向过程,就是分析解决问题所需的步骤,用函数一个个地实现这些步骤,在使用时一个个地按顺序调用即可。 面向对象是指根据一定的规则将已解决的问题划分为多个独立的对象,然后调用对象的方法来解决问题。 当然,一个APP应用程序包含多个对象,多个对象协同工作就可以实现APP应用程序的功能。 这样,当APP应用程序的功能发生更改时,只需要修改单个对象,从而使代码维护变得更加容易。

二.面向对象的特征

面向对象的特征主要可以归纳为打包性、继承性、多态性,下面对这三个特性进行简要介绍。

1、封装性

封装是面向对象的中心思想,封装对象的属性和行为,不需要向外界透露具体实现细节就是封装思想。 例如,用户只需使用电脑,用手指敲击键盘,就无需知道电脑内部的工作原理。 即使用户可能碰巧知道电脑的工作原理,但并不完全依赖电脑的工作原理等细节。

2、继承性

继承性主要描述类与类的关系,通过继承,可以在不重写原类的情况下扩展原类的功能。 例如,有一个描述汽车常规特性和功能的汽车类,但轿车类不仅需要添加汽车特性和功能,还需要添加轿车特有的功能。 在这种情况下,您可以让轿车类继承汽车类,然后单独向轿车类添加轿车特性。 继承性不仅提高了代码的复用性,提高了开发效率,而且便于程序的修改和补充。

3、多态性

多态性是指在程序中允许重复现象,一个类中定义的属性和方法被其他类继承后,可以有不同的数据类型,也可以呈现不同的行为,相同的属性和方法在不同的类中具有不同的意义

1、封装的优点:

良好的封装可以减少偶联。 类内部的结构可以自由修改。 可以更准确地控制成员变量。 隐藏信息,实现细节。2、封装的实现步骤

1、使用private关键字修饰成员变量。

2、为要访问的成员变量提供公共访问方法。 也就是说,定义对应的getXxx方法、setXxx方法。

注意:封装属性不需要使用get/set方法。 也可以通过其他方式操作封装属性。 当然,最好使用get/set方法比较标准。

访问修饰符:

从表中可以看到,从上到下封装性越来越差。

this关键字

1 ) this代表什么?代表在当前类对象(谁调用此方法,this指向谁) 2方法中调用属性并附加this有什么区别? this .属性:检查要指定的属性变量名称(属性名称相同)方法中是否存在变量或参数名称。 变量指向该变量或参数,如果方法中不存在同名的参数和变量,则指向同名的属性。 如果不存在,则错误代码如下所示。

publicclassdog(publicdog ) ({ System.out.println ) (“狗出生了---顺产”); //自己添加的构建方法publicdog(stringname,String strain ) { this.name=name; this.strain=strain; System.out.println ('狗出生了…----难产.'); ) publicdog(stringa,int b ) { System.out.println (“狗出生了----剖腹产”); ) publicdog(intb,String a ) { System.out.println (“狗出生了----流产了”); } String name='无名'; //昵称,默认值为'无名' int health=100; //健康值,默认值为100 int love=0; //亲密度String strain='西伯利亚哈士奇'; //品种/** *输出狗的信息。 */public void print ((system.out.println )宠物自我介绍: (n我叫(this.name ),健康值为) this.health,和主人的亲密程度为) tth }} Java 中的内部类

“内部类”(Inner Class )是为其他类定义的类。 与此相对应,包括内部类

的类被称为外部类。

内部类可分为以下几种:

成员内部类静态内部类方法内部类匿名内部类

作用:

内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

内部类的方法可以直接访问外部类的所有数据,包括私有的数据。

内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。

继承

概念:
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

在现实生活中,继承一般指的是子女继承jddxt的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系

继承是类与类的一种关系,是一种“is a”的关系。如图

兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
注意:java中的继承是单继承,即一个类只有一个父类。

继承的格式

class 父类 {} class 子类 extends 父类 {}

补充:Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。
如:

public class Son extends Father{public void go () {System.out.println("son go");}public void eat () {System.out.println("son eat");}public void sleep() {System.out.println("zzzzzz");}public void cook() {//匿名内部类实现的多继承new Mother().cook();//内部类继承第二个父类来实现多继承Mom mom = new Mom();mom.cook();}private class Mom extends Mother {@Overridepublic void cook() {System.out.println("mom cook");}}}

继承的特性:

子类拥有父类非 private 的属性、方法。子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。子类可以用自己的方式实现父类的方法。Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B
类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

super 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
如:

class Animal { void eat() { System.out.println("animal : eat"); }} class Dog extends Animal { void eat() { System.out.println("dog : eat"); } void eatTest() { this.eat(); // this 调用自己的方法 super.eat(); // super 调用父类方法 }} public class Test { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eatTest(); }}==========结果:animal : eatdog : eatanimal : eat

final关键字

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

声明类:final class 类名 {//类体}声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

注:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final

继承的初始化顺序

1、初始化父类再初始化子类

2、先执行初始化对象中属性,再执行构造方法中的初始化。

基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:

父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法

多态

面向对象的多态性,即“一个接口,多个方法”。多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。多态性允许一个接口被多个同类使用,弥补了单继承的不足。

使用多态的好处:

消除类型之间的耦合关系可替换性可扩充性接口性灵活性简化性

多态存在的三必要条件

继承重写父类引用指向子类对象:Parent p = new Child();

java中多态主要表现在以下两方面

1、引用多态

父类的引用可以指向本类的对象;
父类的引用可以指向子类的对象

这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:

注意:我们不能使用一个子类的引用来指向父类的对象,如:

为什么子类的引用不能用来指向父类的对象呢?就以上面的例子来说,我们能说“狗是一种动物”,但是不能说“动物是一种狗”,狗和动物是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!!

2、方法多态

根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。

创建本类对象时,调用的方法为本类方法;

创建子类对象时,调用的方法为子类重写的方法或者继承的方法;

使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!

注意: 继承是多态的基础。

引用类型转换

1.向上类型转换(隐式/自动类型转换),是小类型转换到大类型

就以上述的父类Animal和一个子类Dog来说明,当父类的引用可以指向子类的对象时,就是向上类型转换。如:
 
2. 向下类型转换(强制类型转换),是大类型转换到小类型(有风险,可能出现数据溢出)。

将上述代码再加上一行,我们再次将父类转换为子类引用,那么会出现错误,编译器不允许我们直接这么做,虽然我们知道这个父类引用指向的就是子类对象,但是编译器认为这种转换是存在风险的。如:
  
 那么我们该怎么解决这个问题呢,我们可以在animal前加上(Dog)来强制类型转换。如:


 但是如果父类引用没有指向该子类的对象,则不能向下类型转换,虽然编译器不会报错,但是运行的时候程序会出错,如:
 
还有一种情况是父类的引用指向其他子类的对象,则不能通过强制转为该子类的对象。如:

因为我们在编译的时候进行了强制类型转换,编译时的类型是我们强制转换的类型,所以编译器不会报错,而当我们运行的时候,程序给animal开辟的是Dog类型的内存空间,这与Cat类型内存空间不匹配,所以无法正常转换。这两种情况出错的本质是一样的,所以我们在使用强制类型转换的时候要特别注意这两种错误

来看一个例子:

abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } }==============================================public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 对象调用 show 方法 show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eat Cat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } }输出结果:吃鱼抓老鼠吃骨头看家吃鱼抓老鼠

instanceof运算符,用来解决引用对象的类型,避免类型转换的安全性问题。

instanceof是Java的一个二元操作符,和==,>,<是同一类的。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

public void play(Aninmos aninmos){ if (aninmos instanceof Dog) { Dog dog = (Dog) aninmos; dog.jie(); }else if (aninmos instanceof Penguin) { Penguin pgn = (Penguin) aninmos; pgn.swimming(); }

最后呢 欢迎留言评论

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。