java(三)基础概念

本文详细介绍了Java的基础概念,包括多态、继承、封装、抽象和类。多态性体现在方法重载和成员覆盖,提供了程序的可扩展性和可维护性。继承是为了代码复用,通过子类继承父类,实现功能扩展。封装是隐藏对象的属性和实现细节,只对外公开接口。抽象类用于描述不能实例化的概念,可以包含抽象方法。类是创建对象的模板,可以包含成员变量、构造方法和方法。了解这些基本概念是学习Java面向对象编程的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • java(三)基础概念
    • 三、Java基本概念
      • 3.1多态
      • 3.2继承
        • 类成员访问控制符与访问能力之间的关系
        • 继承和权限
      • 3.3封装
      • 3.4抽象
      • 3.5 类
        • Java中的类
        • 构造方法
        • 创建对象
        • 访问实例变量和方法
        • 源文件声明规则
        • Java包
        • Import语句
      • 3.6对象
      • 3.7方法
      • 重载

java(三)基础概念

三、Java基本概念

Java作为一种面向对象语言。支持以下基本概念:

3.1多态

  1. 概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

  2. Java实现多态有三个必要条件:继承、重写、向上转型。

继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

3.多态的实现方式

(1)基于继承实现的多态

基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

(2)基于接口实现的多态

继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。
在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。
继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

4.多态性主要表现在如下两个方面:

(1)方法重载.通常指在同一个类中,相同的方法名对应着不同的方法实现,但是方法的参数不同.

(2)成员覆盖.通常指在不同类(父类和子类)中,允许有相同的变量名,但是数据类型不同;也允许有相同的方法名,但是对应的方法实现不同.

5.多态的好处:程序的可扩展性及可维护性增强。

3.2继承

1.目的:实现代码的复用。

2.介绍:当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。有时候我们需要这样的需求:我们需要将某些事物尽可能地对这个世界隐藏,但是仍然允许子类的成员来访问它们。这个时候就需要使用到protected。

类成员访问控制符与访问能力之间的关系
类型Private无修饰符(fiendly)ProtectedPublic
同一类可访问可访问可访问可访问
同一包中的子类不可访问可访问可访问可访问
同一保重的非子类不可访问可访问可访问可访问
不同包中的子类不可访问不可访问可访问可访问
不同包中的非子类不可访问不可访问不可访问可访问
继承和权限
…………Public无修饰PrivateProtectfinalabstractstatic
类继承可继承在同一包中的可以继承不能修饰类不能修饰类不能派生子类一班可继承不能修饰类
方法重载可重载可重载不可重载不可重载不可重载可重载可重载(当修饰主函数时不可重载)
成员变量父类属性被隐藏(super可以获取父类的属性)父类属性被隐藏(super可以获取父类的属性)子类不可以直接访问父类的私有变量父类属性被隐藏(super可以获取父类的属性)必须赋初值不可以修饰成员变量每个实例共享这个类变量

3.3封装

1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。

2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

3.封装的基本要求是:把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数。在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的。

3.4抽象

1.概念:所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。

  比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。

2.抽象方法:被abstract修饰的方法是抽象方法,抽象方法没有方法体。修饰符 abstract 返回值类型 函数名(); 
抽象方法的修饰符:

  • 只能用public或者protected或者没有修饰,
  • 不能被final,static,private修饰。

(1)、类即使不包含抽象方法,也可以定义成抽象类。 
(2)、类中含有抽象方法的类一定要定义成抽象类。 
(3)、抽象类中字段的定义和子类的访问与一般类没有变化。 
(4)、扩展抽象类有两种方法,第一种是在子类中定义部分抽象方法或者抽象方法不定义,这样子类也必须定义成抽象类,第二种是定义全部的抽象方法,这样子类就可以不定义成抽象的了。 
(5)、抽象类不能被实例化,但是可以定义一个抽象类的对象变量,这个变量可以引用非抽象子类的对象。 
(6)、抽象类中包含有构造方法,也可以显式书写构造方法,构造方法在实例化子类的对象中调用。

接口与抽象类的区别: 
不同点: 
1、接口可以多实现,而抽象类只能单继承 
2、抽象类可以有非抽象的方法和构造方法、变量,但是接口只能有抽象方法,静态常量。 
3、抽象类和子类具有父子关系,子类能拥有父类中一些属性。接口虽然某个类实现一个接口,但是由于接口中的变量都为静态常量,不存在继承关系。

相同点: 
1、无论接口还是抽象类,都无法直接实例化,其自身实例化需要靠实现类或子类来实现。 
2、接口和抽象类都必须实现其中的所有方法。

