黑马程序员:java基础——OOP面向对象的特征

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

  一概述:

一、面向对象(OOP)的概述:

1)简介:OOP: Object Oriented Programming,面向对象程序设计。所谓“对象”在显式支持面向对象的语言中,一般是指类在内存中装载的实例,具有相关的成员变量和成员函数(也称为:方法)。面向对象的程序设计完全不同于传统的面向过程程序设计,它大大地降低了软件开发的难度,使编程就像搭积木一样简单,是当今电脑编程的一股势不可挡的潮流。

2)特点:OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
a:抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
b:封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
c:继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。
d:多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。
二封装:
1 )简介:封装也叫做信息封装:java中,封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际 
上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度
举个例子:
  public class Man
  {
  //对属性的封装,一个人的姓名,年龄,妻子都是这个对象(人)的私有属性
  private String name;
  private int age;
  private Woman wife;
  //对改人对外界提供方法的封装,可以设定妻子,姓名,年龄也可以获得男人的姓名和年龄

  public void setWife(Woman wife)
  {
  this.wife = wife;
  }

  public String getName()
  {
  return name;
  }
  public void setName(String name)
  {
  this.name = name;
  }

  public int getAge()
  {
  return age;
  }

  public void setAge(int age)
  {
  this.age = age;
  }
  }

  public class Woman
  {
  //属性封装
  private String name;
  private int age;
  private Man husband;
  //方法封装

  public String getName()
  {
  return name;
  }

  public void setName(String name)
  {
  this.name = name;
  }

  public int getAge()
  {
  return age;
  }

  public void setAge(int age)
  {
  this.age = age;
  }
  public Man getHusband()
  {
  return husband;
  }

  public void setHusband(Man husband)
  {
  this.husband = husband;
  }
  }

  /**

  * 仔细看就会发现,Man类没有提供getWife的方法,这是以为男人不想让自己的妻子被外界访问
  * 直接下来呢,就是封装可以吧一个对象的属性私有,而提供一些可以被外界访问的属性的方法,
  * 比如说,name属性,Man和Woman类都有相应的get和set方法,外界都可以通过这些方法访问和修改
  * 同时对一些改对象不想让外界访问的属性,就不提供其方法,比如说Man的wife属性,就没有get方法
  * 外界是不能带到Man类的wife属性的
  */

心得:java的世界里,一切事物都是对象,描述对象需要描述其属性和功能,这样一来。数据就多了,就需要用类来封装。封装可以隐藏实现细节,使得代码模块化;对于类中的数据,若为私有则可以设置成private访问权限。保护数据的安全性。对于公开的数据,可以对外提供共有的方法,来让外界访问。所以封装的一大好处就是增加软件代码的内聚性。通过增加内聚性,进而提高可复用性和可维护性。(如继承可以提高复用性,多态可以提高扩展性,可维护性等).


 三继承:
1)简介:Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
举例说明:先定义一个类叫车,车有以下属性:车体大小,载重,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据
2)特征:
(1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
(5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承
举例说明:class Superclass
{
int data;
void setData(int data)
{
this.data=data;
}
int getdata()
{
return this.data;
}
}
class SubClass extends Superclass
{
int supData;
void setSubData(int supData)
{
this.supData=supData;
}
int getSubData()
{
return supData;
}
}
class Main2
{
public static void main(String[] args)
{
SubClass aSubClass=new SubClass();
aSubClass.setData(12);//子类有从弗雷继承的方法
aSubClass.setSubData(13);//子类特有的方法
System.out.println(aSubClass.getdata());
System.out.println(aSubClass.getSubData());
}
}
心得:继承所表达的就是类对象之间的关系,通过一个已有的类来创建一个新的类,新类继承了已有类的属性和行为,这种方式称为继承。新的类叫做子类,已有被扩展的类叫做父类。这样就可以复用父类的代码,子类也可以重写父类的方法以实现自己的特有实现方法。
优点:极大地提高了代码的复用性,缩短开发周期,降低开发费用。
缺点:
打破了封装,因为父类向子类暴露了实现细节 ,打破了封装性。比起来组合,继承的灵活性稍差。

    四多态:
1)简介:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。
	多态性面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,主要体现在继承和接口实现两方面

2)特征
a.发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用
b.  当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
举个例子:

