【java 基础二 】- 面向对象、类、接口等

news2024/10/7 14:32:51

一、定义

Java面向对象编程(OOP)是一种编程范式,其旨在通过将程序逻辑封装在对象中来使代码更易于理解和维护。Java是一种面向对象的编程语言,它支持封装、继承和多态等概念。以下是Java面向对象编程的核心概念:

  1. 对象(Object):对象是具有属性和行为的实体。在Java中,对象是通过类定义的。
  2. 类(Class):类是对象的蓝图,它定义了对象的属性和行为。通过类定义,可以创建多个具有相同属性和行为的对象。
  3. 封装(Encapsulation):封装是将对象的属性和行为组合在一起,形成一个独立的单元。这有助于隐藏对象的内部实现细节,并提供了对外部代码的抽象。
  4. 继承(Inheritance):继承是一种机制,允许开发者通过定义一个新类来从现有类继承属性和行为。这有助于代码重用和减少冗余。
  5. 多态(Polymorphism):多态是指对象在接收相同的消息时可以表现出不同的行为。这可以通过方法的重载或覆盖来实现。

Java语言是面向对象的语言,因此对象是Java语言的核心,外事万物皆为对象,面向对象有三大基本特征,如上,封装,继承,多态。

1.1 封装

四种访问控制级别
在这里插入图片描述
优点

1、保护代码被破坏,提高数据安全性。
2、提高了代码的复用性
3、高内聚和低耦合,增强代码的可维护性

比如说一个类最简单的封装就是把属性隐藏起来,只提供 get和set 方法进行操作:

public class 盐蠢 {
	private String chun;
	public String bing;
    public void setchun(){}
    public String getchun(){
		return chun;
	}
}

再比如把尽可能多的东西藏起来,对外提高简洁的接口、或者把所有属性藏起来
比如洗衣机,对外只有两个接口,其他的外界均不知道

public class 洗衣机 {
	private String chun;
	private String bing;
	其他属性。。。
		
    public void 开关(){}
    public void 洗衣模式(){
		
	}
}

1.2 继承

在这里插入图片描述
语法,使用 extends 关键字来实现

class A extends B {}

详细的我们在下面类跟接口中讲

1.3 多态

允许不同的对象对同一个消息做出不同的响应。

在继承中,子类可以继承父类的属性和方法,也可以重写父类的方法来实现自己的特定行为。当父类的引用指向子类的对象时,可以通过父类的引用调用子类重写的方法,实现多态。

在接口中,类可以实现接口中定义的方法,这样可以实现不同的类拥有相同的行为,也可以通过接口的引用调用这些方法,实现多态。

public class AnimalSound {  
    public static void main(String[] args) {  
        Animal animal1 = new Dog();  
        Animal animal2 = new Cat();  
        animal1.say();  
        animal2.say();  
    }  
}  
  
abstract class Animal {  
    abstract void say();  
}  
  
class Cat extends Animal {  
    private String small_name = "猫";  
  
    @Override  
    void say() {  
        System.out.println("喵喵喵");  
    }  
}  
  
class Dog extends Animal {  
    private String small_name = "狗";  
  
    @Override  
    void say() {  
        System.out.println("汪汪汪");  
    }  
}

二、类与接口

2.1 类

类是同一类事物的统称,将现实世界的一个事物抽象成对象,类是对象的抽象,而对象是类的具体实例,类包括对象的属性和方法。

public class 盐蠢 {
	private String chun;
	public String bing;
    public void setchun(){}
    public String getchun(){
		return chun;
	}
}

属性和方法

Java类的属性(Properties)是指在类中定义的一些变量,用于描述类或类的对象的某些特征或状态。类的属性可以在类的对象创建时进行初始化或者在运行时动态赋值。
在Java中,类的属性可以通过访问修饰符来控制其可见性,如public、protected、private等。public属性可以被任何其他类访问,protected属性可以被同一包中的类和其他类的子类访问,private属性只能被本类访问。
类的属性可以是基本类型(如int、double、char等)或引用类型(如String、List等)。基本类型的属性可以直接赋值,而引用类型的属性需要通过new关键字来创建对象并进行赋值。
访问类的属性可以使用点操作符(.)访问。例如,如果有一个名为MyClass的类,其中有一个名为name的字符串属性,可以使用以下方式访问该属性:

MyClass obj = new MyClass();  
String name = obj.name;

