第三章Java程序面向对象初阶篇

目录

一.对象

二.类的基本语法

(一)构造器

(二)this关键字

(三)封装

(四)实体类(Javabean)

(五)static关键字

1.static修饰方法

2.静态方法的常见应用场景

3.static的注意事项

三.对象特征——继承

(一)权限修饰符

(二)继承的特点

(三)方法重写

(四)子类构造器

(五)this(…)调用兄弟构造器

四.对象特征——多态

(一)多态

(二)多态的好处

(三)多态下的类型转换


一.对象

对象的概念:对象是一种特殊的数据结构,可以用来记住一个事物的数据,从而代表该事物。

对象的三大特征:封装、继承、多态

对象创建的步骤:

  • 1.先设计对象的模板,也就是对象的设计图:类。
  • 2.通过new关键字,每new一次类就得到一个新的对象。
  • 访问对象的方法格式:对象名.成员变量

    注意:

    在C++中的定义类的时候需要在类末尾加入一个分号,而Java不需要加分号。
  • 例:
  • 对象的计算机底层原理:

    Java程序都在JVM(Java的虚拟机)运行。JVM虚拟机就是在内存中执行。

    虚拟机又将内存划分为三大板块:栈内存、堆内存、方法区。目的是为了配合执行Java程序。

    方法区的目的是: class文件是放入方法区中的

    栈内存的目的是:方法的执行是放入栈内存中的

    堆内存的目的是:new开辟的空间是放入堆内存中的

二.类的基本语法

类的基本语法分为:构造器、this、封装、javabean、static

(一)构造器

构造器分为:有参构造器、无参构造器

无参构造器格式:访问控制符 类名()

{

…………

}

有参构造器格式:访问控制符 类名(类型1 变量名,……)

{

…………

}

注:

  • Java的构造器C++中叫做构造函数。
  • 类默认就自带了一个无参构造器。
  • 如果为类定义了有参数构造器,类默认的无参数构造器就没有了,此时如果还想用无参数构造器,就必须自己手写一个无参数构造器出来。()

总结:

构造器的特点:创建对象时,对象会去调用构造器。

构造器的作用及其应用场景:创建对象时,同时完成对对象成员变量(属性)的初始化赋值。

(二)this关键字

this关键字的基本认识:this就是一个变量,它的作用是可以用在方法中,来拿到当前对象

this关键字的应用场景:this主要用来解决:变量名称冲突问题的

this关键字的用法格式:this.成员变量名

注:

  • 在C++中this的用法格式:this->成员变量名,与Java不同功能却相同。
  • Java和C++共同的是this只能在类的内部使用。

(三)封装

封装的概念:类就是一种封装,封装就是将各个属性和行为集合在一个容器中就叫做封装。

封装设计遵循:合理暴露、合理隐藏。

注:

公开成员,可以使用public(公开)进行修饰。

隐藏成员,使用private(私有,隐藏)进行修饰。

如果成员变量的设为private,那么只能在类内进行修改调用操作。

因此如果成员变量已经设置了隐藏属性,那么我们通过设立两个方法用作处理和外部暴露。分别以set、get作为开头与成员变量名组成的成员函数,外界通过成员函数实现对应操作。

(四)实体类(Javabean)

Javabean是一种特殊类的形式,主要是类需要满足如下要求的称作“实体类”。

由于Java程序是面向对象的过程,因此在处理对象的时候Java程序会遵循分层思想,将一个类作为实体类,再定义一个专门负责处理和加工的类。通过这样形成一套流程体系使得程序变得更加流畅流通性更强,阅读起来也方便。

实体类的特点:仅仅只是一个用来保存数据的java类,可以用它创建对象,保存某个事物的数据。

实体类的应用场景:实体类对应的是软件开发里现在比较流行的开发方式,数据和数据的业务处理相分离。

(五)static关键字

static关键字叫做静态,可以修饰变量、成员方法。

