> 技术文档 > 面向对象(学java的同学一起加油)

面向对象(学java的同学一起加油)

重新开始得第5天

1.什么是面向对象

面向对象是一种程序设计方法,他的基本思想是万物皆对象,他把一个实物的所有属性抽象成一个对象,然后调用这个对象的行为来完成相应的功能。

2.类的定义

[访问权限修饰符] class 类名{     成员变量         成员方法     }
  1. 访问权限修饰词:

    *.java`源文件里定义的普通类,修饰词只能是public或者默认的

  2. 类名:大驼峰命名法

  3. 成员变量:

    用来描述对象的共同特征,也就是状态数据

    格式,即变量的声明

  4. 成员方法:

    用来描述对象的共同的行为, 或者用来操作状态数据

    指的都是不带static修饰的方法

3.引用变量,为什么叫引用变量?

因为引用变量里存储的不是对象,而是对象在内存中的地址信息。 也就是引用通过地址信息指向对象。 取代了面向过程中的指针。

4.静态和非静态

  1. static修饰的属性,叫做静态属性;

  2. static修饰的方法,叫做静态方法

  3. 没有static修饰的属性,叫非静态属性,也叫成员变量

  4. 没有static修饰的方法,叫非静态方法,也叫成员方法

static修饰的属性和方法,都是属于类的,需要使用类名调用。非static修饰的属性和方法,是属于对象的,通常使用引用变量来调用。

注意:静态方法中,只能直接访问本类中的静态成员。不能访问非静态成员非静态方法中,可以访问本类中的非静态成员和静态成员

5.this关键字

在一个类的非静态方法中(成员方法)中,使用this代表当前对象因为实例方法(成员方法)需要使用对象调用,哪个对象调用这个方法, this就是谁。

6.什么是构造方法和普通方法的区别?

构造方法,是为了在实例化一个对象的同时,给这个对象的某些属性进行初始化的 赋值操作。

构造方法和普通方法的区别

1.语法不同,没有返回值,方法名和类名相同,构造方法不能使用static修饰。

2.执行时机不同,普通方法,可以随时调用,随时执行。构造方法是在实例化对象的时候调用执行的,只执行一次。new关键字调用的。

3.构造方法可以重载

1.参数类型列表不同即可

2.如果程序员在定义类时,没有提供任何构造器,系统会自动提供一个无参数构造器

3.一旦程序员自己提供了构造器,系统不在自动提供无参构造器,如果想要,需要程序员自己定义无参构造器

**注意事项**​1、在调用构造方法的时候, this()语句必须在第一行,前面不能加任何的语句。​2 、在进行构造方法的调用的时候,不要出现循环调用。

7.null和NullPointerException

null:

-1. 引用类型的默认值。 表示引用变量里的地址被清空,即没有对象的地址信息

 String str = null;​ Person p = null;

NullPointerExcedption:

-1. 空指针异常, 运行时发生的

-2. 变量里没有地址信息,确使用变量来访问对象的成员。就会发生该异常

  1. JVM内存管理机制

Java代码被编译器编译成字节码之后,JVM开辟一片内存空间(也叫运行时数据区),通过类加载器加载到运行时数据区来存储程序执行期间需要用到的数据和相关信息,在这个数据区中,它由以下几部分组成:

虚拟机栈,堆,程序计数器,方法区,本地方法栈

1.虚拟机栈

虚拟机栈是Java方法执行的内存模型,栈中存放着栈帧,,栈是线程私有的,也就是线程之间的栈是隔离的;当程序中某个线程开始执行一个方法时就会相应的创建一个栈帧并且入栈(位于栈顶),在方法结束后,栈帧出栈。

每个栈帧中包括:

  1. 局部变量表:用来存储方法中的局部变量(非静态变量、函数形参)。当变量为基本数据类型时,直接存储值,当变量为引用类型时,存储的是指向具体对象的引用。

  2. 操作数栈:Java虚拟机的解释执行引擎被称为\"基于栈的执行引擎\",其中所指的栈就是指操作数栈。

2.堆

是java对象运行时内存区域,堆是用来存储对象本身和数组的,在JVM中只有一个堆,因此,堆是被所有线程共享的。

从jdk1.7开始,字符串常量池在堆中。

3.方法区

方法区是一块所有线程共享的内存逻辑区域,在JVM中只有一个方法区,用来存储一些线程可共享的内容,它是线程安全的,多个线程同时访问方法区中同一个内容时,只能有一个线程装载该数据,其它线程只能等待。

方法区可存储的内容有:类的全路径名、类的直接超类的权全限定名、类的访问修饰符、类的类型(类或接口)、类的直接接口全限定名的有序列表、运行时常量池(字段,方法信息,静态变量,类型引用(class))等。

3.程序计数器

线程私有的,用于指示下条将要被执行的字节码指令位置。

4.本地方法栈

存放本地方法的参数和局部变量,通过本地方法栈调用本地方法。这些本地方法一般是C/C++实现的,效率更高。

5.运行时常量池

先是方法区的一部分,后是元空间的部分,主要存储字面量和符号引用常量。

10基本类型的变量和引用类型的变量的区别

基本类型的变量在栈中直接存取的时数据值,引用变量存取的是对象在堆中的地址。

11.this和this()的区别

this指的是this代表当前对象,

this() 用于在当前类的构造方法中调用另一个构造方法(构造方法重载)

  • 必须是构造方法中的第一条语句

  • 用于减少代码重复

  • 只能在构造方法中使用

12.什么是方法的重载

它允许在同一个类中定义多个同名但参数不同的方法。

13.请介绍一下jvm内存中的堆、栈、方法区的作用

堆 :是java对象运行时的内存区域,存储的是对象数组等。

栈:栈存放的是栈帧,栈帧存放的是,局部变量,操作数栈,版本号等,栈是线程私有的,线程间不可相互访问,每调用一方法就会对应一个栈帧,之后弹出。

方法区:方法区是内存区域共享的,是线程安全的,多个线程同时访问时,只有一个线程进行装载,其他线程等待,存储内容是.class文件被加载并解析后的运行时数据结构,如类名,静态数据。

14.java代码在jvm中执行过程

package com.youcai.day01._07JVM;​public class Emp {   String name;   int age;   public Emp(){}   public Emp(String name, int age) {       this.name = name;       this.age = age;   }   public int work1(int a,int b,int c){       int r = a + b;       int s = r * 7 +c;       return s;   }   public String toString(){       return \"[\"+name + \",\" + age+\"]\";   }   public static void main(String[] args) {       Emp e1 = new Emp(\"michael\",32);       int result = e1.work1(1,2,3);       System.out.println(result);   }}
package com.youcai.day01._07JVM;​import java.util.Arrays;​public class Company {   String name;   Emp[] emps;   public Company(){}   public Company(String name) {       this.name = name;       this.emps = new Emp[3];   }   public String toString(){       return name+\",\"+ Arrays.toString(emps);   }   public static void main(String[] args) {       Company c1 = new Company(\"佑才科技有限公司\");       c1.emps[0] = new Emp(\"michael\",18);       c1.emps[1] = new Emp(\"lucy\",18);       c1.emps[2] = new Emp(\"lily\",18);       System.out.println(c1);   }}

15.值传递和地址传递

值传递:基本数据类型之间的赋值操作(本质是值的副本传递)。

地址传递: 引用数据类型之间的变量的赋值操作(本质是地址的副本传递)

在Java中所有的参数传递,不管基本类型还是引用类型,都是值传递,或者说是副本传递。

什么是引用传递

  • 引用传递(如 C++ 的 &)允许方法直接修改原始变量的引用(即让原始变量指向新对象)。

什么是值传递

  • 传递的是变量的副本(原始值的拷贝),方法内对参数的修改不会影响原始变量