【前端学java】面向对象编程基础-类的使用(4)

简介: 【8月更文挑战第9天】面向对象编程基础-类的使用

java中的类语法和前端的类语法几乎是一致的。

基础代码示例

JAVA的面向对象编程和JS的类语法十分接近,我们看一段代码

public class Object_oriented {
   
   
    public static void main(String[] args) {
   
   
        // 打工人 前的PeoPle是类型
        People dagongren =new People();
        dagongren.name = "zhangsan";
        dagongren.speak();
    }
}

class People {
   
   
    String name;
    void speak(){
   
   
        System.out.println("卧槽," + name +"讲话了!");
    }
}

上述代码包含一个名为Object_oriented的Java类和一个名为People的Java类。
Object_oriented类是程序的入口点,具有一个静态的main方法,是程序的执行起点。在main方法中,创建了一个People对象,名为dagongren,并设置了其name属性为"zhangsan"。接着调用了dagongren对象的speak方法。
People类是一个自定义的类,具有一个name属性和一个speak方法。name属性是一个字符串,存储了一个人的名字。
11.gif

类的属性

在Java类中,属性也称为成员变量实例变量,是类的特征和状态的表示。

属性可以是任何基本数据类型(如整数、浮点数、字符、布尔值等)或引用数据类型(如字符串、数组、对象等)。

属性的声明语法如下:

<访问修饰符> <数据类型> <属性名>;

访问修饰符用于控制属性的可见性和访问范围:

  • public:可以从任何地方访问。
  • private:只能在同一个类中访问。
  • protected:可以在同一个包内或子类中访问。
  • 默认(不写修饰符):可以在同一个包内访问。

例如,以下是一个包含三个属性的示例:

public class Person {
   
   
  public String name;     // 公开的name属性
  private int age;        // 私有的age属性
  protected boolean sex;   // 受保护的sex属性
  // 构造方法和其他方法...
}

在上面的示例中,Person类有三个属性:name、age和sex。name属性是公开的,可以从类外部访问。age属性是私有的,只能在Person类内部访问。sex属性是受保护的,可以在同一个包内或Person类的子类中访问。

类的方法

类的方法和TS中的方法基本一致,类中的方法需要添加返回类型
方法由方法头方法体组成。方法头包括方法的修饰符、返回类型、方法名称参数列表

修饰符 返回类型 方法名(参数列表) {
    // 方法体
}
  • 修饰符指定方法的访问方式(public、private、protected等)
  • 返回类型指定方法返回的数据类型(如果没有返回值则使用关键字void)
  • 方法名是方法的标识符
  • 参数列表列出方法接受的参数。

我们可以看一个简单的demo

public class Object_oriented {
   
   
  public static void main(String[] args) {
   
   
    People dagongren =new People();
    dagongren.eat = true;
    dagongren.speak();
  }
}
class People {
   
   
  boolean eat;
  void speak(){
   
   
    System.out.println(getText());
  }
  String getText(){
   
   
    if(this.eat) {
   
   
      return "我吃饭了";
    }else {
   
   
      return "我没吃饭";
    }
  }
}

方法中引入类的属性可以使用this关键词
方法中可以引入类中的其他方法

如果类中的方法需要参数,其写法和js也是一致的,不过需要指定参数的类型,如

public void add(int num1, int num2) {
   
   
  // 方法体
}

静态

静态成员

静态变量是与类关联的变量,可以理解为类自身的属性,实例对象是木有的。静态变量可以用类名直接访问,而不需要创建类的实例。例如:

public class MyClass {
   
   
  static int count;
}

使用类名访问静态成员变量。例如:MyClass.count = 10;

静态方法

静态方法是与类关联的方法。与静态变量一样,无需创建类的实例即可访问静态方法。

使用类名调用静态方法。例如:MyClass.printMessage();

静态块

通过使用 static 关键字定义,用于在类加载时执行一次的初始化操作。静态代码块在类首次被加载时执行,并且在类中的其他静态成员之前执行。


