java的三个特性:封装、继承和多态

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/baidu_33094261/article/details/102760289

面向对象—封装

1.1
类和对象

1.1.1类和对象理解

对象:世间万物

类:类是对现实生活中一类具有共同属性和行为的事物的抽象

类是对象的数据类型,类是具有相同属性和行为的一组对象的集合

简单理解:类就是对现实事物的一种描述

类的组成

属性:事物的特征

行为:事物能执行的操作

类和对象的关系:类是对事物的一种描述,对象则为具体存在的事物。

1.1.2类的定义:

类的组成是由属性和行为组成。

类的定义步骤:

①定义类

②编写类的成员变量

③编写类的成员方法

public class 类名 {

// 成员变量

变量1的数据类型 变量1;

变量2的数据类型 变量2;

// 成员方法

方法1;

方法2;

}

示例代码

/*

手机类:

类名:

  手机(Phone)

成员变量:

品牌(brand)

价格(price)

成员方法:

打电话(call)

发短信(sendMessage)

*/

public class Phone {

//成员变量

String brand;

int price;

//成员方法

public void
call() {

 System.out.println("打电话");

}

public void
sendMessage() {

System.out.println(“发短信”);

}

}

1.1.3对象的使用

创建对象的格式:

类名 对象名=new 类名();

调用成员的格式:

对象名.成员变量

对象名.成员方法()

1.2
对象内存图

凡是new出来的东西都在堆内存

自己所定义的成员变量都是栈内存

