Java教程

三、javase中类、对象相关概念

本文主要是介绍三、javase中类、对象相关概念,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java中的类和对象概念的介绍

一、类和对象

1.Java语言的特点
  • 简单
     a.与正常人类思维相一致
     b.来源于生活,但高于生活
  • 跨平台(可移植性)
  • 多线程(技术手段)
  • 完全面向对象
2.类和对象

  •  对名词的一种抽象的概念,是模子

  • 对象
     是一类事物的具体实例

  • 属性
     用于描述数据的名词

  • 方法
     事物所具有的功能

  • 类与对象的关系
     互推关系

  • 类图的格式
    在这里插入图片描述
    例如:
    在这里插入图片描述

  • 定义类的格式
     [访问权限修饰符][修饰符]class 类名{
          //成员属性格式
          [访问权限修饰符][修饰符…]数据类型 属性名[=值];
          //成员方法格式
          [访问权限修饰符][修饰符…][返回值类型]方法名([参数列表…]){
             方法体;
          }
      }

注意:
  1.在类的格式中[]表示可以省略
  2.其中的…表示可以有多个
  3.访问权限修饰符:
    ①类的访问权限修饰符有两种
        public、缺省
    在一个代码编辑区,可以编写多个类(一般不建议使用),但是类名不能重复,且只能有一个类是被public修饰的,其中都是缺省不写的。
    ②类成员中的权限修饰符
    在这里插入图片描述
  4.修饰符(4个)
  ⑴static:静态的,能够修饰类成员和代码块
  注意:
   ①在被static修饰的代码块或者成员方法中调用static修饰的类成员,>则该成员一定要改成static修饰。
    例如:
    public class TestDemo {
    static int age;
     static{
        age = 100;
       }
    }
   ② 被static修饰的类成员可以直接通过类名.的方式调用
   例如:
   public class Test {
     public static int age = 100;
   }
   public class TestDemo {
     public static void main(String[] args) {
       System.out.println(Test.age);
     }
   }
   ③static代码块优先于主函数加载
  ⑵final:最终的,能够修饰类和类成员
   ①特点:
    修饰的类不能被继承
    修饰的成员属性是常量:其中的常量名全部大写且一定要有初始值。
    修饰成员方法:常用的方法是public final Class getClass();该方法是通过反射机制获取当前正在运行的类。使用该方法可以代替new来创建对象,更节省内存空间。
  ⑶abstract:抽象的,能够修饰类和成员方法
    修饰的类不能实例化(即不能new)
    修饰的方法没有方法体
  ⑷synchronized:同步
    能够修饰成员方法和代块

3.类成员详解
  • 成员属性
    ⑴分类:
      成员变量(全局变量):
        可以不赋初始值,成员变量对整个类起作用。
      局部变量:
        定义在方法中的变量,必须赋初始值,局部变量只对定义位置的区域(方法体)起作用。
  • 成员方法
    ⑴分类:
      自定义方法分类:
        类方法:一定被static修饰
        实体方法(普通方法)
        抽象方法:被abstract修饰的方法
      参数列表分类:
        有参方法
        无参方法
      返回值类型分类:
        有返回值类型:Java中任意数据类
        无返回值类型:void
        没有返回值:缺省(构造方法)

总结:
 ①实参和形参:
  实参:方法被调用时传递的参数
  形参:方法被定义时传递的参数,一定要表明参数类型
 ②方法不能被嵌套,在一个完整的方法体中,不能定义另一个方法,但是可以调用另一个方法。

⑵方法的特性:方法的重载(OverLoad)
  ①含义:
    在同一个类中出现一次以上并且名字相同的方法。
  ②含义:
    方法重载三要素:
       方法名一致
       返回值类型无关
       参数列表不同(位置不同或者个数不同或者数据类型不同)

4.面向对象特征之一:封装
  • 什么封装?
     将不想对外公布的代码保护起来。
  • 使用封装的好处:
     ⑴提高代码的安全性
     ⑵防止外部任意调用
     ⑶简化主函数的代码
     ⑷降低类与类之间的耦合度
  • 封装的是类成员
     ⑴成员属性:全部私有化(private)
     ⑵成员方法:封装所有的功能代码
  • 构造器
     ⑴格式:
       public 类名([参数列表…]){}
     ⑵特点:
       ①没有返回值
       ②方法名与类名一致
     ⑶作用:
       ①给成员属性赋值
       ②创建(实例化)对象

注意:
⑴ this关键字:
  ①代表本类对象
  ②只能定义在方法中
⑵声明和实例化(创建)对象的格式:
  ①声明:
   类名 对象名;
  ②创建(实例化):
   类名 对象名 =  类名();
⑶如果一个类没有明确定义构造器,JVM会提供一个默认无参构造器,如果定义了,JVM则不会提供任何的构造器。
⑷this和super关键字的区别:
  super:父类对象,定义在方法体中
  this:本类对象,定义在方法体中
如果this和super同时出现,先写super。