public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    static {
        System.out.println("静态代码块1-------------------------------");
    }
    static {
        System.out.println("静态代码块3-------------------------------");
    }
}

image.png

实例代码块

没有使用任何关键字定义,直接写在类中的代码块。实例代码块在创建对象时被调用,每次创建对象都会执行。通常用于在创建对象时进行一些通用的初始化操作。

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    {
        System.out.println("实例代码块2-------------------------------");
    }
}

image.png

静态代码块与实例代码的区别

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    static {
        System.out.println("静态代码块1-------------------------------");
    }
    {
        System.out.println("实例代码块2-------------------------------");
    }
    static {
        System.out.println("静态代码块3-------------------------------");
    }
}

image.png
可见:

  • 静态代码块优先级最高,只执行一次
  • 实例代码块优先级低,每次实例都执行

    构造方法

    构造方法是一种特殊的方法,用于创建并初始化对象。构造方法的名称必须与类名相同,并且没有返回类型。

    这和js类中的constructor是一致的

构造方法有以下特点:

  1. 构造方法在使用new关键字创建对象时被调用,且只调用一次。
  2. 构造方法可以有多个重载版本,即可以根据不同的参数列表创建不同的构造方法。
  3. 如果没有显式定义构造方法,Java会隐式地提供一个无参的默认构造方法,用于创建对象。
    public class test {
         
         
     public static void main(String[] args) {
         
         
         new People();
         new People();
     }
    }
    class People {
         
         
     People(){
         
         
         System.out.println("构造方法-------------------------------");
     }
    }
    
    image.png

    构造方法与静态块的执行顺序

    public class test {
         
         
     public static void main(String[] args) {
         
         
         new People();
         new People();
     }
    }
    class People {
         
         
     static {
         
         
         System.out.println("静态代码块1-------------------------------");
     }
     {
         
         
         System.out.println("实例代码块2-------------------------------");
     }
     People(){
         
         
         System.out.println("构造方法-------------------------------");
     }
     static {
         
         
         System.out.println("静态代码块3-------------------------------");
     }
    }
    
    image.png
    可见,优先级顺序 静态块 > 实例块 > 构造方法

继承

Java中的继承语法格式如下:

class Subclass extends Superclass {
   
   
    // 子类的方法和属性
}

其中,Subclass是子类,Superclass是父类。

我们看下面这个具体示例:

class Animal {
   
   
    public void eat() {
   
   
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
   
   
    public void bark() {
   
   
        System.out.println("Dog is barking");
    }
}

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Dog d = new Dog();
        d.eat();   // 继承自Animal类
        d.bark();  // 继承自Dog类
    }
}

在上面的例子中,Dog类继承了Animal类。因此,Dog类可以使用Animal类中定义的eat()方法。同时,Dog类还定义了自己的bark()方法。

this关键字

如果上述Animal类需要一个入参来指定eat的内容,Animal类需要做一些更改

class Animal {
   
   
    String food;
    // 我们在构造方法中使用this改变了类的属性food的值
    public Animal(String food){
   
   
        this.food = food;
    }
    public void eat() {
   
   
        System.out.println("狗吃了" + this.food);
    }
}

this关键字可以用于访问当前类的成员变量和方法。

super

此时,Dog在继承Animal类时,也需要访问父类的成员变量food

class Dog extends Animal {
   
   
    public Dog(String food){
   
   
        // 使用super()可以调用父类的构造方法
        super(food);
    }
    public void bark() {
   
   
        System.out.println("Dog is barking");
    }
}

super关键字用于访问父类的成员变量和方法,super()必须是构造方法中的第一条语句

完整代码

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Dog d = new Dog("火腿肠");
        d.eat();   // 继承自Animal类
        d.bark();  // 继承自Dog类
    }
}
class Animal {
   
   
    String food;
    public Animal(String food){
   
   
        this.food = food;
    }
    public void eat() {
   
   
        System.out.println("狗吃了" + this.food);
    }
}

class Dog extends Animal {
   
   
    public Dog(String food){
   
   
        super(food);
    }
    public void bark() {
   
   
        System.out.println("Dog is barking");
    }
}