类的属性也可以通过getters和setters方法进行访问和修改。getters方法用于获取属性的值,setters方法用于设置属性的值。getters和setters方法通常以驼峰命名法命名,并且setters方法在方法名前加上set关键字。例如:

public class MyClass {  
    private String name;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}

方法重载 与 重写

重写父类的方法,方法名字、参数、返回值相同,常见的如overwirte

public class Persion {
	public String attrite = "";
	public void todo(){
       System.out.println("属性是:人性本善");
    }
}
public class Student extends Persion{
    public void todo() {		//重写了父类的方法,方法名和参数相同
        System.out.println("todo: 属性是,你他妈变坏了啊");
    }
}

同一个类中的相同名字不同参数的方法,调用时根据传递的参数不同来区分是哪个方法

public class Persion {
	public String attrite = "";
	public void todo(){
       System.out.println("属性是:人性本善");
    }
    
	public void todo(String name){
       System.out.println(name + "所有人 属性是:人性本善");
    }
}

重写和重载是Java中的两个重要的概念,它们的主要区别有以下几点:
1、定义不同
重载是指在同一个类中,方法名相同但参数不同的方法,编译器根据参数的数量、类型、顺序来区分不同的重载方法。返回值类型可以相同也可以不同。
重写是指在子类中重新定义父类的方法,方法名、参数列表和返回值类型必须与父类中被重写的方法一致。子类可以根据需要修改方法的具体实现,但外观必须与父类的一致。
2、范围不同
重载是在一个类中定义多个方法,允许方法的参数数量、类型或顺序不同。
重写是在子类中重新定义父类的方法,允许方法的参数数量、类型和返回值类型相同。
3、多态性不同
重载是在编译时多态,即编译器在编译时确定调用哪个方法。
重写是在运行时多态,即运行时确定调用哪个方法,可以根据对象的实际类型来调用方法。
4、参数不同
重载的方法参数可以不同,但重写的方法参数必须相同。
5、访问修饰符不同
重载对访问修饰没有特殊要求,可以是public、protected、private或没有访问修饰符。
重写的要求比较严格,被重写的方法必须为public、protected或default访问修饰符,子类方法的访问修饰符不能比父类方法的访问修饰符严格。
6、返回值不同
重载对返回值类型没有要求,可以相同也可以不同。
重写对返回值类型有要求,必须与父类中被重写的方法的返回值类型相同或是其子类。

构造方法

Java构造方法是一种特殊的方法,主要用来实例化对象和初始化对象。构造方法的主要作用是在对象创建时对对象进行初始化,对对象中的实例进行赋值。构造方法的名字必须与定义它的类名完全相同,没有返回类型,甚至连void也没有。构造方法可以被重载,但不允许被继承。当没有指定构造方法时,系统会自动添加无参构造方法。

public class Persion {
	public String attrite = "";
	
	// 无参构造方法
	public Persion(){
       System.out.println("构造方法");
    }
    
	public Persion(String name){
       System.out.println("构造方法");
    }
    
	public void todo(){
       System.out.println("属性是:人性本善");
    }
    
}

匿名内部类

Java匿名内部类是一种没有名字的内部类,它是一种实现某项功能的匿名类。匿名内部类可以用来创建一个接口的实例,而不需要额外的类或命名空间。
匿名内部类是在 Java 中使用的一种创建匿名类的语法结构,通常用于处理需要一个类,但不需要将该类定义为一个单独的类的场景。
匿名内部类可以访问外部类的成员变量和成员方法,并且可以继承一个接口,实现接口中的方法。匿名内部类可以用在许多Java应用中,如事件处理、GUI编程等。
例如,下面的代码展示了一个使用匿名内部类的例子:

Button button = new Button() {  
    {  
        addClickListener(new ClickListener() {  
            public void onClick() {  
                System.out.println("Button clicked");  
            }  
        });  
    }  
};

抽象类

使用关键字 abstract

public abstract class Persion {
	public String attrite = "";
	public abstract void todo();
    
	public void todo(String name){
       System.out.println(name + "所有人 属性是:人性本善");
    }
}

Java抽象类是一种不能被实例化的类,它主要用于作为抽象类的祖先,提供一些公共方法和属性。抽象类可以包含抽象方法和非抽象方法,但抽象方法不能被实例化。
Java中的抽象类必须被继承并且可以包含抽象方法。如果一个类继承了一个抽象类,那么该类也必须实现抽象类中的所有抽象方法。如果子类没有实现所有抽象方法,那么子类也必须声明为抽象类。
在Java中,抽象类不能被实例化,但可以被其他类继承并使用。抽象类的主要作用是作为公共属性的集合,为不同对象提供共性,因此抽象类主要用于面向对象编程中的类型隐藏。

