类和对象、封装、继承、多态

类和对象

类和对象的概念

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

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

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

定义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

原文地址:https://www.cnblogs.com/twodog/p/12134779.html