1.3
成员变量和局部变量区别
(%5B%E5%A4%96%E9%93%BE%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E5%A4%B1%E8%B4%A5,%E6%BA%90%E7%AB%99%E5%8F%AF%E8%83%BD%E6%9C%89%E9%98%B2%E7%9B%97%E9%93%BE%E6%9C%BA%E5%88%B6,%E5%BB%BA%E8%AE%AE%E5%B0%86%E5%9B%BE%E7%89%87%E4%BF%9D%E5%AD%98%E4%B8%8B%E6%9D%A5%E7%9B%B4%E6%8E%A5%E4%B8%8A%E4%BC%A0%28img-6uNPmoXU-1572090409967%29%28https://blog.csdn.net/HXNLYW/article/details/94550158%29%5D)

1.4
封装和构造方法

1.4.1
private

private是一个修饰符,可以用来修饰成员(成员变量,成员方法)

被修饰成员,只能本类访问。如需被他类使用,需有对应操作。

1.4.2
this

this修饰的变量用于指代成员变量,主要作用(区分局部变量和成员变量的重名问题)

方法的形参与成员变量相同,不带this修饰的变量指的是形参

this使用时间:解决局部变量隐藏成员变量

this:代表所在类的对象引用。(方法被哪个对象调用,this就代表哪个对象)

方法的形参与成员变量不同,不带this修饰的变量指的是成员变量

this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象

1.4.3
封装思想

封装概述

是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的

封装原则

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法

封装好处

通过方法来控制成员变量的操作,提高了代码的安全性把代码用方法进行封装,提高了代码的复用性。

1.4.4构造方法

构造方法是一种特殊的方法

作用:创建对象 Student stu = new Student();

格式:

public class 类名{

修饰符 类名( 参数 ) {

}

}

功能:主要是完成对象数据的初始化

构造方法的创建

如果没有定义构造方法,系统将给出一个默认的无参数构造方法 如果定义了构造方法,系统将不再提供默认的构造方法

构造方法的重载

如自定义带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法

推荐的使用方式

无论是否使用,都手工书写无参数构造方法

重要功能!

可以使用带参构造,为成员变量进行初始化

面向对象—继承

2.1继承定义、利弊、super、访问特点

2.1.1定义

继承的格式

格式:public class 子类名 extend 父类名{}

范例:public class Zi extend
Fu{}

父类:也可被称为基类、超类。

子类:派生类

继承中子类的特点:

①子类可以有父类的内容

②子类还可以自己的特有的内容

2.1.2继承的利弊

利:提高代码复用性和维护性

弊:提高了类之间的耦合性,父类变化子类也需要跟着变化,削弱了子类的独立性

使用继承的时间:

继承体现关系:is a

假设法:A和B两个类,A是B的一种或B是A的一种,即存在继承关系。

举例:苹果和水果,猫和动物,狗和猫[XG1]

2.1.3继承中变量的访问特点:

在子类方法中访问一个变量

子类局部范围找

子类成员范围找

父类成员范围找

如果都没有就报错(不考虑父亲的父亲[XG2] …)

2.1.4 Super

Super关键字的用法和this关键字类似

2.1.5继承中构造方法的访问特点

默认都访问父类中无参的构造方法

2.1.6继承中成员方法的访问特点

通过子类对象访问一个方法

①子类成员范围找

②父类成员范围找

③如果都没有就报错(不考虑父亲的父亲…)

2.2方法重写和方法重写注意特征

2.2.1方法重写

概述:子类中出现了和父类一模一样的方法声明。

应用:当子类需要父类的功能,而主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

@Override

注解,可以帮助检查重写方法的方法声明的正确性

2.2.2注意事项

私有方法不能被重写(父类私有成员子类是不能继承的)

子类方法访问权限不能更低(public>默认>私有)

2.3 java中继承的注意事项、package、import

2.3.1
java中继承的注意事项

只支持单继承,不支持多继承

Java中类支持多层继承

2.3.2
package

修饰符

包:其实是文件夹,

作用:对类进行分类管理

定义格式:

格式:package包名; (多级包用;分开)

范例:package com.itheima;(记事本)

2.3.3
import

导包:使用不同包的类,使用时要写包的全路径,写起来太麻烦了,为了简化带包操作,java提供了导包的功能。

格式:import包名;

范例:import cn.com.itcast.Teacher

2.4权限修饰符(private、protected、public)、状态修饰符(final、static)

2.4.1权限修饰符(private、protected、public)

2.4.2状态修饰符(final、static)

final:可以修饰成员方法,成员变量,类

final修饰的特点:

修饰方法:表明该方法最终方法,不能被重写

修饰变量:表明该变量是常量,不能再次被赋值

修饰类:表明该类是最终类,不能被继承

final修饰局部变量:

基本类型:修饰的数据值不能发生改变

引用类型:修饰的地址值不能发生改变,地址里内容可以改变

static:可以修饰成员方法,成员变量

static修饰的特点:

 被类的所有对象共享(这也是我们判断是否使用静态关键字的条件)

 可以通过类名调用,也可以通过对象名调用,推荐使用类名调用

static访问特点;静态成员方法只能访问静态的成员方法。

面向对象—多态

3.1多态

3.1.1多态

同一对象,在不同时刻表现出来的不同时态

举例:猫

可以说猫是猫:猫cat=new 猫();

也可以说猫是动物:动物 animal=new 猫();

猫在不同时刻表现出来不同的形态,这就是多态。

多态的前提和体现

有继承/实现关系

有方法重写

有父类引用指向子类对象

3.1.2多态中成员访问特点:

成员变量:编译看左边,执行看左边

成员方法:编译看左边,执行看右边

访问不一样原因:成员方法有重写,而成员变量没有

3.1.3好处和弊端

好处:提高程序扩展性

 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。

弊端:不能使用子类的特有功能

3.1.4转型

①向上转型

  从子到父

  父类引用指向子类对象

②向下转型

   从父到子

   父类引用转为子类对象

3.1.5抽象类

Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

抽象类特点:

抽象类和抽象方法必须使用abstract关键字修饰

public abstract class类名{}

public abstract void eat();

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

抽象类不能实例化

抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态

抽象类的子类

要么重写抽象类中的所有抽象方法

要么是抽象类

抽象类的成员特点

成员变量(可以是变量也是常量)

构造方法

有构造方法,但不能实例化

那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化

成员方法

可以有抽象方法:限定子类必须完成某些动作

也可以有非抽象方法:提高代码复用性

3.2接口

3.2.1接口及其特点、成员特点

接口概述:

接口就是一种公共的规范标准,只要符合规范标准,就可以使用

Java中的接口更多的体现在对行为的抽象

接口的特点

接口用关键字interface修饰

public interface 接口名{}

类实现接口用implements表示

public class类名implements接口名{}

接口不能实例化

接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。

多态的形式:具体类多态,抽象类多态,接口多态

多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象

接口的实现类

要么重写接口中的所有抽象方法

要么是抽象类

接口的成员特点

成员变量

只能是常量

默认修饰符:public static final

构造方法

接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在

一个类如果没有父类,默认继承自Object类

成员方法

只能是抽象方法

默认修饰符:public abstract

3.2.2类和接口的关系

类和类的关系

继承关系,只能单继承,单可多层继承

类和接口的关系

实现关系,可单实现,也可多实现,还可以在继承一个类的同时实现多个接口

接口和接口关系

继承关系,可单继承,也可多继承

3.2.3抽象类和接口的区别

抽象类是对事物的抽象,而接口是对行为的抽象

3.2.4类名作为形参和返回值

方法的形参是类名,其实需要的是该类的对象

方法的返回值是类名,其实返回的是该类的对象

3.2.5抽象类名作为形参和返回值

方法的形参是抽象类名,其实需要的是该抽象类的子类对象

方法的返回值是抽象类名,其实返回符是该抽象类的子类对象

3.2.6接口名作为形参和返回值

方法的形参是接口名,其实需要的是该接口的实现类对象

方法的返回值是接口名,其实返回的是该接口的实现类对象

3.3内部类

3.3.1内部类

内部类:在一个类中定义一个类

内部类的定义格式

格式

public class类名{

   修饰符class类名{

}

}

范例:

public class类名{

  public

class Inner{

}

}

内部类访问特点

内部类可以直接访问外部类的成员,包括私有

外部类要访问内部类的成员,必须创建对象

3.3.2成员内部类

只需记一个,成员内部类创建对象使用格式

格式:外部类名.内部类
对象名=外部类对象.内部类对象

3.3.3局部内部类

局部内部类是在方法中定义的类,故外界无法直接使用,需要在方法内部创建对象并使用

该类可以直接访问外部类的成员,也可以访问方法内的局部变量

3.3.4匿名内部类

前提:存在一个类或者接口,这里的类可以是具体类也可以抽象类

格式:

new 类名或接口名(){

     重写方法;

}

范例:

new Inter(){

   public void show(){

}

}

本质:是一个继承了该类或者实现了该接口的子类匿名对象

[XG1]这样的关系不应该使用继承

[XG2]出现这种情况会报错

猜你喜欢

转载自blog.csdn.net/baidu_33094261/article/details/102760289