2.2 接口

在Java中,接口是一种特殊的抽象类,其中所有方法都是抽象的。接口定义了一组规范,这些规范描述了类应该如何实现某些功能。接口中的方法没有具体的实现,只有方法的签名。
以下是一个简单的Java接口定义示例:

public interface MyInterface {  
   public void doSomething(); // 抽象方法无实现  
   public int calculateSum(int a, int b); // 抽象方法无实现  
}

接口可以包含多个抽象方法,这些方法在接口中不需要提供任何实现,只有方法签名即可。在定义接口时,需要使用关键字interface。
接口也可以包含默认方法和静态方法,这两种方法提供了实现,但是默认方法有默认的实现,而静态方法没有默认实现。
接口中的所有方法默认都是public和abstract的,因此可以省略这些修饰符。此外,接口中可以定义默认方法和静态方法,这些方法提供了实现。以下是一个示例:

public interface MyInterface {  
   default void doSomething() {  
      System.out.println("Doing something...");  
   }  
  
   static int calculateSum(int a, int b) {  
      return a + b;  
   }  
}

实现接口需要使用关键字implements,类可以实现一个或多个接口。实现接口需要实现其中的所有抽象方法。以下是一个示例:


public class MyClass implements MyInterface {  
   public void doSomething() {  
      // 实现MyInterface接口中的doSomething方法  
      System.out.println("Doing something in MyClass...");  
   }  
     
   public int calculateSum(int a, int b) {  
      // 实现MyInterface接口中的calculateSum方法  
      return a + b;  
   }  
}

三、super 关键字

Java中的super关键字用于调用父类的构造方法、实例变量和实例方法。

  1. 调用父类的构造方法:
    子类通过super()调用父类的构造方法,在子类的构造方法中必须第一行使用super()来调用父类的构造方法。
public class Animal {  
    String name;  
  
    public Animal(String name) {  
        this.name = name;  
    }  
}  
  
public class Dog extends Animal {  
    String breed;  
  
    public Dog(String name, String breed) {  
        super(name);  // 调用父类的构造方法  
        this.breed = breed;  
    }  
}
  1. 调用父类的实例变量或实例方法:
    子类通过super.来访问父类的实例变量或实例方法。
public class Animal {  
    String name;  
  
    public Animal(String name) {  
        this.name = name;  
    }  
  
    public String getName() {  
        return name;  
    }  
}  
  
public class Dog extends Animal {  
    String breed;  
  
    public Dog(String name, String breed) {  
        super(name);  // 调用父类的构造方法  
        this.breed = breed;  
    }  
  
    public void printName() {  
        System.out.println(super.getName());  // 调用父类的实例方法  
    }  
}

四、static 关键字

Java中的static关键字用于定义静态变量、静态方法以及静态块。
静态变量是指类变量,而不是实例变量。它们是与类而不是与对象关联的变量。这意味着所有实例都共享静态变量,并且可以通过类名访问静态变量,而无需创建实例。静态变量在内存中只有一份,因此也称为类变量。
静态方法是指与类关联的方法,而不是与实例关联的方法。静态方法可以通过类名访问,无需创建实例。静态方法使用static关键字声明,它们不能访问非静态变量或非静态方法。
静态块是指与类关联的代码块,在类加载时执行。它们用于执行一些初始化任务,例如初始化静态变量或常量。静态块使用static关键字声明。
以下是一个使用static关键字的例子:

public class MyClass {  
    static int staticVar = 10;  // 静态变量  
  
    static {  
        // 静态块,用于初始化静态变量  
        staticVar = 20;  
        System.out.println("静态变量被初始化为:" + staticVar);  
    }  
  
    public static void main(String[] args) {  
        // 访问静态方法  
        System.out.println("静态方法被调用");  
        System.out.println("静态变量的值为:" + staticVar);  
    }  
}

五、this 关键字

在 Java 中,this 关键字代表当前对象的引用。this 关键字可以在方法内部访问当前对象的成员变量和方法,还可以用来区分相同名称的局部变量和成员变量。
下面是一个简单的示例:

public class Person {  
    private String name;  
    private int age;  
  
    public Person(String name, int age) {  
        this.name = name; // 使用 this 关键字引用成员变量  
        this.age = age;   // 使用 this 关键字引用成员变量  
    }  
  
