> 文档中心 > Java基础-面向对象

Java基础-面向对象


面向对象的一些概念

1、类是什么?

(你是如何认知周边的事物的?)

类就是一类具有相同或者相似的特征和行为的事物的抽象描述。

说明:类就是抽象事物的总称,我们对周围的事物认识就是分类识别,类有属性(特征)和方法(行为)

2、对象是什么?

“万物皆对象”。对象就是一个类型的具体存在的实例。

说明:对象是我们在程序中定义的一个实例化对象,new 一个对象就可以调用这个对象相应的方法。

3、类和对象是什么关系?

类是一个抽象的描述,对象是根据类创建的实例

说明:一个类可以包含很多创建的对象,类是一个比较抽象的概念,而对象是一个具体的实例,对象通常是包含在类中的

4、数据类型

基本数据类型 byte,short,int,long,char,float,double,boolean

引用类型:String , 数组以及我们申明的所有自定义类型。

说明

数据类型分为八大基本数据类型和引用数据类型:

基本数据类型:int char short long boolean float double byte
引用类型: 除了基本数据类型其他都是引用数据类型(string,自定义的类型USB usb = new Usb())

5、基本类型和引用类型在内存中的情况

所有的基本类型它的引用和值都是存储在方法栈中的。

所有的引用类型在栈中存储的只是引用和地址。具体的数据是存储在堆中。

Java基础-面向对象

说明

基本类型:引用和值都存放在方法栈中

引用类型:栈中存放地址,堆中存放具体的数据

当我们创建一个对象时,一般在栈中存放对象的地址(比如0x123456),而在堆中就是开辟新的空间(用来放相应的成员变量和方法)

6、什么是赋值?

所谓赋值就是将这个引用栈中的内容复制一份给另外一个引用。所以基本类型赋值就是将具体的值拷贝一份赋值,引用类型赋值就是将地址拷贝一份赋值。

说明

基本类型:就是将值复制一份

引用类型:赋值就是将这个对象在栈中的内存地址复制一份给另一个对象。

7、…private

任何一个成员,被private修饰之后,这个成员就只能在当前类中使用,不能在任何其他地方使用。

说明:private关键字属于私有成员变量,只能在当前类中使用。

8、成员变量的默认值

所有的成员变量都是有默认值的。

成员变量的默认值和数组的默认值一致:

所有的整数类型都是 0或者0L。 float是0.0F 。double是0.0。 char是空字符\u000 。 boolean是 false。 其他类型全部都是null。

说明:

成员变量有默认值,

所有整数类型是0/0L,

float类型是0.0f,

double类型是0.0,

char字符是\u000,

boolean类型是false,

其他类型是null

9、方法重载

我们可以在一个类中定义同名的方法,通过不同的参数类区分这些方法,在调用的时候,JVM会根据传入的参数自动调用对应的方法。

方法重载是在同一个类中,同名,但是参数不同的方法。

所谓参数不同,有三种情况:

  • 参数的类型不同。—
  • 参数的个数不同。—
  • 参数的顺序不同。—

方法重载和方法的返回值无关。

与访问修饰符无关: 访问修饰符不同,不构成重载

与返回值类型无关:返回值类型不同,也不构成重载

静态方法和非静态方法之间的情况不能“构成”重载

说明:方法重载的含义:重载就是在一个共同类中,修饰符,返回值类型,方法名(可以相同)参数列表不同的,就成为方法的重载,

参数列表不同就是说:参数类型不同,参数个数不同,参数的顺序位置不同

10、构造方法

在每一个类中都有构造方法,构造方法就是用来创建这个类的对象的。

构造方法的要求:

  • 构造方法的方法名和类名完全一致。
  • 构造方法没有返回值。也不能写void。

和访问修饰符无关,和参数无关。

说明

构造方法:在同一个类中的构造方法就是,构造方法的方法名必须与本类中的类名一致

分为有参构造(全参)和无参数构造(默认的构造方法)

构造方法没有返回值,也不能为void

11、默认构造方法

如果一个类没有显式的指定构造方法(所谓显式指定,就是手动写了构造方法),编译器会默认给这个类增加一个无参数的,public的构造方法。

如果一个类显式的指定了构造方法,那么编译器就不会再给默认的构造方法了。

说明

情况一:当自己手写指定的构造方法时,称为显式的构造方法,那么编译器就不会添加默认的构造方法了。

情况二:当没有指定构造方法时,系统会默认给这个类增加一个默认无参数的构造方法。

12、this关键字

this表示当前对象。 在构造方法中有两种情况,第一种情况就是表示当前对象。第二种情况就是表示调用其他的的构造方法。

当使用this调用其他构造方法的时候:必须写在当前的构造方法的第一行。

说明

this关键字:

1、指向类本身的当前对象

2、谁调用this关键字,this就代表谁

13、类继承

在java中继承发生在两个类之间或者两个接口之间。比如A类继承了B类,A类会自动拥有B类的财富(属性和方法)。

继承者称之为子类,被继承者称之为父类或者基类。

父类只能有一个。 这个概念其实就是java中但继承的概念。

所谓单继承就是:任何一个类最多只能有一个直接父类。 但是一个父类可以有多个子类。

说明

类继承:关于父子类中的关系,一个父类可以有多个子类,一个子类只能有一个父类,称为类继承。而当子类继承父类时,就继承了父类中的属性和方法,同时子类可以扩展本身的特征跟行为。

父子类转换问题:

子类转为父类成为向上转型,直接转换Animal a = new dog();

父类转向子类时,称为向下转型;需要强制类型转换。(由于父类满足不了子类的需求,)

14、继承中的构造方法问题

在类的继承中,构造方法是不能继承的。

任何一个类的默认的构造方法中都默认的调用类父类的无参数的构造方法

当在子类的构造方法中使用super调用父类的构造方法时。必须写在第一行。

说明:

1、子类继承了父类时,可以使用super关键字来调用父类的构造方法。

2、当父类型为抽象类时,子类继承父类,子类就必须实现父类的方法。

3、接口中的方法(抽象类),被子类继承时,子类就是实现父类的方法

15、不能继承的情况

所有的父类的私有的成员,在子类中都是不能直接使用的。表面上来看就是没有继承。

本质上来说,静态方法和成员你是不能被字了继承的。但是我们可以使用子类的类名或者对象直接调用父类的静态方法。 但是这种用法是不规范的。

说明:

当类中使用了private修饰符修饰时,就表示只能在本类中使用。

不规范的用法:使用子类的类名或者对象调用父类的静态方法

16、父子类之间的类型转换

任何需要父类的地方,都可以使用子类代替。

子类对象赋值给父类引用,不需要类型转换。

父类对象赋值给子类引用,需要强制类型转换,如果父类对象本身不是子类的实例会出现类型转换异常。

说明:父子类之间的相互转换关系

17、方法重写

所谓方法重写就是在子类中重新定义父类的方法

要求子类中的方法的名称,参数列表必须和父类的一致。访问修饰符应该大于等于父类访问修饰符范围。返回值类型要和父类一致或者是父类方法返回值类型的子类。

方法重写是实现多态的基本要求。

说明

方法重写:子类继承了父类,重写父类的方法。

1、子类中的方法名和参数列表必须和父类型一致,

2、访问修饰符要大于等于父类的访问修饰符。

3、返回值类型要和父类一致,或者是父类型返回值类型的子类

18、super关键字

super关键在子类中使用

super在子类中可以表示父类对象,当super作为父类对象使用的时候,可以调用父类被覆盖的方法或者没有被覆盖的方法。但是不能调用父类私有的任何成员。

super还可以在子类的构造方法中调用父类的构造方法, 当super用来调用父类的构造方法的时候,必须写在子类构造方法的第一行。

说明:使用super关键字,就是当子类继承了父类时,可以使用super关键字调用父类的构造方法,而且要放在子类型构造方法的第一行。

19、java中的四中访问修饰符

访问修饰符 可访问范围
public 可以在任何位置访问
protected 可以在当前包和子孙类中访问
default 可以在当前包中访问
private 只能在当前类中访问

说明

java中的四种修饰符:

public:公有属性,设置之后,任何其他位置都可以访问

private: 私有属性,在本类中访问(使用)

protected: 在当前包中,及其子孙包访问

default: 在当前包中访问

20、多态

所谓同一种类型的不同的表现形态,就是我们将不同的子类对象当作父类来看,这时这些对象表现的是子类本身的形态。

多态产生的条件就是:第一要继承(实现),第二要重写方法。

我们一般所说的多态都是运行时多态。

有时我们也会将方法重载称之为静态多态。

多态可以提高程序的可扩展性。

说明

多态:本意是同一种类型可以有多种形态,比如Animal a = new Dog();可以new多个子类对象就体现了多态。

多态又称为运行时多态。

特点:多态可以提高程序的可扩展性

21、static修饰符

static修饰符可以修饰:成员变量,方法,成员内部类,静态代码块。

static修饰的成员可以使用类名直接调用。

static修饰的任何成员都是属于类的。不是属于某一个对象的。所以才可以使用类名直接调用,当然了也可以使用对象调用,但是这种方式是不合理。

在任何的静块(方法)中都不能使用非静态的任何引用。

说明

static 修饰符:

1、static可以修饰成员变量,方法,成员内部类,静态代码块

2、static修饰的成员可以使用类名直接调用,static修饰的成员都是属于类的,不属于某一个对象。

3、static在静态代码块中都不能使用非静态的引用。

22、final修饰符

final修饰符表示是最终的。

  • final修饰的变量必须在申明的同时赋值,而且不能被重新赋值。final修饰的量一般都是常量。
  • final修饰的方法不能被子类重写。
  • final修饰的类不能被继承。默认情况下final修饰的类中的所的方法都是final的。