抽象类(abstract class)的定义方式如下:

public abstract class AbstractClass //里面至少有一个抽象方法
{
  public int t; //普通数据成员
   public abstract void method1(); //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
  public abstract void method2();
  public void method3(); //非抽象方法
  public int method4();
  publi int method4 (){
 //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
  }
public void method3(){
 //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
  }
}

接口(interface)的定义方式如下:

public interface Interface
{
  static final int i; //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final
  
   public void method1(); //接口中的方法一定是抽象方法,所以不用abstract修饰
  
  public void method2(); //接口中不能赋予方法的默认行为,即不能有方法的具体实现
}

1、一个接口可以被多个类实现,一个类也可以实现多个接口。 
2、接口中所有的定义的字段默认都是public static final 的属性,写和不写没有区别。 
3、接口中的方法都是抽象的方法,并且抽象的方法默认都是public abstract修饰的,不能用其他的修饰符修饰,可以不写。 
4、接口中没有构造方法 
5、接口不是类,尤其不能使用new运算符实例化一个接口。但是可以声明接口的变量,这个变量可以指向实现了此接口的子类。

简言之抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。

  从某种意义上说,接口是一种特殊形式的抽象类,在java语言中抽象类表示的是一种继承关系,一个类只能继承继承一个抽象类,而一个类却可以实现多个接口。在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

3.5 类

Java中的类

类可以看成是创建Java对象的模板。 
1.类的定义:

public class Dog{
String breed;
int age;
String color;
void barking(){
}
void hungry(){
}
void sleeping(){
}
}

一个类可以包含以下类型变量:

  1. 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  2. 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  3. 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。 
    一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。
构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。 
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。 
下面是一个构造方法示例:

public class Puppy{
public Puppy(){
}
public Puppy(String name){
// 这个构造器仅有一个参数:name
}
}
创建对象

对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步: 
声明:声明一个对象,包括对象名称和对象类型。 
实例化:使用关键字new来创建一个对象。 
初始化:使用new创建对象时,会调用构造方法初始化对象。

public class Puppy{
public Puppy(String name){
//这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String []args){
// 下面的语句将创建一个Puppy对象
Puppy myPuppy = new Puppy( "tommy" );
}
}
访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

/* 实例化对象 */
ObjectReference = new Constructor();
/* 访问类中的变量 */
ObjectReference.variableName;
/* 访问类中的方法 */
ObjectReference.MethodName();
源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  1. 一个源文件中只能有一个public类
  2. 一个源文件可以有多个非public类
  3. 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
  4. 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
  5. 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
  6. import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
  7. 类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
  8. 除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。
Java包

包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。

Import语句

在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。 
例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类

import java.io.*;

3.6对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。 
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。 
对比现实对象和软件对象,它们之间十分相似。 
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。 
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

3.7方法

1.概念:

  • 方法是解决一类的问题的步骤的有序组合
  • 方法包含与类或对象中,在程序中被创建,在其他地方被调用;

2.优点:程序简短二清晰,有利于程序的维护;提高开发效率和代码的重用性。

3.命名规则:

  1. 第一个单词的应该一小写字母开头,后面的单词则用大写字母开头,不用连接符。

4.方法的定义

修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值类型;
}
  • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

  • 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。

  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。

  • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。

  • 方法体:方法体包含具体的语句,定义该方法的功能。

重载

重载(Overloading)

  1. 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。

  2. 重载Overloading是一个类中多态性的一种表现。

  3. Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

  4. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

    1. 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。

父类的方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。

重写方法的规则:

1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

2)、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

3)、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

4)、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:

父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

而重载的规则:

1)、必须具有不同的参数列表;

2)、可以有不同的返回类型,只要参数列表不同就可以了;

3)、可以有不同的访问修饰符;

4)、可以抛出不同的异常;

重载和重写(覆盖)的特点:

  1. 重写特点

      1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

      2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

      3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

      4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

2.重载特点

  1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));

  2、不能通过访问权限、返回类型、抛出的异常进行重载;

  3、方法的异常类型和数目不会对重载造成影响;

  4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

总结: 
重写

   1、方法名、参数、返回值相同。

   2、子类方法不能缩小父类方法的访问权限。

   3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

   4、存在于父类和子类之间。

   5、方法被定义为final不能被重写。

 重载

  1、参数类型、个数、顺序至少有一个不相同。

  2、不能重载只有返回值不同的方法名。

  3、存在于父类和子类、同类中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值