Java:面向程序对象设计

Posted 情痞@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:面向程序对象设计相关的知识,希望对你有一定的参考价值。

@toc

前言

这章就进入了对Java面向对象的学习,有了前面的铺垫,我想大家对Java已经有了一定的了解,这章我会为大家讲述关于类的相关知识。

一、类

1.1 类的定义

1.类声明

格式如下:
<修饰符> class <类名> exend<父类> implement<接口名>
几点说明:
(1)类定义修饰符。
类定义修饰符为类声明中可选部分;如定义性质(包括abstract、final)和访问权限(如public或默认),后续我会讲解。
(2)extend。
extend为类声明中可选部分,用于说明类的父类;一般形式为extend<父类>。
(3)implement。
implement为类声明中可选部分,用于说明类的接口。

2.类主体

类主体基本格式如下:
<类声明>
<成员变量的声明>
<成员方法的声明及实现>

注意;Java里面没有独立的函数,所有的函数都是作为类方法定义的。

请看下面类声明与定义的源代码:

class point
    int x;
    int y;
    void init (init int ix,int iy)
        x=ix;
        y=iy;
    

上面是一个对点赋值的类声明,这里可以清楚的看出类成员是x与y,我们用类方法init()来对点进行赋值;

有的博友可能到现在还没有明白类的成员变量和成员方法是啥,我们下面开始讲解;

3.成员变量

定义格式一般如下:
[ 变量修饰符] <变量类型> <变量名>

这里注意,在java程序内,成员变量是唯一的,但是允许成员变量的名字与成员方法相同,不同类之间也可以出现相同的成员变量名,由于他们的作业区域不同,或者可以通过访问权限来加以区别。

4.成员方法

格式如下:
[方法修饰符] <返回值类型> <方法名> ([ 参数列表 ])

方法体

这里的方法体里面包括了对代码的实现,在里面可以定义局部变量,但作用域仅局限于方法内。

5.构造方法的几点说明:

在定义构造方法时需要注意以下几点。
(1)构造方法没有返回值类型,甚至没有 void,其修饰符只能是public、private、 protected中的任一个。
(2)构造方法不能从父类中继承。
(3)系统默认提供无参构造方法,该方法根据成员变量的类型进行初始化。
(4)构造方法可以重载 ,一个类可以有任意多个构造方法。
(5)构造方法不能直接通过方法名引用,必须通过new 运算符。
(6)在构造方法中以调当前类和其父类的另一个构造方法,但必须是方法体的第一句。使用当前类的构造方法用 this来引用,使用其父类的构造方法用 super来引用。

1.2 类的使用

1.对象声明

格式如下:
类名 对象名;
举例:
class a;

2.对象创建

在Java里,对象的声明并没有分配对象,因而我们要通过new运算符来将对象实例化。
这里我们有两种方法进行对对象的初始化;
(1)先声明,后赋值;
(2)声明与赋值同时进行;
第二种方法用的较多,它的格式如下:
类名 对象名=new 类名();

有时候为了方便,我们会利用数组来进行多个对象的赋值

3.对象使用

对象可以通过“.”运算符来实现对自己的成员变量和方法的调用。

4.对象释放

当对象不再使用时,java会自动进行垃圾回收工作,简化了程序的出错。

1.3 方法重载

方法重载就是在一个类中,多个方法,他们的方法名相同,但参数的个数或者类型不同。方法的返回值不作为判断依据。

二、访问权限的控制符

2.1 public 、protected与private

1.public:

public类型可以被任意类和方法访问与引用,这里需要注意,Java的文件名应与public后面的类名一致。

2.protected:

具有protected属性的类成员可以被本类、本包中的其他类和其他包中子类访问,访问性低于public,高于默认。

3.private:

用private修饰符只能被该类的成员变量或者方法来访问和修改,而不能被任何其他类获取引用(包括该类的子类)。

2.2 默认

如果在定义类、接口、成员变量、成员方法没有指定访问属性时,则此时访问属性为默认权限。只能被本类和同一个包中的其他类、接口和成员方法引用,因此默认权限也被称为包权限