多态

多态是面向对象编程中的一个重要特性,它允许一个对象在不同的上下文中表现出不同的行为。在Java中,多态性是通过继承和方法重写来实现的。
我们看一个示例:

class Animal {
   
   
   void name (){
   
   
      System.out.println("所有动物都有名字");
   }
}

class Dog extends Animal {
   
   
    void speak (){
   
   
        System.out.println("狗喜欢叫");
    }
}

上述代码中,我们定义了一个Animal类,Dog类继承了Animal类。
我们实例化一个Animal类,它的name方法自然可以执行。

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Animal dw = new Animal();
        dw.name();
    }
}

image.png
现在,我们实例化一个Dog类,注意,Dog的实例有两种类型,Animal和Dog

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Animal dw = new Animal();
        dw.name();
        Animal dog1 = new Dog();
        Dog dog2 = new Dog();
    }
}

Animal类型的dog1只有name方法,而Dog类型的dog2有speak和name方法

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Animal dog1 = new Dog();
        dog1.name();
        Dog dog2 = new Dog();
        dog2.speak();
        dog2.name();
    }
}

这就是多态。多态是面向对象编程中的一个重要特性,它允许一个对象在不同的上下文中表现出不同的行为。在Java中,多态性是通过继承和方法重写来实现的。

重载

假设我们有一个登录方法,这个方法可以通过不同形式登录。如果我们在类中写两个完全一致的函数login名,会报错。
image.png

一个类中,不能重复声明相同的方法,相同的属性

我们也许会想到写一个login函数,通过if-else来实现逻辑。但是,在java中,使用函数重载,能更好的解决这个问题。
当我们给login函数定义不同的入参时,报错就取消了。
image.png

如果方法名相同,但是参数列表(个数、顺序、类型)不同,会认为是不同的方法。这个操作在JAVA中称之为方法的重载。

构造函数的重载

构造函数也是支持重载的

package top;

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Login p1 = new Login();
        Login p2 = new Login("张三");
        Login p3 = new Login("张三","女");
    }
}
class Login {
   
   
    Login(){
   
   

    }
    Login(String name){
   
   

    }
    Login(String name,String sex){
   
   
        System.out.println(name + sex);
    }
}

image.png
此外,我们还可以借助this关键词来在构造函数中调用其他的重载函数

package top;

public class Test {
   
   
    public static void main(String args[]) {
   
   
        Login p1 = new Login();
    }
}
class Login {
   
   
    Login(){
   
   
        this("张三");
    }
    Login(String name){
   
   
        this(name,"女");
    }
    Login(String name,String sex){
   
   
        System.out.println(name + sex);
    }
}

image.png

相关文章
|
7天前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
142 83
|
1月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
134 35
|
13天前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
51 11
|
5天前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
|
8天前
|
SQL Java 数据库连接
Java 期末考试救急必备涵盖绝大多数核心考点及五大类经典代码助你过关
本文为Java期末考试复习指南,涵盖基础语法、面向对象编程、异常处理、文件操作、数据库连接五大核心考点,提供详细解析与实用代码示例,助力快速掌握重点,高效备考,轻松应对考试。
28 0
|
2月前
|
人工智能 安全 Java
Java并发包下Atomic相关类的使用
本文介绍了 `java.util.concurrent.atomic` 包下的各类原子类及其使用场景,包括基本类型原子类(如 `AtomicInteger`、`AtomicLong`)、数组类型原子类(如 `AtomicIntegerArray`)、引用类型原子类(如 `AtomicReference`)、对象属性修改原子类(如 `AtomicIntegerFieldUpdater`)以及原子操作增强类(如 `LongAdder` 和 `LongAccumulator`)。同时,详细对比了不同原子类在高并发场景下的性能表现,展示了 `LongAdder` 的高效性。
100 31
|
2月前
|
存储 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(7):不可变类设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中Java不可变类设计指南,废话不多说让我们直接开始。
50 0
|
3月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
3月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
87 0
|
4月前
|
Java
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等