java–面向对象基础

类的定义

面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能

  • 类的理解
  • 类是对现实生活中一类具有共同属性和行为的事物的抽象
  • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
  • 简单理解:类就是对现实事物的一种描述

  • 类的组成

  • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
  • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)

  • 类和对象的关系

  • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
  • 对象:是能够看得到摸的着的真实存在的实体
  • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

类的定义

 public class Student {  //定义一个公共类,都可以访问调用该类
// 属性 : 姓名, 年龄
// 成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外
String name;
int age;
// 行为 : 学习
// 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字.

public void study(){
System.out.println("学习");
}
}

对于一个类来说,有三种成员:属性 field、方法 method、构造器 constructor。
属性(field 成员变量)

属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。
在定义成员变量时可以对其初始化,如果不对其初始化,Java 使用默认的值对其初始化。
数据类型默认值整型0 浮点型0.0 字符型’\u0000’布尔型false 所有引用类型null

属性定义格式:

[修饰符] 属性类型 属性名 = [默认值] ;
方法

方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。

[修饰符] 方法返回值类型 方法名(形参列表) {
// n 条语句
}
构造方法(构造器 constructor)

构造器用于对象的初始化

java--面向对象基础

声明格式:

[&#x4FEE;&#x9970;&#x7B26;] &#x7C7B;&#x540D;(&#x5F62;&#x53C2;&#x5217;&#x8868;){<br>&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;//n &#x6761;&#x8BED;&#x53E5;<br>&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;}&#xA0;

构造器 4 个要点:

  • 构造器通过new 关键字调用!!
  • 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用 return 返回某个值。
  • 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
  • 构造器的方法名必须和类名一致
/*
   &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x201C;&#x70B9;&#x201D;&#xFF08;Point&#xFF09;&#x7C7B;&#x7528;&#x6765;&#x8868;&#x793A;&#x4E8C;&#x7EF4;&#x7A7A;&#x95F4;&#x4E2D;&#x7684;&#x70B9;&#xFF08;&#x6709;&#x4E24;&#x4E2A;&#x5750;&#x6807;&#xFF09;&#x3002;&#x8981;&#x6C42;&#x5982;&#x4E0B;&#xFF1A;
&#xF06E; &#x53EF;&#x4EE5;&#x751F;&#x6210;&#x5177;&#x6709;&#x7279;&#x5B9A;&#x5750;&#x6807;&#x7684;&#x70B9;&#x5BF9;&#x8C61;&#x3002;
&#xF06E; &#x63D0;&#x4F9B;&#x53EF;&#x4EE5;&#x8BA1;&#x7B97;&#x8BE5;&#x201C;&#x70B9;&#x201D;&#x8DDD;&#x53E6;&#x5916;&#x4E00;&#x70B9;&#x8DDD;&#x79BB;&#x7684;&#x65B9;&#x6CD5;&#x3002;
*/
class Point {  // &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x7C7B;
    double x, y;  // &#x5C5E;&#x6027;

    public Point(double _x, double _y) { // &#x6709;&#x53C2;&#x6784;&#x9020;&#x65B9;&#x6CD5;
        x = _x;
        y = _y;
    }

    public double getDistance(Point p) {  //&#x4E00;&#x4E2A;&#x6210;&#x5458;&#x65B9;&#x6CD5;&#xFF0C;&#x8FD4;&#x56DE;&#x7C7B;&#x578B;&#x4E3A;double
        return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
    }

    public static void main(String[] args) {  // &#x5165;&#x53E3;
        Point p1 = new Point(3.0, 4.0);
        Point origin = new Point(0.0, 0.0);
        System.out.println(p1.getDistance(origin));
    }
}

构造方法的重载

构造方法重载(创建不同用户对象)

构造方法重载(创建不同用户对象)

&#xA0;public class User {
    int id; // id
    String name; // &#x8D26;&#x6237;&#x540D;
    String pwd; // &#x5BC6;&#x7801;

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public User(int id, String name, String pwd) { // &#x6784;&#x9020;&#x65B9;&#x6CD5;&#x91CD;&#x8F7D;
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public static void main(String[] args) {
        User u1 = new User();
        User u2 = new User(101, "&#x5C0F;&#x4E03;");  // &#x4F7F;&#x7528;&#x7684;&#x662F;&#x6709;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;
        User u3 = new User(100, "&#x5F20;&#x4E09;", "123456"); // &#x4F7F;&#x7528;&#x7684;&#x662F;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;
    }
}

回顾方法重载:

  • 指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
  • 多个方法在同一个类中
  • 多个方法具有相同的方法名
  • *多个方法的参数不相同,类型不同或者数量不同

特点:

  1. 类型不同或者数量不同重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
  2. 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载

对象的创建和使用

创建对象的格式:

类名 对象名 = new 类名();
调用成员的格式:

对象名.成员变量

对象名.成员方法();

示例代码 :

类的使用

&#xA0;public class TestStudent {
    /*
    &#x521B;&#x5EFA;&#x5BF9;&#x8C61;&#x7684;&#x683C;&#x5F0F;:
    &#x7C7B;&#x540D; &#x5BF9;&#x8C61;&#x540D; = new &#x7C7B;&#x540D;();
    &#x8C03;&#x7528;&#x6210;&#x5458;&#x53D8;&#x91CF;&#x7684;&#x683C;&#x5F0F;:
    &#x5BF9;&#x8C61;&#x540D;.&#x53D8;&#x91CF;&#x540D;
    &#x8C03;&#x7528;&#x6210;&#x5458;&#x65B9;&#x6CD5;&#x7684;&#x683C;&#x5F0F;:
    &#x5BF9;&#x8C61;&#x540D;.&#x65B9;&#x6CD5;&#x540D;();
    */
    public static void main(String[] args) {
    // &#x7C7B;&#x540D; &#x5BF9;&#x8C61;&#x540D; = new &#x7C7B;&#x540D;();
    Student stu = new Student();
    // &#x5BF9;&#x8C61;&#x540D;.&#x53D8;&#x91CF;&#x540D;
    // &#x9ED8;&#x8BA4;&#x521D;&#x59CB;&#x5316;&#x503C;
    System.out.println(stu.name); // null
    System.out.println(stu.age); // 0
    stu.name = "&#x5F20;&#x4E09;";
    stu.age = 23;
    System.out.println(stu.name); // &#x5F20;&#x4E09;
    System.out.println(stu.age); // 23
    // &#x5BF9;&#x8C61;&#x540D;.&#x65B9;&#x6CD5;&#x540D;();
    stu.study();
    // com.itheima.object1.Student@b4c966a
    // &#x5168;&#x7C7B;&#x540D;(&#x5305;&#x540D; + &#x7C7B;&#x540D;)
    System.out.println(stu);
        }
}