下面表格对上述的总结:

2.3 getInfo和setInfo

出于系统设计安全考虑,将成员属性定义为private形式保护起来,而将类的成员方法定义为public形式对外公开,这是类封装性的体现。一般来说,类中应提供get方法(获取private的成员变量值)和set方法(修改private的变量值),以便其它类操作该类private成员变量。

三、继承

3.1 类的继承

格式如下:
class 子类名 extends 父类名 [implement<接口名>]

Java语言通过使用关键字 extends来实现类的继承,如果类定义时没有使用extends关键字,则默认该类的父类是java.lang.Object类。该类是 Java预定义的所有类的父类,出现在层次结构的最上层。Object类包含了所有Java的公共属性,其中定义的属性可以被任何类使用、继承或修改。

注意:Java里面不支持多继承,只支持单继承。

3.2 super的使用

子类在继承父类时,可能会出现变量隐藏、方法覆盖 ( overriding)等现象。变量隐藏指子类的成员变量与父类成员同名时,父类的成员变量被隐藏。方法覆盖指子类的方法与父类的方法相同,方法的返回值类型、入口参数的数目类型、顺序均相同,只是方法实现的功能不同,此时父类的方法被覆盖。如果子类需要调用或访问父类被隐藏的变量或被覆盖的方法,可以使super关键字实现。

看一段代码:
```java斜体样式
public class text
public static void main(String[] args)
B b=new B();
b.upload();


class A
public void upload()
//上传文件的100行代码


class B extends A
public void upload()
super.upload();//用super关键字调用父类的上传文件100行逻辑代码
//修改文件名的1行代码

***这里注意***,有三种情况可以用关键字super:
(1)用来访问父类中覆盖的方法;
(2)用来访问父类被覆盖的变量;
(3)用来调用父类的构造方法。

## 3.3对象类型转换
父类有的方法和属性,子类都有。因此,Java中的子类对象可以向上赋值给父类对象,即上转型对象,当然也允许父类对象的引用指向子类。

举例:假设subclass是子类,而superclass是父类。
superclass superclass=new suclass();**//父类引用指向子类**

反过来,子类指向父类时,可能会出现错误,因为子类具有的信息,而父类不一定有。
suclass suclass =new sucalss();**//子类的引用指向父类**

***几点关于上转型对象的说明:***
(1)不能操作子类新增加的成员变量和成员方法。
(2)可以代替子类对象调用子类重写的实例方法。
(3)可以调用子类继承的成员变量和隐藏的成员变量。

# 四、多态性
## 4.1方法重载与方法覆盖
方法重载(overloading)与方法覆盖(overriding)是实现多态性的基本手段,但两者的机制不同。**方法重载**是指一个类中可以有多个方法具有**相同的名字,但这些方法的参数不相同**。参数不同具体体现为参数的个数不同,或者是参数的类型不同。**方法覆盖**是指**子类的方法名与父类的方法名完全相同,并且返回值类型、入口参数的数目、类型均相同,即在子类中重新改写了父类的同名方法**。Java根据实际参数的个数和类型来选择调用合适的方法,这样就能使用相同的方法名实现不同的功能体现了多态性。

## 4.2运行时多态性
Java的多态性是在执行阶段,而不是在编译阶段。
来看一个经典的例子:

```java
public class A 
    public String show(D obj) 
        return ("A and D");
    

    public String show(A obj) 
        System.out.println((this instanceof A) + "A this instanceof A");
        System.out.println((this instanceof B) + "A this instanceof B");
        return ("A and A");
    



class B extends A
    public String show(B obj)
        return ("B and B");
    

    public String show(A obj)
        System.out.println((this instanceof A) + "B this instanceof A");
        System.out.println((this instanceof B) + "B this instanceof B");
        return ("B and A");
    


class C extends B



class D extends B



class Test 
    public static void main(String[] args) 
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
    

运行结果:

