初学Java---面向对象编程基础(对象与类)

简介: 面向对象思想是人类最自然的思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及行为,以解决这些对象面临的一些实际问题,面向对象设计实质上就是对现实世界的对象进行建模操作。

1.面向对象的概述

面向对象思想是人类最自然的思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及行为,以解决这些对象面临的一些实际问题,面向对象设计实质上就是对现实世界的对象进行建模操作。


1.1 对象

 对象是一个抽象概念,英文称作“Object”,表示任意存在的事物。世间万物皆为对象,对象是事物存在的实体,例如一个人。


 通常将对象划分为两个部分,即静态部分与动态部分。静态部分被称为 “属性” ,任何对象都具备自身属性,这些属性不仅是客观存在的,而且是不能被忽视的,例如人的性别。动态部分是指的是对象的行为,即对象执行的动作,例如人可以走和跑。


1.2 类

 类是封装对象属性和行为的载体,反过来说具有相同属性和行为的一类实体被称作为类,例如定义一个燕子类,它具备翅膀,喙,爪子等属性,飞行,睡觉,觅食等行为,以只从南方飞回北方的燕子则被视为燕子类的一个对象,具体关系如下图所示:

微信图片_20221028185122.jpg


在Java语言中,类包括对象的属性和方法。类中对象的属性是以成员变量的形式定义的,对象的行为是以方法的形式定义的。


1.3 面向对象程序设计的特点

面向对象程序设计具有以下特点:封装性     继承性     多态性


1.3.1 封装

 封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类会对用户隐藏现实细节,这就是封装的思想,例如:你去饭店吃饭,你只用吃,你无须知道饭是厨师怎样做出来的。


 采用封装的思想保证内部数据结构的完整性,使用该类的用户不能直接操作此数据结构,只能操作类允许公开的数据。这样避免外部操作对内部数据产生影响,提高程序的可维护性。


1.3.2 继承

 矩形,菱形,平行四边形都是四边形。因为四边形与它们具有共同的特征:有四条边。将四边形合理延伸,就会得到上述图形。以平行四边形为例,如果把平行四边形看作四边形的延伸,那么平行四边形就复用了四边形的属性和行为,同时添加了平行四边形特有的属性和行为,例如平行四边形对边平行且相等。Java中,可以将平行四边形类看作是继承四边形类后产生的类,其中平行四边形类称为子类,四边形类称为父类或超类。


注意:Java中,子类的实例都是父类的实例,但不能说父类的实例都是子类的实例。


 综上,继承是实现和重复利用的重要手段,子类通过继承,复用父类的属性和行为的同时又添加子类特有的属性和行为。


1.3.3 多态

将父类对象应用于子类的特征就是多态。父类衍生出不同的子类,子类继承父类特征的同时,也具备自己的特征,并且能够实现不同的效果,这就是多态化的结构。


2.类与对象

类是封装对象的属性和行为的载体,Java中定义类时使用class关键字,语法格式如下:

class 类名称{
   //类的成员变量
   //类的成员方法
}


对象的属性以成员变量的形式存在,对象的行为以成员方法的形式存在。


2.1 成员变量

Java中,对象的属性也称为成员变量,成员变量与普通变量定义一样,格式:


数据类型 变量名称;

定义变量时可以赋值也可以不赋值。


我们可以先定义一个Student类,成员变量对应类对象的属性。

public class Student{
    String name;       //姓名
    String gender;     //性别
    int age;           //年龄
}


成员变量就是普通的变量,可以赋值也可以不赋值,如果不设置初始值,系统会有默认值,


Java中常见类型的默认值:

数据类型 默认值 说明
byte   short   int   long 0 整型0
float     double 0.0 浮点0
char ' ' 空格字符
boolean false 逻辑假
引用类型 null 空值


引用类型 null 空值

2.2  成员方法

成员方法对应类对象的行为,主要用来定义可执行的操作。


成员方法的定义,语法格式:

访问修饰符 返回值类型 方法名(参数列表){
          //方法体
          return 返回值;
}