对象内存图

单个对象内存图

java--面向对象基础
多个对象内存图

java--面向对象基础

总结 :
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
JAVA 虚拟机内存模型概念

java--面向对象基础

虚拟机栈(简称:栈)的特点如下:

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)

2.JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)

  1. 栈属于线程私有,不能实现线程间的共享!

4.栈的存储特性是”先进后出,后进先出”

  1. 栈是由系统自动分配,速度快!栈是一个 连续的内存空间

堆的特点如下:

  1. 堆用于存储创建好的对象和数组(数组也是对象)

2.JVM 只有一个堆,被所有线程共享

  1. 堆是一个不连续的内存空间, 分配灵活,速度慢!

  2. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。

方法区(也是堆)特点如下:

  1. 方法区是 JAVA 虚拟机规范,可以有不同的实现。

i. JDK7 以前是”永久代”

ii. JDK7 部分去除”永久代”,静态变量、字符串常量池都挪到了堆内存中

iii. JDK8 是”元数据空间”和堆结合起来。

  1. JVM 只有一个方法区,被所有线程共享!

  2. 方法区实际也是堆,只是用于存储类、常量相关的信息!

  3. 用来存放程序中永远是不变或唯一的内容。(类信息【Class 对象,反射机制中会重点讲授】、静态变量、字符串常量等)

  4. 常量池主要存放常量:如文本字符串、final 常量值。
    多个对象指向相同内存图