    public void introduce() {  
        System.out.println("My name is " + this.name + ", and I am " + this.age + " years old."); // 使用 this 关键字引用成员变量  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Person person = new Person("Tom", 20);  
        person.introduce(); // 输出:My name is Tom, and I am 20 years old.  
    }  
}

在这个示例中,我们定义了一个 Person 类,其中包含两个成员变量 name 和 age,以及一个带参数的构造函数和一个小写方法 introduce()。在构造函数中,我们使用了 this 关键字来引用成员变量,而在 introduce() 方法中,我们使用了 this 关键字来引用成员变量并打印出个人信息。在 main() 方法中,我们创建了一个 Person 对象并调用了 introduce() 方法。
需要注意的是,在方法内部,this 关键字也可以用来区分相同名称的局部变量和成员变量。例如:

public class Person {  
    private String name;  
    private int age;  
  
    public Person(String name, int age) {  
        this.name = name; // 使用 this 关键字引用成员变量  
        this.age = age;   // 使用 this 关键字引用成员变量  
  
        String name = "Tom"; // 声明一个局部变量 name  
        this.name = "Tom";   // 使用 this 关键字引用成员变量 name  
  
        System.out.println("My name is " + this.name + ", and I am " + this.age + " years old."); // 使用 this 关键字引用成员变量  
    }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BM7 算法

描述 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a; n≤10000n≤10000&#xff0c;1<结点值<100001<结点值<10000 要求&#xff1a;空间复杂度 O(1)O(1)&#x…

Linux进程间通信——管道,共享内存,消息队列,信号量

进程间通信 文章目录 进程间通信进程间通信的方式进程间通信的概念如何实现进程间通信管道什么是管道 进程间怎么通信 匿名管道pipe函数创建管道通信读写特征写慢读快写快读慢写端关闭&#xff0c;读端读完读端关闭&#xff0c;写端&#xff1f; 管道特征 命名管道命名管道特性…

近期学习论文总结 2

公众号&#xff1a;EDPJ 目录 0. 摘要 1. Artificial Fingerprinting for Generative Models: Rooting Deepfake Attribution in Training Data 1.1 核心思想 1.2 步骤 2. HyperDomainNet: Universal Domain Adaptation for Generative Adversarial Networks 2.1 核心思想…

使用Chat gpt提高Android开发效率

简介 在过去几周里&#xff0c;我进行了一项令人大开眼界的实验&#xff0c;将 Chat-GPT&#xff08;我使用的是 Bing Chat&#xff0c;它在后台使用了 GPT-4&#xff0c;并且可以免费使用&#xff09;融入到我的日常 Android 开发工作流程中&#xff0c;以探索它是否能够提高…

黑马Redis视频教程高级篇(安装OpenResty)

目录 一、安装 1.1、安装开发库 1.2、安装OpenResty仓库 1.3、安装OpenResty 1.4、安装opm工具 1.5、目录结构 1.6、配置nginx的环境变量 二、启动和运行 三、备注 一、安装 首先你的Linux虚拟机必须联网。 1.1、安装开发库 首先要安装OpenResty的依赖开发库&#…

Spring Bean生命周期之三级缓存循环依赖

文章目录 1 三级缓存1.1 引言1.2 三级缓存各个存放对象1.3 解决循环依赖条件1.3.1 解决循环依赖条件1.3.2 Sprin中Bean的顺序1.3.3 更改加载顺序1.3.3.1 构造方法依赖 (推荐)1.3.3.2 参数注入1.3.3.3 DependsOn(“xxx”)1.3.3.4 BeanDefinitionRegistryPostProcessor接口 1.3.4…

Pandas从入门到精通

一、什么是Pandas Pandas是基于NumPy的一种工具&#xff0c;该工具是为解决数据分析任务而创建的&#xff0c;Pandas提供了大量能使我们快速便捷的处理数据的功能 Pandas与出色的Jupyter 工具包和其他库相结合&#xff0c;Python中用于进行数据分析的环境在性能、生产率和协作…

javascript基础二十四:JavaScript中本地存储的方式有哪些?区别及应用场景?

一、方式 javaScript本地缓存的方法我们主要讲述以下四种&#xff1a; cookiesessionStoragelocalStorageindexedDB cookie Cookie&#xff0c;类型为「小型文本文件」&#xff0c;指某些网站为了辨别用户身份而储存在用户本地终端上的数据。是为了解决 HTTP无状态导致的问题…

IDEA插件Free Mybatis Tool

之前经常的操作是在 Mapper 接口中将接口名称复制一下&#xff0c;然后去查找对应的 XML 文件&#xff0c;打开后 CRTLF 查找对应的 xml 实现&#xff0c;整个过程效率很低下。搜了搜果然有前辈已经出了一款 IDEA 的插件解决了这个问题&#xff0c;把这个好用的跳转插件推荐给大…

leetcode 55.跳跃游戏

题目描述跳转至leetcode 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://lee…

软件测试-黑盒测试方法

这里写自定义目录标题 测试用例的定义和特征设计测试用例的基本准则黑盒测试用例设计的几种方法&#xff08;一&#xff09;等价类划分法等价类的类型 如何划分等价类等价类划分步骤等价类的划分原则等价类划分法设计测试用例的步骤 &#xff08;二&#xff09;边界值分析法边界…

oVirt 4.4.10三节点超融合集群安装配置及集群扩容(一)

环境 oVrit版本: 4.4.10 oVirt image: https://mirrors.aliyun.com/ovirt/ovirt-4.4/iso/ovirt-node-ng-installer/4.4.10-2022030308/el8/ovirt-node-ng-installer-4.4.10-2022030308.el8.iso?spma2c6h.25603864.0.0.46c8a3e6ELIYzK oVirt engine appliance: https://mirror…

osgViewer中的ScreenCaptureHandler、LODScaleHandler、HelpHandler事件处理器用法

目录 1. 前言 2. osgViewer::ScreenCaptureHandler 3. osgViewer::LODScaleHandler 4. osgViewer::HelpHandler 5. osgViewer::ThreadingHandler 1. 前言 osg为视景器的使用和调试提供了丰富的辅助组件&#xff0c;它们主要是以osg::ViewerBase的成员变量或交互事件处理器…

风险SQL 规范及案例

一、 原则 1、程序处理优先:数据库最容易也通常是一个系统的瓶颈,因此不要给数据库加压力,能够程序处理就程序处理。 2、简单操作数据库:一个系统越简单越稳定越不容易出问题, 因此要尽量简单使用数据库, 如SQL简单,事务小 3、数据存储评估:数据库资源宝贵,是很难水平…

饮用水污染预警系统的设计与开发(前后端分离)

1.饮用水污染预警系统的介绍 随着工业化和城市化进程的加速&#xff0c;水污染问题越来越引起人们的关注。饮用水是人类赖以生存的重要资源之一&#xff0c;饮用水污染对人类健康和社会经济发展产生的影响愈加突出。近年来&#xff0c;我国政府高度重视饮用水污染治理工作&…

车牌识别系统Python,基于深度学习CNN卷积神经网络算法

一、介绍 车牌识别系统&#xff0c;基于Python实现&#xff0c;通过TensorFlow搭建CNN卷积神经网络模型&#xff0c;对车牌数据集图片进行训练最后得到模型&#xff0c;并基于Django框架搭建网页端平台&#xff0c;实现用户在网页端输入一张图片识别其结果&#xff0c;并基于P…

自学黑客!一般人我劝你还是算了吧!

笔者本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全联合实验室。 我为啥说自学黑客&#xff0c;一般人我还是劝你算了吧&#xff01;因为我就是那个不一般的人。 首先我谈下对黑客&am…

Andriod开发 Adapter ArrayAdapter

一、Adapter Adapter 是一个非常重要的组件&#xff0c;用于将数据与视图进行绑定。 一般的用法是一个View中要显示多个布局相同但数据不同的item&#xff08;例如论坛界面的多个帖子&#xff0c;购物车里的多个商品&#xff09;。 可以将item的布局和数据输入Adapter&#…

Django Admin Cookbook-5如何在Django Admin后台中添加Logo

目录 后台显示文字与自定义 1.如何更改管理后台标题Django administration&#xff1f; 2.如何设置模型的复数文本&#xff1f; 3.如何创建两个独立的管理站点&#xff1f; 4.如何从Django管理后台中删除默认应用程序&#xff1f; 5.如何在Django管理后台中添加Logo&#xff…

C++语法(24) 哈希应用

C语法&#xff08;23&#xff09;-- 模拟实现unordered_set和unordered_map_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130449452?spm1001.2014.3001.5501 目录 1.位图 1.定义 2.实现 3.应用 4.特点 2.布隆过滤器 1.介绍 2.设计场…