类中的成员变量按照有无static修饰,分为两种:

  • 静态变量(类变量)
  • 实例变量(对象的变量)

静态变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享。(与C语言中的共用体有相似地方)

实例变量:无static修饰,属于每个对象的

实例变量访问方式:对象.实例变量

如图所示

static修饰的name,此对象变量被所有对象共享,但是不会放在每个对象中,而age是各自都有。从以下例子可以看出

例1:class Student

{

public: static String name;

}

 public static void main(String[] args) {

Student s1=new Student();

Student s2=new Student();

s1.name="小明";

s2.name="小华";

System.out.println(s1.name);

System.out.println(s2.name);

}

输出的结果为:小华

              小华

静态变量的访问格式:类名.静态变量或对象.静态变量。

成员执行的原理图如下:

静态变量的应用场景:如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成静态变量来记住。

例如:

注:如果是类内部访问自己类中的静态变量,可以省略类名不写。

1.static修饰方法

成员方法分为:静态方法、实例方法

静态方法定义格式:访问控制符 static 方法名()

实例方法定义格式:访问控制符  方法名()

静态方法与实例方法的区别:

静态方法:有static修饰的成员方法,属于类。

静态方法访问:类名.静态方法名 或者 对象.静态方法名

实例方法:无static修饰的成员方法,属于对象。

实例方法访问:对象.实例方法名

总结:

  • 如果这个方法只是为了做功能不需要访问对象的数据,就定义成静态方法。
  • 如果这个方法是为了访问对象的数据,那就定义成实例方法。
  • 静态方法不能访问对象的数据
     2.静态方法的常见应用场景

静态方法的常见应用场景:做工具类。

工具类中的方法都是一些静态方法,每个方法用来完成一个功能,以便供给开发人员直接使用。

工具类的好处:提高代码复用;调用方便,提高开发效率。

工具类只用静态方法额,而不用实例方法原因是:实例方法需要创建对象来调用,会浪费内存。

注:工具类不需要创建对象,建议将工具栏的构造器私有化。目的为了使工具不能创建对象的作用。

3.static的注意事项

static注意事项总结如下:

  • 静态方法中可以直接访问静态成员(用static关键字修饰的变量),不可以直接访问实例成员。
  • 实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
  • 实例方法中可以出现this关键字,静态方法中不可以出现this关键字的。

    三.对象特征——继承

    继承的概念:Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。

    继承的好处:提高代码的复用性,减少一些重复代码的书写。

    继承的格式:访问控制符 class 类名1 extend 类名2

注意:

继承中子类只能继承父类的非私有成员(成员变量、成员方法)。

继承后的对象创建,子类的对象是由子类、父类共同完成的。

(一)权限修饰符

权限修饰符的概念:权限修饰符就是是用来限制类中的成员(成员变量、成员方法、构造器)能够被访问的范围。

权限修饰符分为:private、缺省、protected、public

不同权限修饰符的访问权限的范围如下:

  • private:只能本类
  • 缺省:本类、同一个包中的类
  • protected:本类、同一个包中的类、子孙类中
  • public:任意位置

从小到大分别:private、缺省、protected、public

注:

在Java程序中访问权限实际用法主要是public、private,其中public主要用于方法,而private主要用于成员。

因为Java程序的习惯是:成员属性内部处理。

(二)继承的特点

继承的特点主要是:单继承、多层继承、祖宗类、就近原则

单继承:Java是单继承模式;一个类只能继承一个直接父

多层继承:Java不支持多继承(C++支持多继承也可以单继承),但支持多层继承

注:

多层继承的含义,就是子类B继承父类A,子类C继承子类B,这样的一个循环继承叫做“多层继承”。

Java中不能有多层继承的原因如下:

此例题中继承如果假设成立:那么程序代码出现二义性,因此Java不能使用多层继承。

祖宗类:Java中所有的类都是object内子类。