class Father{

  public void func1(){

  func2();

  }

  //这是父类中的func2()方法,因为下面的子类中重写了该方法

  //所以在父类类型的引用中调用时,这个方法将不再有效

  //取而代之的是将调用子类中重写的func2()方法

  public void func2(){

  System.out.println("AAA");
 }
}
 class Child extends Father{

  //func1(int i)是对func1()方法的一个重载

  //由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用

  //所以在下面的main方法中child.func1(68)是不对的

  public void func1(int i){

  System.out.println("BBB");

  }

  //func2()重写了父类Father中的func2()方法

  //如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法

  public void func2(){

  System.out.println("CCC");

  }

  }

  public class PolymorphismTest {

  public static void main(String[] args) {

  Father child = new Child();

  child.func1();//打印结果将会是什么?

  }

  }

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

  那么该程序将会打印出什么样的结果呢?

  很显然,应该是“CCC”。

总结:

  一、使用父类类型的引用指向子类的对象;

  二、该引用只能调用父类中定义的方法和变量;

  三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

  四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

	五:多态有编译时多态 和运行时多态	第一个是通过方法重载实现;第二个是通过方法覆盖实现(子类覆盖父类方法)。
	第一种就是我们调用方法是不用区分参数类型,程序会自动执行相应方法,如: 加法运算,可以使int相加,可以是double相加,都是同一个方法名。
	第二种就是动态绑定,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。 这样的作用就是扩展性极好,玩过网游的话应该知道 游戏中有不同的角色,它们都有一个父类,它们做相同动作时表现出来的效果就会不一样,比如跑,魔法师的跑跟战士的跑就不会一样,这就是俩者都覆盖了父类中的跑方法,各自有自己的现实,表现出来多态。  如果有一天你想再加个角色,只用再写一个类继承该父类,覆盖其中的跑方法就行了,其他代码不用怎么改,所以可维护性也很好。
心得 多态的作用是什么呢?多态是为了实现另一个目的―接口重用 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。例如,一个功能的参数需要传入一个Animal的类,从而调用实现了Animal的子类的speek方法。传入Dog对应Dog的“汪汪”,传入猫则“喵喵”。这样就可以提高程序的扩展性。如果后来有定义了老虎的对象,只要复写了speek方法,就可以使用这个功能。
 
多态的优点:
       1.可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
  2.接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
  3.灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
  4.简化性。多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。

  
----------- ASP.Net+Android+IOS开发 .Net培训 、期待与您交流! -------------详细请查看: http://edu.csdn.net ——————
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java OOP面向对象十二章书虫阅读器代码是一个用于管理和操作图书馆的应用程序。以下是该应用程序的主要功能和代码示例: 1. 图书(Book): - 属性:书名(title)、作者(author)、出版社(publisher)、ISBN号(isbn) - 方法:获取书名、获取作者、获取出版社、获取ISBN号 ```java public class Book { private String title; private String author; private String publisher; private String isbn; public Book(String title, String author, String publisher, String isbn) { this.title = title; this.author = author; this.publisher = publisher; this.isbn = isbn; } public String getTitle() { return title; } public String getAuthor() { return author; } public String getPublisher() { return publisher; } public String getIsbn() { return isbn; } } ``` 2. 图书馆(Library): - 属性:图书列表(books) - 方法:添加图书、删除图书、查找图书、显示所有图书 ```java import java.util.ArrayList; import java.util.List; public class Library { private List<Book> books; public Library() { books = new ArrayList<>(); } public void addBook(Book book) { books.add(book); } public void removeBook(Book book) { books.remove(book); } public Book findBook(String title) { for (Book book : books) { if (book.getTitle().equals(title)) { return book; } } return null; } public void displayBooks() { for (Book book : books) { System.out.println("Title: " + book.getTitle()); System.out.println("Author: " + book.getAuthor()); System.out.println("Publisher: " + book.getPublisher()); System.out.println("ISBN: " + book.getIsbn()); System.out.println("----------"); } } } ``` 以上是一个简单的图书馆管理系统的代码示例,包括了图书和图书馆。你可以根据需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值