java--面向对象基础

总结 :
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

成员变量和局部变量

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

  1. 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上)
  2. 内存中位置不同:成员变量(堆内存)局部变量(栈内存)
  3. 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)
  4. 初始化值不同:成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用)

垃圾回收原理和算法

内存管理

Java 的内存管理很大程度就是:堆中对象的管理,其中包括对象空间的分配和释放。

对象空间的分配:使用 new 关键字创建对象即可

对象空间的释放:将对象赋值 null 即可
垃圾回收过程

任何一种垃圾回收算法一般要做两件基本事情:

1. 发现无用的对象

2. 回收无用对象占用的内存空间。

垃圾回收机制保证可以将”无用的对象”进行回收。

无用的对象指的就是没有任何变量引用该对象。Java 的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。
垃圾回收相关算法

引用计数法

堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,而当指向该对象的引用失效时(引用变为 null),引用计数器减 1,最后如果该对象的引用计算器的值为 0 时,则 Java 垃圾回收器会认为该对象是

无用对象并对其进行回收。优点是算法简单,缺点是”循环引用的无用对象”无法别识别。

this 关键字

java--面向对象基础

普通方法中,this 总是指向调用该方法的对象。
构造方法中,this 总是指向正要初始化的对象。

this()调用重载的构造方法 ,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句 。
this 不能用于 static 方法中。
this 是作为普通方法的”隐式参数” ,由系统传入到方法中。

this的用法详解

&#xA0;public class TestThis {
    int a, b, c;

    TestThis() {
        System.out.println("&#x6B63;&#x8981;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;Hello&#x5BF9;&#x8C61;");
    }

    TestThis(int a, int b) {
        // TestThis(); //&#x8FD9;&#x6837;&#x662F;&#x65E0;&#x6CD5;&#x8C03;&#x7528;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#x7684;&#xFF01;
        this(); // &#x8C03;&#x7528;&#x65E0;&#x53C2;&#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x4E14;&#x5FC5;&#x987B;&#x4F4D;&#x4E8E;&#x7B2C;&#x4E00;&#x884C;&#xFF01;
        a = a;// &#x8FD9;&#x91CC;&#x90FD;&#x662F;&#x6307;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x800C;&#x4E0D;&#x662F;&#x6210;&#x5458;&#x53D8;&#x91CF;
        // &#x8FD9;&#x6837;&#x5C31;&#x533A;&#x5206;&#x4E86;&#x6210;&#x5458;&#x53D8;&#x91CF;&#x548C;&#x5C40;&#x90E8;&#x53D8;&#x91CF;. &#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5360;&#x4E86;this&#x4F7F;&#x7528;&#x60C5;&#x51B5;&#x5927;&#x591A;&#x6570;&#xFF01;
        this.a = a;
        this.b = b;
    }

    TestThis(int a, int b, int c) {
        this(a, b); // &#x8C03;&#x7528;&#x5E26;&#x53C2;&#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x4E14;&#x5FC5;&#x987B;&#x4F4D;&#x4E8E;&#x7B2C;&#x4E00;&#x884C;&#xFF01;
        this.c = c;
    }

    void sing() {
    }

    void eat() {
        this.sing(); // &#x8C03;&#x7528;&#x672C;&#x7C7B;&#x4E2D;&#x7684;sing();
        System.out.println("&#x4F60;&#x5988;&#x5988;&#x558A;&#x4F60;&#x56DE;&#x5BB6;&#x5403;&#x996D;&#xFF01;");
    }

    public static void main(String[] args) {
        TestThis hi = new TestThis(2, 3);
        hi.eat();
    }
}

this内存原理

注意 :this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象

java--面向对象基础

java--面向对象基础

static 关键字

静态变量/静态方法生命周期和类相同,在整个程序执行期间都有效。它有如下特点:

