面向对象 三 (三大特性)

封装,继承,多态

一:  了解什么是封装:

就象一个盒子,你不需要知道里面有什么东西,只知道它有那些用处就行,能够为你提供相对应的方法.

封装的意义:

  • 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
  • 保护成员属性,不让类以外的程序直接访问和修改;
  • 隐藏方法细节

关于对象封装的原则:

内聚:内聚是指一个模块内部各个部分之间的关联程度
耦合:耦合指各个模块之前的关联程度
封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别
在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。

1.1  了解访问权限修饰符

所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。

Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四种访问权限的含义和权限控制见下面表格:

注意:所谓的访问,有两种方式,直接访问和通过对象访问。

封装代码例:

public class House

{

// 私有化属性

private String cookroom;

private String bathroom;

private String bedroom;

private String parlor;

public String getCookroom() {

return cookroom;

}

public void setCookroom(String cookroom) {

this.cookroom = cookroom;

}

public String getBathroom() {

return bathroom;

}

public void setBathroom(String bathroom) {

this.bathroom = bathroom;

}

public String getBedroom() {

return bedroom;

}

public void setBedroom(String bedroom) {

this.bedroom = bedroom;

}

public String getParlor() {

return parlor;

}

public void setParlor(String parlor) {

this.parlor = parlor;

}

}

可以看到一个封装的类 存在get 与 set 方法 分别是 获取 与 设置  this 指当前的对象  所以具体是指为获取当前的 /为当前的设置值

二: 什么是继承?

俗话说,龙生龙,凤生凤,老鼠的儿子会打洞,这就是继承的一种表现。就像我们每个人会继承父母的相貌等基因,甚至财富,人脉等资源。

同样在java代码中类与类,接口与接口之间都存在继承,要想继承另一个类,那么 extends 是必不可少的。

唯一要注意的是,java所倡导的继承是单继承,就像我们每一个人,只会有一个亲生父亲(当然马云爸爸,要认我做儿子的话,我也是无法拒绝的0.0),所以java类只能通过关键字extends 继承另外一个类,或者一个接口通过 关键字extends继承另外一个接口。

而类与接口之间,只能是类实现接口,通过关键字 implements 完成类实现接口。

继承的意义:

主要实现重用代码,节省开发时间。

子类继承父类静态属性方法是否可以被继承和重写?

结论:非静态属性和方法可以被继承和重写。但是静态属性和方法可以被继承,但是没有被 重写 而是被隐藏,即调用的都是父类的属性和方法。
原因:

  1. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。
  2. 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。

2.1  了解什么是static 以及静态

static关键字

在类中,用static声明的成员变量为静态成员变量,俗称类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。

这里要强调一下:

  • static修饰的成员变量和方法,从属于类
  • 普通变量和方法从属于对象
  • 静态方法不能调用非静态成员,编译会报错

static关键字的用途一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。

显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

static可以用来修饰类的成员方法、类的成员变量,另外也可以编写 static代码块 来优化程序性能

static方法

static方法也成为静态方法,由于静态方法不依赖于任何对象就可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,既然都没有对象,就谈不上this了,并且由于此特性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。

虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。

静态变量与非静态变量区别:

static变量也称为静态变量,静态变量和非静态变量的区别:

静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化

非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响

static成员变量初始化顺序按照定义的顺序来进行初始化

静态代码块

静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。
在类初次被加载时,会按照静态初始化块的顺序来执行每个块,并且只会执行一次。