访问修饰符可以是public  private   protected 任意一个也可以不写,主要用来控制方法的访问权限


访问修饰符:


public
protected default(省缺) private
本类 可见 可见 可见 可见
本类所在包 可见 可见 可见 不可见
其他包中的子类 可见 可见 不可见 不可见
其他包中的非子类 可见 不可见 不可见 不可见


说明: 方法的定义必须在某个类中,定义方法时如果没有指定权限修饰符,方法的默认访问权限为省缺。


例:

public void SetStudent(int age,String name){
        System.out.println(age+name);
    }


因为是void类型所以无返回值,如果有返回值,返回值类型必须与方法的返回值类型一致。


2.3 构造方法

在类中存在一种特殊类型的方法,就是构造方法,构造方法与类同名,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。


构造方法的特点:


· 构造方法没有返回值类型,也不能定义为void


· 构造方法名称要与本类的名称相同


· 构造方法的主要作用是完成对象的初始化工作,它能把定义对象的参数传给对象成员


构造方法的定义语法:

public class Student {
    //构造方法
   public Student(){
   }
}


public 为构造方法的修饰符


如果类中没有明确定义构造方法,则编译器会自动创建一个不带参数的默认构造方法


构造方法可以为成员变量赋值,并且构造方法可以带有参数。例:

public class Student {
    int age;
    String name;
    String gender;
   public Student(int age,String name,String gender){    //构造方法
       this.age = age;
       this.name = name;     //赋值
       this.gender = gender;
   }
}


注意:只有在类中没有定义任何构造方法时,编译器才会创建一个默认无参的构造方法


实例:创建一个学生类,用构建方法为成员变量赋值,并输出打印。

public class Student {
    int age;
    String name;
    String gender;
   public Student(int age,String name,String gender){
       this.age = age;
       this.name = name;
       this.gender = gender;
   }
   void printStudent(){
       System.out.println(name+"-"+gender+"-"+age);
   }
    public static void main(String[] args) {
        Student s = new Student(20,"XiaoHua","女");
        s.printStudent();
    }
}


输出结果:

微信图片_20221028185601.jpg

2.4 局部变量

如果在成员方法内定义一个变量,这个变量就被称为局部变量


局部变量在方法执行时被创建,在方法执行结束时被销毁。局部变量在使用时必须初始化,否则会出现编译错误。例:

微信图片_20221028185615.jpg



编译器直接飘红


2.5 this关键字

先看一段代码:

public class Student {
    int age;
    String name;
    String gender;
   public Student(int age,String name,String gender){
       age = age;
       name = name;        //哪个是参数,哪个是成员变量呢?
       gender = gender;
   }


当类中的成员变量与成员方法中的参数重名时,方法如何使用成员变量呢?


在Java中,规定使用this关键字来代表本类对象的引用,this被隐式的用于引用对象的成员变量和方法。将上述代码改进如下:

public Student(int age,String name,String gender){
       this.age = age;
       this.name = name;
       this.gender = gender;
   }


· this关键字引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,如上面代码情况,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。


· 如果省略this关键字直接写成 name = name ,那只是把参数name赋值给参数变量本身而已,成员变量name的值没有改变,因为参数name在方法的作用域中覆盖了成员变量name。


· this关键字除了可以调用成员变量或成员方法之外,还可以作为方法的返回值,例:

public class Book{
    public Book getbook(){
        return this;      //返回Book类引用
    }
}


3. static关键字

由static 修饰的变量,常量,方法分别称为静态变量,静态常量,静态方法,也被称作类的静态成员。


3.1 静态变量

许多时候不同类之间需要同一个变量进行操作,例如同一个班的学生,学生本身的属性不同,但是所有学生共享一个教室。在Java中如果用static修饰共享的变量,那么该变量就是静态变量。


调用静态变量的语法如下:   类名.静态成员


先看这样的一段代码:

public class Student {
    int age;
    String name;
    String gender;
    static String classRoom = "307";
   public Student(int age,String name,String gender){
       this.age = age;
       this.name = name;
       this.gender = gender;
   }
   void printStudent(){
       System.out.println(name+"-"+gender+"-"+age);
   }
    public static void main(String[] args) {
        Student s1 = new Student(20,"XiaoHua","女");
        Student s2 = new Student(22,"XiaoFang","女");
        Student s3 = new Student(23,"XiaoZhang","男");
        Student s4 = new Student(24,"XiaoLi","男");
    }
}

在这里打断点:

微信图片_20221028185734.jpg



进行调试:

微信图片_20221028185737.jpg



发现静态成员变量不在具体的对象中存在。


静态成员只有一份,被所有的对象共享,当类被卸载时,静态成员才会被销毁。


静态成员变量访问的方式有两种:通过成员访问和直接通过类名访问,推荐:类.静态成员变量


3.2 静态方法

如果想要使用类中的成员方法,需要先将这个类进行实例化,但有些时候不想或者无法创建类的对象时,还要调用类中的方法才能够完成,这种情况下可以使用静态方法,调用静态方法格式如下:


类名.静态方法();


例如这段代码:

public class Student {
    int age;
    String name;
    String gender;
    static String classRoom = "307";
   public Student(int age,String name,String gender){
       this.age = age;
       this.name = name;
       this.gender = gender;
   }
   public static String getClassRoom(){      //静态成员方法
       return classRoom;
   }
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
    }
}