为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化。

static 变量只有一份。

一般用”类名.类变量/方法”来调用。

在 static 方法中不可直接访问非 static 的成员。

static 关键字的使用

&#xA0;public class TestStatic {
    int id; // id
    String name; // &#x8D26;&#x6237;&#x540D;
    String pwd; // &#x5BC6;&#x7801;
    static String company = "&#x5317;&#x4EAC;xxx"; // &#x516C;&#x53F8;&#x540D;&#x79F0;

    public TestStatic(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public void login() {
        System.out.println(name);
    }

    public static void printCompany() {
        // login();//&#x8C03;&#x7528;&#x975E;&#x9759;&#x6001;&#x6210;&#x5458;&#xFF0C;&#x7F16;&#x8BD1;&#x5C31;&#x4F1A;&#x62A5;&#x9519;
        System.out.println(company);
    }

    public static void main(String[] args) {
        TestStatic u = new TestStatic(101, "&#x9AD8;xx");
        TestStatic.printCompany();
        TestStatic.company = "&#x5317;&#x4EAC;&#x963F;&#x91CC;";
        TestStatic.printCompany();
    }
}

java--面向对象基础
静态初始化块

构造方法用于对象的普通属性初始化。

静态初始化块,用于类的初始化操作,初始化静态属性。

在静态初始化块中不能直接访问非 static 成员。

static 静态初始化块

&#xA0;public class TestStatic2 {
    static String company; // &#x516C;&#x53F8;&#x540D;&#x79F0;
    static {
        System.out.println("&#x6267;&#x884C;&#x7C7B;&#x7684;&#x521D;&#x59CB;&#x5316;&#x5DE5;&#x4F5C;");
        company = "&#x5317;&#x4EAC;xxx";
        printCompany();
    }

    public static void printCompany() {
        System.out.println(company);
    }

    public static void main(String[] args) {
    }
}

java--面向对象基础

包机制(package、import)

包(package)相当于文件夹对于文件的作用。用于管理类、用于解决类的重名问题。
package 的使用有两个要点

  1. 通常是类的第一句非注释性语句。

  2. 包名:域名倒着写即可,便于内部管理类。

com.oracle.test;
com.itbaizhan.gao.test;
com.itbaizhan.gao.view;

java--面向对象基础

如果要使用其他包的类,需使用 import,从而在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。

Java 会默认导入 java.lang 包下所有的类,因此这些类我们可以直接使用。
如果导入两个同名的类,只能用包名+类名来显示调用相关类:
java.util.Date date = new java.util.Date()
静态导入

静态导入(static import): 其作用是用于导入指定类的静态属性和静态方法,这样我们可以直接使用静态属性和静态方法。

静态导入的使用

&#xA0;package com.itbaizhan;

import static java.lang.Math.*;//&#x5BFC;&#x5165;Math&#x7C7B;&#x7684;&#x6240;&#x6709;&#x9759;&#x6001;&#x5C5E;&#x6027;
import static java.lang.Math.PI;//&#x5BFC;&#x5165;Math&#x7C7B;&#x7684;PI&#x5C5E;&#x6027;

public class Test2 {
    public static void main(String[] args) {
        System.out.println(PI);
        System.out.println(random());
    }
}

