编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

Java:面向程序对象设计 java面向对象五大设计原则

gowuye 2024-04-04 11:52 12 浏览 0 评论


前言

这章就进入了对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

包含一些实用工具类,如定义系统特性,使用与日期日历相关的函数。

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

原文链接:https://blog.51cto.com/u_15713339/5472458

相关推荐

嵌入式C语言中常量的应用实例(嵌入式c语言中常量的应用实例是什么)

常量,我们都知道,就是数值保持不变的量。在C语言中,常量一旦初始化了,它的值将在整个程序运行周期内,不允许发生任何变化。常量与变量是相对的,我们实际项目中经常会用到它。定义常量的两种方式C语言中主要有...

C语言编程基础知识汇总学习,适合初学者!更新常量知识

(二)整型常量整型常量有3种形式:十进制整型常量、八进制整型常量和十六进制整型常量。(注意:c语言中没有直接表示二进制的整型常量,在c语言源程序中不会出现二进制。)书写方式如下:十进制整型常量:123...

【C语言】第二章第六节:字符串常量

第二章第六节:字符串常量。下表C语言中的常用转义字符。·字符形式功能:ASCIl码(十进制形式)。→\t水平制表(横向跳格:跳到下一个tab位置)。→\b退格8。→\r回车(不换行,光标移到本行行首)...

「GCTT 出品」Go 系列教程——5. 常量

这是我们Golang系列教程的第五篇。定义在Go语言中,术语”常量”用于表示固定的值。比如5、-89、IloveGo、67.89等等。看看下面的代码:varaint=50v...

每日C语言-常量指针、指针常量、指向常量的指针常量

一、常量指针1)什么是常量指针?通过该指针不可以修改其所指向存储单元中的值指针本身即地址可以被修改2)定义:类型说明符const*指针变量;类型说明符表示指针所指向存储单元中的值得数据类型指针...

C语言-符号常量、常变量、变量之我见

更新内容:新增音频。音频和文章一起更配oHello,大家好,又和大家见面了~~相信很多朋友们听了C语言的“符号常量”、“常变量”、“变量”后还是对这三者一脸懵逼吧。不管老师怎么歇斯底里地讲解,同学们迷...

零基础带你学习C语言:四:探索常量与变量

前言常量与变量学习;一:分析:short、float、long类型#include<stdio.h>intmain(){shortage=18;floatweight=12...

C语言中是如何定义常量的?那定义字符串呢?

常量有整型常量、浮点型常量、字符型常量及字符串常量。‘常量定义是指定义符号常量,用一个标识符来代表一个常量,通过宏定义预处理指令来实现。常量的定义:#definecount60这就定义了一个常量...

C语言符号常量的优点,会是那几点?

符号常量是一个常量,是不变量,所以,在编译的时候,就把符号常量出现的地方,替换为符号常量对应的常量。符号常量一般用户定义一个全局使用的数据,而且要改变该数据的时候,只需要改变符号常量的值,代码中引用符...

嵌入式开发- C语言数据类型-常量(c语言嵌入式是干嘛的)

基本数据类型的常量-掌握**整型常量:**常量是指在程序运行期间其数值不发生变化的数据。整型常量通常简称为整数整数可以是十进制数、八进制数、十六进制数八进制06334十六进制0xd1...

c语言解剖课:只读变量、常量、字面量傻傻分不清?

写在前面本篇主题的缘起,是因为一个计算机专业的大学生在和我讨论c语言问题时,说const常量如何如何,我说变量被const修饰了,还是变量,不是“常量”。他给了我一个截图:他说大模型都是这样回答的,变...

C/C++编程笔记:C数组、字符串常量和指针!三分钟弄懂它

想弄懂C语言中数组和指针的关系吗?这篇文章就占据你三分钟时间,看完你肯定会有收获!数组数组声明为数据类型名称[constant-size],并将一个数据类型的一个或多个实例分组到一个可寻址的位...

C语言入门到精通【第008讲】——C语言常量

C语言常量常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。常量就像是常规的变量,只不过常...

这是C语言无法修改得东西,C语言基础教程之常量解析

常量是指程序在执行期间不会改变的固定值。这些固定值也称为文字。常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字,还有枚举常量。常量被视为常规变量,除了它们的值在定义后无法修改。整...

C语言中的单精度、双精度、常量等都有什么意思?

刚接触C语言时,对于常量,变量,浮点,单精度,双精度等问题的理解,大都很模糊不清,其实在程序运行过程中,其值不能改变的量称为常量。如12、0、-3为整型常量,4.6、-1.23为实型常量,'a'、'...

取消回复欢迎 发表评论: