zoukankan      html  css  js  c++  java
  • 类和对象、封装、继承、多态

    类和对象

    类和对象的概念

    类:客观存在的,抽象的,概念的东西。一个类可以被定义为描述行为的模板;

    对象:对象是具体的,实际的,代表一个事物。对象具有状态和行为。

    类是对象的模板,对象是类的一个具体实体。

    定义Java中的类

    一个类可以包含以下任意变量类型。

    a)局部变量: 方法里面,构造函数或块中定义的变量称为局部变量。该变量将被声明和初始化的方法中,当该方法完成该变量将被销毁。

    b)实例变量: 实例变量都在一个类,但任何方法之外的变量。这些变量在类被加载的实例化。实例变量可以从内部的任何方法,构造函数或特定类别的块访问。

    c)类变量: 类变量是在一个类中声明,任何方法之外的变量,用static关键字。

    类可以有任意数量的方法来访问各种方法的值。

    创建对象

    Java中,关键字 new 用于创建新的对象。

    从类创建对象时有三个步骤:

    声明: 变量声明,一个变量名的对象类型。

    实例: "new"关键字是用来创建对象。

    初始化: 关键字 new 后跟调用一个构造函数。这个调用初始化新的对象。

    声明类,import语句和包声明在源文件时的规则

    只能有一个有public类在每一个源文件。

    源文件可以有多个非公共类。

    公共类名应该是源文件,以及应当由 .java 在末尾附加的名称。例如:类名是 public class Employee{} 将源文件应为 Employee.java。

    如果类在包中定义,那么 package 语句应该是在源文件中的第一条语句。

    如果 import 语句都存在,那么它们必须写 package 语句和类声明之间。如果没有包(package)语句,那么import语句应该是源文件中的第一行。

    导入和包语句将意味着对所有现有的源文件中的类。不可能的声明不同的 import和/或包语句不同类的源文件中。

    类有几个访问级别,有不同类型的类,抽象类,final类等将在访问修饰符章解释这些。

    除了上述类型的类,Java也有一些特殊的类称为内部类和匿名类。

    Java包:

    简单地,它是分类的类和接口的方式。在开发Java应用程序中,数以百计的类和接口将会被写入,因此,分类这些类是必须的。

    import语句:

    在Java中,如果一个完全合格的名称,其中包括包和类名,变量的话,编译器可以很容易地找到源代码或类。 import语句是给予适当的位置,是编译器发现,特定的类的方法。

    成员变量和局部变量

    成员变量:再类中定义,用来描述对象将要有什么。

    局部变量:在类的方法中定义,在方法中临时保存数据。

    区别:作用域不同;初始值不同;优先级

    局部变量的作用域仅限于定义它的方法;成员变量的作用域在整个类内部可见。

    Java会给成员变量一个初始值,不会给局部变量赋予初始值

    两类变量同名时,局部变量具有更高的优先级。

    构造方法

    使用new+构造方法创建一个新的对象

    构造方法是定义在Java类中的一个用来初始化对象的方法,构造方法与类名相同且没有返回值。

    public 构造方法名(){

        //代码块;

    }

    没指定构造方法时,系统自动生成无参构造方法(默认构造方法)。

    当有指定构造方法,无论是有参,无参构造方法,都不会自动添加午餐的构造方法。

    构造方法重载:方法名相同,参数不同的多个方法。

    构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值。

    static使用——静态变量

    Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。鉴于他作用的特殊性更推荐用类名访问。

    使用 static 可以修饰变量、方法和代码块。

    注意:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!

    static使用——静态方法

    与静态变量一样,也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。

    静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。;

    如果希望在静态方法中调用费静态变量,可通过创建类的对象,然后通过对象来访问非静态变量。

    在普通方法成员中,则可以直接访问同类的非静态变量和静态变量。

    static使用——静态初始化块

    Java中可以通过初始化块进行数据赋值。

    Public class HelloWorld{

        String name;//定义一个成员变量

        //通过初始化块为成员变量赋值

        {

            name = "周星驰";

    }

    }

    在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

    注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。

    执行顺序:静态初始化块—普通初始化块—构造方法。静态初始化块只在类加载时执行一次。

    封装

    oop

    封装、继承、多态和抽象。

    概念

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

    好处

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

    隐藏类的实力细节,方便修改和实现。

    实现步骤

    修改属性的可见性(设为private);

    创建getter/setter方法(用于属性的读写);

    在getter/setter方法中加入属性控制语句(对属性值得合法性进行判断)。

    也可以使用普通方法为属性赋值(非标准)。

    使用包管理Java中的类

    包的作用:管理Java文件;解决同名文件冲突。

    定义包:package包名。

    注:必须放在Java源程序的第一行;包名间可以使用"."隔开。

    系统中的包:

    Java.(功能).(类)

    Java.lang.(类)包含Java语言基础的类

    Java.util.(类)包含各种工具类

    Java.io.(类)I/o相关功能

    包的使用:

    通过import关键字,在某个文件中好似用其他文件中的类;

    包的命名规则是全小写;

    使用时不仅可以加载某个包下的全部文件,也可以加载某个具体子包下的所有文件。

    访问修饰符

    Java语言中有4种访问修饰符——可以修饰属性和方法的访问范围。

    package(默认)、private、public和protected。

    package是默认的保护模式,又叫做包访问,没有任何修饰符时就采用这种保护模式。包访问允许域和方法被同一个包内任何类的任何方法访问.(包内访问)。

    private标识得访问模式,表示私有的域和方法只能被同一个类中的其他方法访问,实现了数据隐藏;必要时,可以通过方法访问私有变量.(类内访问)。

    public修饰符用于暴露域和方法,以便在类定义的包外部能访问它们。对包和类中必要的接口元素,也需要使用这个级别;main()方法必须是public的,toString()方法也必须是public的。一般不会用public暴露一个域,除非这个域已经被声明为final。(跨包访问)。

    protected修饰符提供一个从包外部访问包(有限制)的方法。在域和方法前增加protected修饰符不会影响同一个包内其他类的方法对它们的访问。要从包外部访问包(其中含有protected成员的类),必须保证被访问的类是带有protected成员类的子类。也就是说,希望包中的一个类被包之外的类继承重用时,就可以使用这个级别。一般应该慎用。(包中类被包外类继承慎用)。

    this关键字

    this关键字代表当前对象

    封装对象的属性的时候经常使用this关键字

    Java中的内部类

    定义:定义在另外一个类里面的类。包含内部类的类被称为外部类。

    作用:a)内部类提供了更好的封装,可以吧内部类隐藏在外部类之内,不允许同一包中的其他类访问该类;b)内部类的方法可以直接访问外部类的所有数据,包括私有数据;c)内部类所实现的功能使用外部类同样可以实线,只是使用内部类更方便。

    包括:

    成员内部类;

    静态内部类;

    方法内部类;

    匿名内部类。

    成员内部类

    1、Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等

    2、 Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a

    3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );

    4、 编译的程序后,会发现产生了两个 .class 文件

    Outer$Inner.class

    Outer.class

    其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class

    1、 外部类是不能直接使用内部类的成员和方法

    可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

    2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字

    静态内部类

    静态内部类是 static 修饰的内部类,这种内部类的特点是:

    1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问

    2、 如果外部类的静态成员与内部类的成员名称相同,可通过"类名.静态成员"访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过"成员名"直接调用外部类的静态成员

    3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

    方法内部类

    方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

    注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

    继承

    概念、好处

    类与类的一种关系,"is a"的关系。

    子类具有父类的所有属性和方法(代码复用)

    语法:class 子类 extends 父类{

             //代码块

    }

    方法的重写

    定义:如果子类对继承父类的方法不满意,重写父类的方法,调用时会优先调用子类的放方法。

    语法:返回值类型、方法名、参数类型及个数都要与父类继承的方法相同。

    继承的初始化顺序

    1、先初始化父类对象

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

    final关键字的使用

    可以修饰类、方法、属性和变量

    修饰类:该类不允许被继承;

    修饰方法:该方法不允许被覆盖(重写)

    修饰属性:该类的属性不会进行隐式的初始化(类的初始化属性必须有值),或在构造方法中赋值(只能选其一)

    修饰变量:该变量只能赋一次值,即变为常量。

    super关键字

    在对象内部使用,可以代表父类对象,类似于this关键字。

    子类的构造过程中必须调用其父类的构造方法(隐式的使用super关键字)。

    如果子类构造方法中既没有显式调用父类的构造方法,而父类没有无参的构造方法,则编译出错。

    Object类

    1、toString()方法

    在Object类里定义toString()方法的时候返回对象的哈希code码(对象地址字符串)(

    可通过重写toString()方法表示出对象的属性

    2、equals()方法

    比较的是对象的引用是否指向同一块内存地址。

    3、getClass()方法得到类对象

    类对象描述的是类代码信息(类有那些属性,成员等等),判断两个对象类型是否相同。

    多态

    对象的多种形态

    引用多态

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

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

    方法的多态

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

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

    注:父类引用不能引用子类的独有的方法。

    引用类型转换

    向上类型转换(隐式/自动),小类型到大类型——无风险

    向下类型转换(强制),大类型到小类型——有风险

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

    抽象类

    使用abstract关键字修饰。

    限制规定子类必须实现某些方法,但不关注实现细节。

    使用规则:a)abstract定义抽象类;b)abstract定义抽象方法,只有声明,不需要实现;c)包含抽象方法的类是抽象类;d)抽象类中可以包含普通的方法;e)抽象类不能直接创建,可以定义引用变量。

    接口

    1、概念:特殊的类,由全局常量和公共的抽象方法所组成。

    类是一种具体实现体,接口定义了某一批所需要遵循的规范,借口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它之规定这些类里必须提供某些方法。

    2、定义:interface关键字。

    3、基本语法:[修饰符] interface 接口名 [extends 父接口1,父接口2…]

    {

        零到多个常量定义…

        零到多个抽象方法的定义…

    }

    4、常量/方法:接口中的属性是常量,即使定义时不添加public static final 修饰符,系统也会自动加上。

    5、使用接口:一个类可以实现一个或多个接口(implements)关键字。Java中一个类只能继承一个父类,不够灵活,通过实现多个接口可以做补充。

    [修饰符] class 类名 extends 父类 implements 接口1, 接口2…

    {

        类体//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。

    }

    如果要继承父类,继承父类必须在实现接口之前。

    6、接口在使用过程中,还经常与匿名内部类配合使用。

    匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称。

    Interface I = new Interface(){

        Public void method(){

            System.out.println("niming");

        }

    }

    转载于:https://www.cnblogs.com/willhunting/p/5052602.html

  • 相关阅读:
    gdb调试的基本使用
    重构改善代码--代码的坏味道
    17级单片机期中测试题目
    左右固定,中间自适应的三栏式布局五种写法
    存一些可能会用得到的vue的UI框架
    vue父子组件传值
    [Vue warn]: Missing required prop: "title"
    js中的值类型和引用类型的区别
    vue+node+mongoDB 火车票H5(四)---完成静态页面
    vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
  • 原文地址:https://www.cnblogs.com/twodog/p/12134779.html
Copyright © 2011-2022 走看看