利用静态成员方法访问静态成员变量。


注意:静态方法不能访问实例变量。


4. 代码块

4.1 代码块概念及分类

使用 { } 定义的一段代码称为代码块,根据代码块的位置以及关键字,分为以下四种:


普通代码块,构造代码块,静态代码块,同步代码块(暂时不谈)


4.2 普通代码块

普通代码块:定义在方法中的代码块。

public static void main(String[] args) {
       int a = 10;
        System.out.println(a);
    }


4.3 构造代码块

构造块:定义在类中的代码块(无任何修饰符),也叫实例代码块,一般用于初始化实例成员变量

public class Student {
    int age;
    String name;
    String gender;
    public Student(){
        System.out.println("我是构造方法");
    }
    //实例代码块
    {
        this.age = 20;
        this.name = "XiaoHe";
        this.gender = "男";
    }
    public void printStudent(){
        System.out.println(name+gender+age);
    }
    public static void main(String[] args) {
        Student s = new Student();
        s.printStudent();
    }
}


注意事项:实例代码块优先于构造方法执行,因为编译完成后,编译器会将实例代码块中的代码拷贝到每个构造方法第一条语句前。


4.4 静态代码块

使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量

public class Student {
    int age;
    String name;
    String gender;
    static String classRoom;
    public Student(){
        System.out.println("我是构造方法");
    }
    //实例代码块
    {
        this.age = 20;
        this.name = "XiaoHe";
        this.gender = "男";
    }
    //静态代码块
    static{
        classRoom = "8-b-307";
    }
    public void printStudent(){
        System.out.println(name+gender+age);
    }
    public static void main(String[] args) {
        Student s = new Student();
        s.printStudent();
        System.out.println(s.classRoom);
    }
}


注意事项:


静态代码块不管生成多少个对象,只会执行一次


静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的


5. 类的主方法

主方法是类的入口点,它指定了程序从何处开始,提供对程序流向的控制,Java编译器通过主方法来执行程序。


主方法语法如下:

public static void main(String[] args) {
          //方法体
    }

主方法的特性:


· 主方法是静态的,所以要直接在主方法中调用其他方法,则该方法也必须是静态的。


· 主方法没有返回值


· 主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一个参数到第n+1个参数,可以使用args.length获取参数的个数。


相关文章
|
9月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1077 157
|
10月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
524 101
|
10月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
395 100
|
9月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
399 4
|
9月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
406 5
|
9月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
504 5
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
429 1
|
9月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
542 1
|
9月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
355 0
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1