• java面向对象总结(一)


    1. 对象的概念及面向对象的三个基本特征

    面向对象的三大核心特性

    面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。面向对象程序设计有以下优点。

    1. 可重用性:它是面向对象软件开发的核心思路,提高了开发效率。面向对象程序设计的抽象、继承、封装和多态四大特点都围绕这个核心。
    2. 可扩展性:它使面向对象设计脱离了基于模块的设计,便于软件的修改。
    3. 可管理性:能够将功能与数据结合,方便管理。


    该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有继承、封装和多态 3 个核心特性。

    继承性

    如同生活中的子女继承父母拥有的所有财产,程序中的继承性是指子类拥有父类数据结构的方法和机制,这是类之间的一种关系;继承只能是单继承。
    例如定义一个语文老师类和数学老师类,如果不采用继承方式,那么两个类中需要定义的属性和方法.

    语文老师类和数学老师类中的许多属性和方法相同,这些相同的属性和方法可以提取出来放在一个父类中,这个父类用于被语文老师类和数学老师类继承。当然父类还可以继承别的类,

    学校主要人员是一个大的类别,老师和学生是学校主要人员的两个子类,而老师又可以分为语文老师和数学老师两个子类,学生也可以分为班长和组长两个子类。
    使用这种层次形的分类方式,是为了将多个类的通用属性和方法提取出来,放在它们的父类中,然后只需要在子类中各自定义自己独有的属性和方法,并以继承的形式在父类中获取它们的通用属性和方法即可。

    封装性

    封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。封装的目的在于保护信息,使用它的主要优点如下。

    • 保护类中的信息,它可以阻止在外部定义的代码随意访问内部代码和数据。
    • 隐藏细节信息,一些不需要程序员修改和使用的信息,比如取款机中的键盘,用户只需要知道按哪个键实现什么操作就可以,至于它内部是如何运行的,用户不需要知道。
    • 有助于建立各个系统之间的松耦合关系,提高系统的独立性。当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。例如 U 盘,不管里面的存储方式怎么改变,只要 U 盘上的 USB 接口不变,就不会影响用户的正常操作。
    • 提高软件的复用率,降低成本。每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个 U 盘可以在多台电脑上使用。

    Java 语言的基本封装单位是类。由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制。Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问,这就可以确保不会发生不希望的事情。

    多态性

    面向对象的多态性,即“一个接口,多个方法”。多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。多态性允许一个接口被多个同类使用,弥补了单继承的不足。

    2. Java认识类和对象

    类的定义
    [访问权限修饰符] class 类名 {
    属性/ 成员变量/ 字段
    行为/ 成员方法
    }

    类的理解:
    1.类是用来描述现实事物的,是Java语言的最基本单位
    2.类是抽象的,是由多个对象抽象想象的部分而来
    3.类可以理解为一个模板,数属性和行为的集合,可以通过类的模板创建具体的对象
    4.Java使用class来描述一个类
    5.类的本质用来组织代码(方法归类),封装数据的(理解提高成员变量的安全性)。

    对象的理解:
    1.对象是客观存在的,万事万物皆是对象
    2.对象是在类的基础上创建的
    3.对象又称为 实例/引用/变量/对象

    如何创建一个对象?
    格式: 类名 对象名 = new 类名();

    如何访问一个对象?
    访问成员
    对象.成员变量
    对象.成员方法
    定义一个类的步骤
    1、定义类名
    2、编写类的属性
    3、编写类的方法
    4、创建对象
    5、通过对象访问成员

    匿名对象

    概念: 没有名字的对象,本质还是一个对象

    匿名对象的特点:
    1.既然是对象,同样可以访问成员
    2.匿名对象只能够使用一次,如果需要使用多次,必须使用变量接收
    3.匿名对象一旦使用一次完毕,立刻成为垃圾对象,等待垃圾回收期在空闲的时候回收,节约内存资源
    4.匿名对象在Java里一般用于访问一次的情况,简化代码,在Android里节约内存资源

     1 public class OOPDemo04 {
     2     @SuppressWarnings("resource")
     3     public static void main(String[] args) {
     4         Student s1 = new Student(); 
     5         
     6 //        new Student();
     7 //        
     8 //        System.out.println(new Student().name);
     9 //        
    10 //        new Student().print99MulTable();
    11         
    12         new Student().name = "隔壁老王";
    13         System.out.println(new Student().name); // null
    14         
    15         String line = new Scanner(System.in).next();
    16         System.out.println(line);
    17         
    18         new Test().method(new Student());
    19     }
    20 }
    21 
    22 class Test {
    23     public void method(Student s) {
    24         System.out.println(s.name);
    25     }
    26 }
    27 
    28 结果  null

    3. Java类的定义及定义类时可用的关键字

    在 Java 中定义一个类,需要使用 class 关键字、一个自定义的类名和一对表示程序体的大括号。完整语法如下:

     1 [public][abstract|final]class<class_name>[extends<class_name>]
     2 [implements<interface_name>]
     3 {
     4     //定义属性部分
     5     <property_type><property1>;
     6     <property_type><property2>;
     7     <property_type><property3>;
     8  9     //定义方法部分
    10     function1();
    11     function2();
    12     function3();
    13 14 }

    上述语法中各关键字的描述如下。

    • public:表示“共有”的意思。如果使用 public 修饰,则可以被其他类和程序访问。每个 Java 程序的主类都必须是 public 类,作为公共工具供其他类和程序使用的类应定义为 public 类。
    • abstract:如果类被 abstract 修饰,则该类为抽象类,抽象类不能被实例化,但抽象类中可以有抽象方法(使用 abstract 修饰的方法)和具体方法(没有使用 abstract 修饰的方法)。继承该抽象类的所有子类都必须实现该抽象 类中的所有抽象方法(除非子类也是 抽象类)。
    • final:如果类被 final 修饰,则不允许被继承。
    • class:声明类的关键字。
    • class_name:类的名称。
    • extends:表示继承其他类。
    • implements:表示实现某些接口。
    • property_type:表示成员变量的类型。
    • property:表示成员变量名称。
    • function():表示成员方法名称。

    4. 形参和实参及成员变量和局部变量

    1、形参和实参

    关于方法的参数,经常会提到形参与实参,形参是定义方法时参数列表中出现的参数,实参是调用方法时为方法传递的参数。

     1 public int returnMin(int m,int n)
     2 {
     3     return Math.min(m,n);    //m和n是形参
     4 }
     5 public static void main(String[] args)
     6 {
     7     int x=50;
     8     int y=100;
     9     Test t=new Test();
    10     int i=t.returnMin(x,y);    //x和y是实参
    11     System.out.println(i);
    12 }

    2、方法的形参和实参具有以下特点:

    • 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在方法内部有效,方法调用结束返回主调 方法后则不能再使用该形参变量。
    • 实参可以是常量、变量、表达式、方法等,无论实参是何种类型的量,在进行方法调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。
    • 实参和形参在数量、类型和顺序上应严格一致,否则会发生“类型不匹配” 的错误。
    • 方法调用中发生的数据传送是单向的,即只能把实参的值传送绐形参,而不能把形参的值反向地传送给实参。因此在方法调用过程中,形参的值发生改变,而实参中的值不会变化。

    3、在调用成员方法时应注意以下 4 点:

    1. 对无参成员方法来说,是没有实际参数列表的(即没有 paramList),但方法名后的括号不能省略。
    2. 对带参数的成员方法来说,实参的个数、顺序以及它们的数据类型必须与形式参数的个数、顺序以及它们的数据类型保持一致,各个实参间用逗号分隔。实参名与形参名可以相同,也可以不同。
    3. 实参也可以是表达式,此时一定要注意使表达式的数据类型与形参的数据类型相同,或者使表达式的类型按 Java 类型转换规则达到形参指明的数据类型。
    4. 实参变量对形参变量的数据传递是“值传递”,即只能由实参传递给形参,而不能由形参传递给实参。程序中执行到调用成员方法时,Java 把实参值复制到一个临时的存储区(栈)中,形参的任何修改都在栈中进行,当退出该成员方法时,Java 自动清除栈中的内容。

    4、方法体中的局部变量

    在方法体内可以定义本方法所使用的变量,这种变量是局部变量。它的生存期与作用域是在本方法内,也就是说,局部变量只能在本方法内有效或可见,离开本方法则这些变量将被自动释放。
    在方法体内定义变量时,变量前不能加修饰符。局部变量在使用前必须明确赋值,否则编译时会出错。另外,在一个方法内部,可以在复合语句中定义变量,这些变量只在复合语句中有效。

    5、成员变量和局部变量的区别 

    1.定义的位置不同
     成员变量: 类体以内,方法体以外
     局部变量: 方法的声明上,或者方法体内

    2.在内存的位置不一样
     成员变量: 在堆区分配内存
    局部变量: 在栈区分配内存

     3.初始化值不一样
     成员变量: 系统赋予初始值
     byte short int long 0
     float double 0.0
     boolean false
     char u0000
    引用类型 null
    局部变量: 方法的声明上,或者方法体内
    没有默认值,必须先声明再赋值再使用

     4.变量的生命周期不一样
     生命周期: 变量从开始创建到销毁的全过程
    成员变量: 随着对象的创建而创建,随着垃圾回收器回收对象的时候销毁
    局部变量: 随着方法的调用而创建,随着方法调用结束而销毁

     5.当成员变量和局部变量重名的时候,局部变量优先,就近原则
    如果希望访问成员变量,需要使用this关键字

    5.Java方法:Java方法的声明和调用

    构造方法

    为什么需要学习构造方法?
    1.假设一个类中有100个属性,一个一个set很麻烦

    构造方法: 构造方法本身就是一个特殊的方法而已
    1.能够快速初始化成员变量的值
    2.能够为对象分配内存空间 + new

    构造方法的格式:

    1 [访问权限修饰符] 方法名(参数列表) {
    2 方法体;
    3 // return 值;
    4 return;
    5 }

    构造方法的特点:
    1.构造方法没有返回值,连void都没有
    2.构造方法也是方法,存在方法重载
    3.构造方法是用来给成员快速初始化的
    4.构造方法方法名必须和类名保持一致

    构造方法的注意事项:
    1.如果我们没有书写构造方法,系统会帮我们书写一个无参构造方法
    2.如果你一旦书写了一个带参构造方法,就会覆盖系统的无参构造方法
    3.养成一个好习惯: 每次书写一个bean的时候,都写上无参构造方法
    好处:
    1.无参构造方法能够初始化默认成员的值
    2.反射中调用的就是无参构造方法,很多框架中都会利用反射技术创建对象,反射大部分都是依赖无参构造方法

    类的组成
    class 类 {
    成员变量
    构造方法
    构造方法重载
    成员方法
    普通方法
    读写方法 (get/set方法)
    }

     1 public class ConstructorDemo01 {
     2     public static void main(String[] args) {
     3         Student s = new Student();
     4         s.setName("张三");
     5         s.setAge(18);
     6         s.show();
     7         
     8         Student s2 = new Student("李四", 20, "男");
     9         s2.show();
    10         
    11     }
    12 }
    13 
    14 class Student {
    15     private String name;
    16     private int age;
    17     private String gender;
    18     
    19     public Student() {
    20     }
    21     
    22     public Student(String name, int age) {
    23         this.name = name;
    24         this.age = age;
    25     }
    26     
    27     public Student(String name, int age, String gender) {
    28         this.name = name;
    29         this.age = age;
    30         this.gender = gender;
    31     }
    32     
    33     public String getName() {
    34         return name;
    35     }
    36     public void setName(String name) {
    37         this.name = name;
    38     }
    39     public int getAge() {
    40         return age;
    41     }
    42     public void setAge(int age) {
    43         this.age = age;
    44     }
    45 
    46     public String getGender() {
    47         return gender;
    48     }
    49 
    50     public void setGender(String gender) {
    51         this.gender = gender;
    52     }
    53 
    54     public void show() {
    55         System.out.println("Student [name=" + name + ", age=" + age + ", gender=" + gender + "]");
    56     }
    57     
    58     
    59     
    60 }

      Student [name=张三, age=18, gender=null]
      Student [name=李四, age=20, gender=男]

    有部分文字参考了c语言中文网,给出原文地址http://c.biancheng.net/view/952.html

  • 相关阅读:
    Spark2.4.5集群安装与本地开发
    Windows玩转Kubernetes系列4-搭建K8S Dashboard
    Windows玩转Kubernetes系列3-Centos安装K8S
    Windows玩转Kubernetes系列2-Centos安装Docker
    Windows玩转Kubernetes系列1-VirtualBox安装Centos
    Lock wait timeout exceeded?代码该优化了
    RocketMQ初入门踩坑记
    Java8虚拟机(JVM)内存溢出实战
    CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装
    消息中间件—SpringBoot下RabbitMQ实战
  • 原文地址:https://www.cnblogs.com/lqhhome/p/10731880.html
Copyright © 2020-2023  润新知