Original: https://www.cnblogs.com/e-link/p/16703205.html
Author: link-零
Title: java–面向对象基础

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615923/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • liunx配置nginx命令

    Original: https://www.cnblogs.com/ghjbk/p/11792046.htmlAuthor: ノGHJTitle: liunx配置nginx命令

    Java 2023年5月30日
    070
  • 通过宿主主机访问部署在虚拟机上的网站

    网站部署在笔记本的虚拟机(CentOS 6.8)上,虚拟机通过桥接的方式联网,网站开启成功,在虚拟机上可以打开,但是在宿主的浏览器打不开,后面百度一下发现是虚拟机的防火墙导致的。关…

    Java 2023年5月30日
    068
  • MyBatis实现动态排序方法

    问题: MyBatis想实现动态排序,即自己传排序字段以及排序方式,但是按正常传参会导致查询失败。 因为上面的sql会被处理成如下,即参数会被加上引号当字符串处理。 解决方法: 使…

    Java 2023年5月30日
    072
  • 用了这跨操作系统远控软件,我再也不出差了

    远程调试的困境 对于IOT终端产品开发来说,调试有很多问题,无法复现产品的问题、无法查看出问题当时的log、需要指导用户进行tar包升级,无法查看远程设备状态。有的时候需要一边调试…

    Java 2023年6月15日
    088
  • JVM 学习笔记之动手编译JDK【一】

    动手编译 JDK 以下编译的版本是 JDK13,环境为 Deepin15.11 一、下载源码 第一种方式: Mercurial 版本控制获取源码,下载速度极慢(不推荐) 1.1 安…

    Java 2023年6月5日
    0103
  • Spring Boot入门系列(十六)使用pagehelper实现分页功能

    一、pagehelper介绍 pageHelper是一款非常简单、易用的分页插件,它能很好的集成在spring boot中。它是一个基于mybatis的一款插件,所以我们在使用它时…

    Java 2023年5月30日
    094
  • 新一代分布式实时流处理引擎Flink入门实战操作篇

    @ 安装部署 安装方式 Local(Standalone 单机部署) Standalone部署 Standalone HA部署 Flink On Yarn演示案例 概述 会话(Se…

    Java 2023年6月5日
    062
  • vue找不到页面自定义404页面

    在vue项目中,如果不做路由处理的话,用户可以直接在url随意输入跳转页面, 默认的时候我们是并没有什么处理。 现在需要做一个自定义的404找不到页面的处理方式。 1.在route…

    Java 2023年6月14日
    068
  • webstrome注册码 时间到 2020.6.20

    AHD9079DKZ-eyJsaWNlbnNlSWQiOiJBSEQ5MDc5REtaIiwibGljZW5zZWVOYW1lIjoiSmV0IEdyb3VwcyIsImFzc2l…

    Java 2023年6月8日
    084
  • 一次IOS通知推送问题排查全过程

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 发现问题 在上周一个将要下班的夜晚,测试突然和我打招呼,说IOS推送的修复更新上线后存在问题,后台报…

    Java 2023年6月7日
    091
  • Nginx核心知识100讲学习笔记(陶辉)Nginx架构基础(三)

    一、Nginx如何通过连接池处理网络请求 1、连接池 1、预分配的connections_n 个链接 bash;gutter:true; http://nginx.org/en/d…

    Java 2023年5月30日
    082
  • java —— 异步任务失败后处理

    场景: 实际项目中,程序操作出了问题,后续要怎么处理是个很重要的问题,如果这个问题是同步操作引起的解决起来比较简单,比如用户注册,如果系统注册失败,后台可以马上返回错误信息,用户也…

    Java 2023年5月29日
    080
  • 故事篇:终于给老婆讲明白什么是logback了!

    故事会迟到,但他从不会缺席。今天的故事开始了,你准备好了吗? 前奏 简单介绍一下我的老婆:集智慧与美貌于一身的女子——阿狸,一句”我们心有灵犀,不是吗?”让…

    Java 2023年6月5日
    097
  • 数据库篇:mysql日志类型之 redo、undo、binlog

    前言 可以说mysql的多数特性都是围绕日志文件实现,而其中最重要的有以下三种 redo 日志 undo 日志 binlog 日志 关注公众号,一起交流;微信搜一搜: 潜行前行 1…

    Java 2023年6月5日
    075
  • 7、System类

    exit 退出当前程序 System.out.println("ok1"); //1. exit(0) 表示程序退出 //2. 0 表示一个状态,正常的状态 S…

    Java 2023年6月7日
    079
  • Mybatis中jdbcType和javaType的对应关系

    JDBC Type Java Type 2 CHAR String 3 VARCHAR String 4 LONGVARCHAR String 5 NUMERIC java.mat…

    Java 2023年5月29日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球