说明

final修饰符:常量修饰符,定义时用来修饰变量的,固定不变的量

final:在申明时必须同时赋值,并且不能被重新赋值。

final:修饰的类不能被继承,默认情况下final修饰的类中的所有方法都是final

23、抽象类

抽象类是使用abstract修饰的。

抽象类不能实例化对象。

抽象类中可以定义抽象方法和非抽象方法。

抽象类就是为了让其他的类来继承。

抽象类可以继承非抽象类。

当一个类继承了抽象类之后,这个类必须实现抽象类中的抽象方法。当然如果这个子类也是抽象,就可以选择不实现。

说明

抽象类:

抽象类使用abstract修饰(public abstract class Student{})

抽象类不可以实例化对象(不可以创建这个对象)

抽象类的定义就是为了让其他类来继承使用的;里面的属性和方法都是抽象的,其子类继承父类时,要实现抽象方法。如果这个类也是抽象类,那么可以选择不实现父类的方法。

抽象类可以继承非抽象类

24、抽象方法

抽象方法是必须使用abstract修饰的。

抽象方法必须写在抽象类或者接口中。

抽象方法是没有方法体的。

抽象方法不能使用static或者final修饰。

说明

抽象方法:public abstract Student();(使用abstract修饰的类为抽象类,使用abstract修饰的方法为抽象方法)

在抽象类中定义的方法可以是抽象方法或普通方法

public abstract class Student {    public Student() {//定义普通的方法 或 成员变量    }}

抽象方法:

抽象方法没有方法体;一旦该类中声明了抽象方法,那么该类就必须声明为抽象类

抽象类中可以没有抽象方法;

public abstract class Student {    abstract void person();}

25、ArrayList

ArrayList底层使用数组实现。

使用无参数的构造创建的ArrayList,在创建初期内部只是一个空数组,只有当放入第一个元素的时候才会创建一个容量为10的数组。(构造一个空数组 初始容量为 10

当ArrayList中元素个数和容量相同时,再添加元素就会扩容,扩容为之前的1.5倍。(当元素个数大于空间容量是会自动扩容)

扩容会创建新的数组,所以扩容是比较好资源的,如果对ArrayList有大量而频繁的增删改操作建议使用LinkedList

说明

ArrayList数组:可以new一个集合数组

ArrayList a = new ArrayList();

ArrayList person = new ArrayList();//泛型集合数组

ArrayList底层使用数组实现(查询快,根据数组下标查询,而增删改查慢)

LinkedList底层使用链表实现(增删改快,查询慢(从头链表开始查找))

26、String的“”赋值和new String的不同

当使用“”赋值的时候,会首先检查内存中是否已经存在对应的字符串字样,如果存在就直接指向已经存在的字符串,如果不存在才会开辟新的空间存储对应的字符串。

当使用new String()创建String对象的时候,无论如何都会开辟新的空间。

说明

String中的“ ”赋值:

进行赋值时,会先检查内存中是否已经存在字符串,如果已经存在就直接指向存在的字符串,不存在的话就开辟新的内存空间存储对应的字符串。

new String:

new关键字 无论如何都会在内存中开辟一块内存空间

27、String的不可变性

我们常说的String是常量,就是String不可变性,String的不可变性是说String一旦创建存储在内存中的对应的字符序列是不能改变的。但是存储在栈中的引用地址是可以修改的。

说明

String的不可变性:

什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。

一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降

这时我们可以使用字符串生成器StringBuilder。

28、StringBuilder

StringBuilder和StringBuffer都是可以变的字符串。

我们可以通过它们的API直接修改这些对象在内存中存储的对应的字符序列。

说明

StringBuilder和StringBuffer:对字符串进行修改

StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象

StringBuilder 的方法不是线程安全的(不能同步访问),由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder

29、异常

异常由于非合理的操作或者使用导致的程序运行的意外情况。

java中的异常情况体系为:

​ Throwable

Error Exception

Throwable为例外的老祖宗,Error一般是指一些严重的错误导致程序无法继续运行。而Exception就是我们常说的异常,是可以捕获处理,程序可以继续运行的情况。

我们处理异常就是为了让程序继续运行。

Java基础-面向对象

说明:运行时异常都是 RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。

常见的异常:

数组下标越界异常空指针异常类型转换异常SQL语句语法异常OutOfMemoryError 内存不足ArithmeticException (算数运算异常)除数为零

30、处理异常的方法

java中的两种异常处理方式

1、try{可能出现异常的代码}catch(可能出现的异常类型 异常对象){处理异常的代码 }

2、在方法签名的后面使用throws 申明这个方法可能抛出的异常,由方法的调用者处理。

说明

处理异常方法:

①try{

}catch(Exception e){

e.printStack…

}finally{

}//进行处理

②直接抛出的异常 throws (一般都是在类名的后面直接抛出)比如:ArithmeticException,InputMismatchException

以上内容为个人理解,若有不当之处,请多多指教。