被static修饰是否能够改变访问权限   (不能

在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:

public class Person {

    public String name = "李四";

    private static String address = "中国";
}

  

能通过this访问静态成员变量吗? (可以

public class Main {  
    static int value = 33;

    public static void main(String[] args) throws Exception{
        new Main().printValue();
    }

    private void printValue(){
        int value = 3;
        System.out.println(this.value);
    }
}

  输出结果为 33

this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)

了解局部变量 成员变量(也叫全局变量)

public class Test {
   private String name;//成员变量,也是全局变量

   public void changeName() {
       String n = "tomoya";//n就是局部变量
       name = n;
   }
}

            局部变量见名思意 在一个方法内部使用 别的地方就不能使用了 而成员变量是在当前类中的变量,所以作用范围就大的多 在局部变量的方法中也可以使用成员变量

三: 什么是多态      (了解重写 重载

父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。

多态的三个条件:

1.继承的存在(继承是多态的基础,没有继承就没有多态).
2.子类重写父类的方法(多态下调用子类重写的方法).
3.父类引用变量指向子类对象(子类到父类的类型转换).

子类转换成父类时的规则:

1.子类会自动向上转型
2.此时父类调用的重写方法是各个子类的方法实现
3.此时通过父类引用变量无法调用子类特有的方法

多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

了解什么是重写  (就是当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和参数不可以改变
好处:子类根据自己的需要,定义自己的行为
注意: 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

什么是方法的重载

一.方法名一定要相同。

二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。

1.如果参数个数不同,就不管它的参数类型了!

2.如果参数个数相同,那么参数的类型必须不同。

三.方法的返回类型、修饰符可以相同,也可不同。

原文地址:https://www.cnblogs.com/luy520/p/12515194.html

时间: 2024-10-03 14:55:50

面向对象 三 (三大特性)的相关文章

接口和抽象类的对比,面向对象的三大特性和四大特性

Day09_SHJavaTraing_4-14-2017 一.接口和抽象类的对比1.相同点    ①都位于继承的顶端,用于被其他类实现或继承    ②都不能直接实例化对象    ③都包含抽象方法,其子类都必须覆写这些抽象方法2.区别 2.1从声明上: ①抽象类是一个类,需要使用关键字class声明        ②接口不是一个类,使用关键字interface声明 2.2从能够书写的成员上看: ①抽象类可以书写类中的所有成员 ②接口中只能书写成员变量和抽象函数(从JDK8开始,接口中可以有实现的函

面向对象设计三大特性

面向对象设计三大特性 一.封装 良好的封装能够减少耦合:类内部的实现可以自由地修改:类具有清晰的对外接口.比如建立一个猫的类,再建立一个狗的类,这样也算封装,只是会出现大量相似代码. 二.继承 继承的出现是因为对象类中出现过多重复代码,为解决该问题而建立父类,将这部分代码放进父类中,由子类继承.子类继承父类的所有特性,同时可以定义新的特性. 如果子类继承于父类,子类拥有父类非private的属性和功能:子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能:子类还可以以自己的方式实现父类的

关情纸尾-----面向对象的三大特性

面向对象的三大特性 .封装 .继承 .多态 一.封装 1.set方法 (1)作用:提供一个方法给外界设置成员变量,可以在方法里面对参数进行过滤 (2)命名规范: 方法都是以set开头,而且后面要跟上成员变量名,成员变量名的首字母必须是大写 (3)形参名称不要和成员变量同名 (4)返回值一定是void (5)一定要接收一个参数,而且参数类型和成员变量类型一致 2.get方法 (1)作用:返回内部的成员变量 (2)命名规范:方法的名称一般就跟成员变量同名 (3)一定有返回值,并且返回值类型和成员变量

java基础篇(一) ----- java面向对象的三大特性之封装

java面向对象的三大特性之封装:   封装(Encapsulation)是面向对象的一个重要特征,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节. 通俗的讲所谓封装就是将属性和方法捆绑到一起,封装到一个对象中去, 形成一个不可分割的独立单位,以及尽可能隐藏对象的内部结构,也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了. 如果形容一个人(假设把人看做一个类),我们可以用姓名.年龄,性别等来描述,如果不封

5 面向对象的三大特性

面向对象的三大特性是什么?(封装.继承.多态) 封装: 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴露在外面的时钟表面,给外界提供展示以及接口.@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来. 封装主要体现在:实例变量.对象方法.类方法的封装 set方法 在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public.@protected等关键字修饰 ,而是使用Set方法来为对象

黑马程序员——OC面向对象的三大特性

一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 2. set方法 1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 2) 命名规范: ? 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写 ? 形参名称不要跟成员变量同名 3

Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

概念:                                                                                                                                                     ·        面向过程:根据业务逻辑从上到下写垒代码 ·        函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 ·        面向对象:对函数进行分类和封装,

java基础笔记(6)----面向对象的三大特性

简介:面向对象的三大特性就是封装,继承,多态,是面向对象的核心. 封装 简介:封装是类的边界,可以对数据起到保护作用 特性:属性私有,提供公开的get/set方法 属性私有:private 数据类型 变量名:---->private修饰的属性只能在本类使用 公开的get/set方法 public修饰---- >在任何类中都可以使用 get方法:----获取属性的值 public 数据类型 getXxx(){ return this.属性名 } set方法:----修改属性的值 public v

面向对象的三大特性之多态

# 面向对象的三大特性之多态 # 多态 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同 # 多态的概念指出了对象如何通过他们的属性和动作来操作及访问,而不需要考虑他们具体的类 # 多态表明了动态(运行时)绑定的存在,允许重载及运行时类型确定和验证 # 多态是由同一个类实例化出的多个对象,这些对象执行方法时,执行的过程和结果是不一样的 class H2O: # 定义了一个水的基类 def __init__(self, name, temp): # 初始化实例属性 self.name =