输出结果
trueA this instanceof A
falseA this instanceof B
1--A and A
2--A and C
3--A and D
trueB this instanceof A
trueB this instanceof B
4--B and A
5--A and C
6--A and D
7--B and B
8--A and C
9--A and D

上面的代码可以清楚看出多态性的运行。

五、非访问控制符

在类定义中,除了可以用访问属性来修饰成员变量和方法,还可以用static、final、abstract等说明成员变量或方法的特性。

static可以用来修饰成员变量与方法,分别被称为类变量(静态变量)和类方法(静态方法)。

1.类变量

在生成每个类的实例变量时,Java 运行系统为每个对象的实例变量分配一个内存空间,实例变量指向该内存空间,不同的实例变量占用不同的内存区域。对于类变量来说,Java 运行系统为其分配公共的存储空间,该类的每个实例对象 共享 同一类变量的存储空间。因此,每个对象对类变量的修改都会影响其他实例对象。

几点说明:
(1)类变量可以不用对象访问,直接通过类名访问。
(2)任何一个对象对类变量的修改都会影响其他实例对象。

2.类方法

声明为static 的方法称为类方法(或称静态方法),与此相对,没有static修饰的成员方法则为实例方法。类方法的本质是该方法属于整个类,而不是属于某个实例。调用类方法时可以不创建实例,直接通过类名调用

类方法的使用具有以下特点。
(1)类方法可以通过类名直接调用,而不需要创建实例对象。
(2)类方法属于整个类,被调用时可能还没有创建任何对象实例,因此类方法内只可以访问类变量,而不能直接访问实例变量和实例方法
(3)类方法中不能使用this关键字,因为静态方法不属于任何一个实例(类方法里面没有this指针)。

六、包

为了更好的组织类,Java提供了包机制。包是类的容器,Java中的包一般均包含相关的类。

6.1 Java的名字空间

Java注意解决名字空间的冲突问题。没有全局的方法,也没有全局的变量,所有的变量和方法都是在类中定义,且是类的重要组成部分,每个类又是包的一部分。 因此每个Java变量或方法都可以用全限定的名字表示,包括包名、类名、域名3部分,之间用“.”分隔。

Java编译器将Java程序的每个类的编译代码(即字节码)放在不同的文件中,这些编译代码的文件名与类同名,但要加上扩展名( class)。因此一个包含有多个类定义的源文件编译后有多个.class文件。

Java源代码的扩展名一般为java, 其中包括一个或多个类定义。如果在Java文件中有多个类定义,则只能有一个类可以定义为public, 并且这个类的名字必须与程序的源代码名(去掉扩展名)一致。

6.2 包的定义与引入

1.包的定义

我们可以使用package来指明类是属于哪个具体的包。
定义如下:
package pkg1[.pkg2.[pkg3....] ];

这里注意,包名与文件夹的目录是一致的。

2.包的引入

当使用其他包内的类时,需要在程序首行使用import语句。
如下:
import pkg1[.pkg2.[pkg3....] ];

import语句只用来将类中其他包中的类引入到当前空间内。

6.3 JDK提供的主要包

1、java.lang
包含一些Java语言的核心类,如String,Math,Integer,System和Thread,提供常用功能。
2、java.awt
包含了构成抽象窗口工具类(abstract,Windows,tookits)的多个类,这些类被用来构建和管理应用程序的图形用户界面。
3、java.net
包含执行与网络相关的操作的类。
4、java.io
包含能提供多种输入/输出功能的类。
5、java.util
包含一些实用工具类,如定义系统特性,使用与日期日历相关的函数。

上面即为本章大概内容,若有问题,请指正。
也欢迎大家来讨论疑惑。

以上是关于Java:面向程序对象设计的主要内容,如果未能解决你的问题,请参考以下文章

java面向对象程序设计有啥缺点?

20165308 实验二 Java面向对象程序设计

Java面向对象大致梳理

实验二 Java面向对象程序设计

实验二 Java面向对象程序设计

程序大牛由浅入深,带你学习面向对象编程