绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Java 面向对象的特征
2019-10-10 11:34:11

1. 继承

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,

并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,

这是类之间的一种关系,提高了软件的可重用性和可扩展性。

使用继承

编写父类

class pet {

// 公共属性和方法

}

编写子类,继承父类

class dog extends pet {

// 子类特有的属性和方法

}

class cat extends pet {

// 子类特有的属性和方法

}

继承的特性

单根性

只能继承一个类,不能多重继承

传递性

从父类继承来的元素,可以被子类继承

子类访问父类成员

使用super 关键字

访问父类构造方法

// 构造器

public dog() {

// 访问父类构造方法

// super();

super(" 二哈 ",2);

}

访问父类构造属性

super.name;

访问父类方法

super.print();

不可被继承的资源

不可继承被私有化的属性和方法

构造方法

作用

继承的出现提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提。

注意

Java 只支持单继承,不允许多重继承。

即一个子类只能有一个父类。

但一个父类可以派生出多个子类

方法的重写(override)

在子类中可以根据需要对从父类中继承来的方法进行改造。

在程序执行时,子类的方法将覆盖父类的方法。

要求

重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。

重写方法不能使用比被重写方法更严格的访问权限。

重写和被重写的方法须同时为static 的,或同时为非 static 的。

子类方法抛出的异常不能大于父类被重写方法的异常。

注意

如果父类的一个方法定义成private 访问权限,在子类中有相同的方法,则不叫重写,因为子类无法访问到

package mytest;

public class A{

private void privateFunc() {

System.out.println("A privateFunc");

}

void defaultFunc() {

System.out.println("A defaultFunc");

}

protected void protectedFunc() {

System.out.println("A protectedFunc");

}

public void publicFunc() {

System.out.println("A publicFunc");

}

}

package mytest;

public class B extends A{

// 不是重写,而是定义了另外一个函数,重写的前提是有访问权限

private void privateFunc() {

System.out.println("B privateFunc");

}

// 重写

void defaultFunc() {

System.out.println("B defaultFunc");

}

// 重写

protected void protectedFunc() {

System.out.println("B protectedFunc");

}

// 重写

public void publicFunc() {

System.out.println("B publicFunc");

}

}

package mytest;

public class Test {

public static void main(String[] args) {

A a = new B();

B b = new B();

//  a.privateFunc(); // 只能在类内部调用

a.defaultFunc();

a.protectedFunc();

a.publicFunc();

//  b.privateFunc(); // 只能在类内部调用

b.defaultFunc();

b.protectedFunc();

b.publicFunc();

}

}

输出:

B defaultFunc

B protectedFunc

B publicFunc

B defaultFunc

B protectedFunc

B publicFunc

2. 封装

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的

变动影响。在面向对象的编程语言中,对象是封装的基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象

的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法

可以直接访问同一个对象中的属性。通常情况下,只要记住让外汇返佣http://www.fx61.com/变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成 私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了, 就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数 据放在同一个类中。

例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,

圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径

这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的

封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于

理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那

么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车

这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。

import java.util.Date;

public class Emp {

private String name;

private int age;

private String gender;

private int salary;

private Date hiredate;

public Emp() {

}

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 String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getSalary() {

return salary;

}

public void setSalary(int salary) {

this.salary = salary;

}

public Date getHiredate() {

return hiredate;

}

public void setHiredate(Date hiredate) {

this.hiredate = hiredate;

}

}

封装的好处

隐藏类的实现细节;

只能通过规定方法访问数据;

方便加入控制语句;

方便修改实现;

封装的步骤

修改属性可见性 – 设为 private

public class pet {

// 创建属性并修改可见性

private String name;

private int age;

}

创建get/set 方法 – 用于属性读写

// 创建 get 方法

public String getName() {

return name;

}

// 创建 set 方法

public void setName(String name) {

this.name = name;

}

在get/set 方法中加入控制语句 – 对属性进行合法判断

public void setAge(int age) {

// 加入控制语句

if(age > 0 && age < 100){

this.age = age;

}

}

3.  多态性

多态性是指允许不同类的对象对同一消息作出响应。

实现多态的3 个条件: 1 、必须有子类继承父类。 2 、必须有方法覆盖。 3 、必须有父类的引用指向子类。

多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,

很好的解决了应用程序函数同名问题。

使用多态实现思路

编写父类

class Pet {

// 吃东西

public void eat(){ 

}

}

编写子类,子类重写父类方法

class Dog extends Pet {

// 重写父类方法

public void eat(){

System.out.println(" 吃骨头 ");

}

}

运行时,使用父类类型,子类对象

class cat extends Pet {

Pet pet = new Dog();

}

只能调用父类有的方法

编译看左,运行看右

Pet pet = new Dog();

4. 抽象

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,

并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,

你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person 类,如下:

class Person{

String name;

int age;

}

人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,

这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,

这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。

抽象包括两个方面,一是数据抽象,二是过程抽象。

数据抽象——就是用代码的形式表示现时世界中一类事物的特性,就是针对对象的属性。比如建立一个鸟这样的类,鸟都有以下属性:

一对翅膀、两只脚、羽毛等。抽象出来的类都是鸟的属性,或者成员变量。

过程抽象——就是用代码形式表示现实世界中事物的一系列行为,就是针对对象的行为特征。比如鸟会飞、会叫等。抽象出来的类一般都是鸟的方法。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Java小专栏
创建时间:2019-08-08 21:32:06
Java专栏专注技术分享
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • lihong
    栈主

小栈成员

查看更多
  • 栈栈
  • 杨三百
  • at_1
  • gaokeke123
戳我,来吐槽~