5.面向对象特征之二:继承
  • 含义:
      将一类事物中的所有共性找到,并将这些共性重新封装到一个类中,而其他的类想要使用共性,必须先继承存放共性的类。
  • 优点
      提高代码的重用性。
      简化子类代码
  • 分类
      父类:将所有共性封装的类
      子类:只封装了特性的类
  • 继承格式:
      public class 子类 extends 父类{}
    在这里插入图片描述
  • 一定能继承什么?一定不能继承什么?选择继承什么?
     ⑴一定能继承父类中所有被public/protected所修饰的类成员
     ⑵一定不能继承父类的构造器和所有被private修饰的类成员
     ⑶如果是同包下,缺省修饰的类成员也可以继承

注意:
  在使用继承的时候,子类可以直接调用父类中的所有被public/protected修饰的类成员,然而父类不能调用子类中特有的特性。

  • 方法的重写
    ⑴概念
      子类对父类已有方法进行功能上的增强
    ⑵使用重写的前提:
      ①一定是父子类
      ②一定是对已有方法进行重写
      ③一定是增强功能
    ⑶实现重写的五大要素
      ①方法名一致
      ②返回值一致或其子类
      ③参数列表一致
      ④访问权限不严于父类(子类>=父类)
      ⑤不能抛出更大的异常(当子类重写父类的方法时,可以抛出一样的异常,可以了抛出更小的异常,可以不抛出异常。但是不能抛出更大的异常,以及抛出跟父类同级但不一样的异常)
    ⑷OverLoad(重载)和Override(重写)的比较
    在这里插入图片描述
6.面向对象特征之三:多态
  • 多态的概念
    多态本质上就是指同一种事物表现出来的多种形态。
    饮料:可乐、雪碧、乐虎、果啤、…
    宠物:狗、猫、鸟、小强、…
    整数:int i = 10; short s = 10; byte b = 10; …
    … …
  • 语法格式
    父类类型 引用名 = new 子类类型();
    如:
    Person p = new Student();
    p.show();

解析:
  在编译阶段p是Person类型的,只能调用Person类中的show()方法。
  在运行阶段p指向的是Student类型的对象,因此最终调用Student类中的show()方法。

  • 多态的效果
    (1)当父类的引用指向子类的对象时,父类的引用可以直接调用父类的方法。
    (2)当父类的引用指向子类的对象时,父类的引用不可以直接调用子类的方法。
    (3)当父类的引用指向子类的对象时,编译阶段调用父类的,运行阶段最终调用子类的版本。

注意:上述方式指 非静态的成员方法。
(4)当父类的引用指向子类的对象时,对于静态方法来说,最终调用父类的版本。

  • 多态中引用数据类型之间的转换
    (1)子类类型向父类类型之间的转换自动完成,因此是自动类型转换。
    (2)父类类型向子类类型之间的转换需要进行强制类型转换,格式如下:
    目标类型 目标类型的引用 = (目标类型)源类型的引用;
    (3)引用类型之间的转换必须发生在父子类之间,否则编译报错,执行不到运行阶段。
    (4)只要拥有父子类关系则进行强制类型转换时,编译阶段不会报错,当转换的目标类型并不是该引用真正指向的类型时,则运行阶段产生类型转换异常。

为了避免上述错误的发生,可以使用instanceof运算符进行判断,格式如下:
if(引用变量名 instanceof 引用类型){ 语句块; }
当引用变量名真正指向的对象是后面的引用类型时,则返回true,并执行语句块;
否则返回false

  • instanceof运算符的介绍
    作用
      判断指定对象是否是指定类或其子类对象的运算符,结果是一个boolean

例:
Animal a1 = new Animal(“动物”,18);//父类
Dog d1 = new Dog(“柯基”,17,“花色”);//子类
Animal a2 = new Dog(“柯基”,17,“花色”);//使用引用,父类的引用指向子类的对象
①System.out.println(a1 instanceof Dog);//false
②System.out.println(a1 instanceof Animal);//true
③System.out.println(a2 instanceof Dog);//true
④System.out.println(a2 instanceof Animal);//true
⑤System.out.println(d1 instanceof Dog);//true
⑥System.out.println(d1 instanceof Animal);//true

  • interface/implements/instanceof
    interface:定义接口的关键字
    implements:实现接口的关键字
    instanceof:判断指定对象是否是指定类或其子类的运算符
7.对象在内存中的分析
  • 一个引用对应一个对象的情况
    在这里插入图片描述

点击查看视频祥解

  • 两个引用指向同一个对象的情况
    在这里插入图片描述

点击查看视频祥解

  • 对象作为参数传递的情况
    在这里插入图片描述

点击查看视频祥解

  • 对象作为返回值的情况
    在这里插入图片描述

点击查看视频祥解

8.成员变量和局部变量的区别
  • 在类中的位置不同
    成员变量:类中,方法外
    局部变量:方法中或者方法声明上(形式参数)
  • 作用范围不一样
    成员变量:类中
    局部变量:方法中
  • 初始化值的不同
    成员变量:有默认值
    局部变量:没有默认值。必须先定义,赋值,最后使用
  • 在内存中的位置不同
    成员变量:堆内存
    局部变量:栈内存
  • 生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
这篇关于三、javase中类、对象相关概念的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!