初学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获取参数的个数。


相关文章
|
2天前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
22 15
|
2月前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
202 63
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
165 57
|
17天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
68 8
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
81 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
143 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
90 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
79 4