注:

Java中所有类,要么直接继承了object,要么默认继承了object,要么间接继承(不指明叫做间接继承)了object。

因此在Java中,object是所有类的祖宗。

就近原则:优先访问自己类中,自己类中的没有才会访问父类,如果父类范围没有找到则报错

注:

如果子类与父类出现重名的成员,则优先使用子类的,如果想子类直接访问父类的重名成员,则需要通过“super关键字”。

(如果C++的话直接使用作用域解析运算符“::”

其中使用格式为:“::变量名(函数名)”)

其中格式为:super.父类成员变量/父类成员方法

(三)方法重写

方法重写的概念:当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是“方法重写”。

注意:

  • 在Java中方法重写要加一个重写校验注解(标志)“@Override”,它的校验要求方法名称和形参列表必须与重写方法一致,否则会报错。
  • @Override的好处:使程序更安全、可读性好。
  • 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public>protected>缺省)
  • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
  • 私有方法、静态方法不能被重写,如果重写会报错的。

方法重写的规范总结:声明不变、,重新实现

声明不变的意思是:在进行重写的时候,声明跟父类一样。

重新实现的意思是:声明的方法(函数)是一样,但是功能要重新写一遍。

(四)子类构造器

子类构造器的特点:子类的全部构造器,都会必须先调用父类的构造器,再执行自己。

注:默认情况下,子类全部构造器的第一行代码都是 super()(写不写都有),它会调用父类的无参数构造器。

如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(参数1,参数2,....),指定去调用父类的有参数构造器。

子类构造器调用父类构造器应用场景:

可以把子类继承自父类这部分的数据也完成初始化赋值。

例:如图是程序执行流程:

(五)this(…)调用兄弟构造器

this(…)的作用:在构造器中调用本类的其他构造器。

使用注意事项:

this(…)和super(…)不能同时出现,但是如果使用二者必须放在第一行。

如果this(…)和super(…)同时出现,那么会调用二次父类的构造器,因此不行。

四.对象特征——多态

(一)多态

多态的概念: 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。

对象多态:它指的是一个对象的具备不同的多种状态的特征,例如一个人对象,它的可能是一个司机、一个老师、一个学生,这种就叫做对象多态。

行为多态:形如它指的是一个行为在不同对象表现的状态不同,因此叫做行为多态。

多态的前提:有继承/实现关系;存在父类引用子类对象;存在方法重写。

多态程序代码的例子如下:

多态的注意事项; 多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。

(二)多态的好处

多态的好处:

1.在多态形式下,右边对象是解耦合的,更便于扩展和维护。

注:

解耦合:指的事物与事物之间存在可以解除或代替的关系。它在软件设计中是一个非常重要的概念。

2.定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强、更便利。

多态的存在的问题:多态下不能使用子类的独有功能。

(三)多态下的类型转换

多态的类型转换是为了解决多态存在的问题

类型转换分为:自动类型转换、强制类型转换

多态下的类型转换格式

自动类型转换格式:父类 变量名=new 子类();

强制类型转换格式:子类 变量名=(子类)父类变量名

强制类型转换注意事项:

  • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
  • 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。

如图解释注意事项:因为p=new Teach();所以在第二条Student=(Student)p就会报错,原因是p是大范围指向Teacher是正确的,因此在编译阶段不会报错,而当你执行程序代码运行阶段的时候编译器反应过来知道,一个老师怎么能指向转换成学生呢?因此报错出现类型转换异常(ClassCastException

因此在Java中强制转换前,Java给了一个建议:

使用instanceof关键字,它的功能是判断当前对象的真实类型,再进行强转。

其使用格式:对象名 instanceof 类名,若对象与instanceof后的类名相同则返回true,否则返回false

instanceof实际应用于方法中如图所示:


猜你喜欢

转载自blog.csdn.net/2403_88453964/article/details/146394323
今日推荐