类和对象

来源:互联网 发布:管理文件的软件 编辑:程序博客网 时间:2024/06/04 18:41




类和对象

1.类是对现实事物的描述

2.对象是每一类事物实实在在的个体

3.具体对象就是对应在java堆内存中用new建立的实体

4.属性类中的变量  函数即类的中的方法

5.成员变量作用于整个类,局部变量只作用于某个方法或内部类,或语句中

        成员变量和局部变量在内存中的位置:

成员变量:在堆内存中,有类的对象存在,才会有成员变量的存在

    局部变量:存在于栈内存中

匿名对象的应用

1、匿名对象使用方式之一:当对对象的方法只使用一次时,可以使用匿名对象来完成,比较简化,如果对一个对象,使用多次时,必须给对象取一个名字,

2、

匿名对象使用方式二:可以讲匿名对象作为参数传递。

封装(Encapsulation

封装:就是隐藏对象的成员属性和实现细节,仅对外提供公共的访问方式

封装的好处

将变化隔离,提高重用性,提高安全性,便于使用。

原则

将不需要对外提供的内容都隐藏起来

将属性隐藏,提供公共的方法对其访问。

 

关键字:

private:私有。权限修饰符,用于修饰类中的成员(成员属性和成员方法),被修饰的字段和方法只能在本类中使用。

私有仅仅是封装的一种表现形式。

构造函数

1、默认构造函数,当自定义了构造函数,默认构造函数就不会再有作用了,当定义了构造行数,当需要再用默认的构造函数,就需要明确指定默认的构造函数。

2、构造函数重载:函数名相同,参数列表不同。

3、函数重载就是函数名相同,参数列表不同。

构造代码块

构造代码块的作用:

给对象进行初始化

对象一建立就执行,而且优先于构造方法

和构造函数的区别

构造代码块是给所有对象进行统一的初始化

而构造函数是给对应的对象进行初始化

 

构造代码块中定义的不同对象具有共性的初始化内容

this

this就代表本类对象

this代表它所在函数所属对象的引用

也就是说哪个对象在调用this所属函数,this就代表哪个对象

this的应用:当定义类的功能时,在函数内部要调用本类对象时,这时就用this来表示本对象

this语句

 

this()

 this();

this语句:用构造函数之间相互调用。

This语句作用必须定义在构造函数的第一行,因为初始化要先执行。

 

Static

静态:static

用法:是一个修饰符,用来修饰成员变量和成员方法

当成员变量被静态修饰后,它就多了一个调用方法

除了对象调用外,还可以直接用类名调用:类名.静态成员名;

Static特点:

1.随着类的加载而加载,(随着类的存在而存在,消失而消失,它生命周期最长)

2.优先于对象存在(静态成员先存在,对象是后存在)

3.被所有对象所共享

4.可以直接被类名调用

 

实例变量和类变量(静态变量)的区别:

1、存放位置:

类变量随着类的加载,而存在方法区中

实例变量随着对象的建立而存在堆内存中

2、生命周期

类变量的生命周期最长,随类的消失而消失

实例变量的生命周期,随对象的消失而消失

 

静态是使用注意事项

1、静态方法只能访问静态成员,非静态方法可以访问静态成员

2、静态方法中不能使用thissuper关键字

因为静态成员先于对象存在,所以静态方法中不能使用this super

静态的利弊:

利:对对象的数据共享进行单独空间的储存,节省空间,没必要每个对象中都储存一份;

可以直接用类名调用。

弊:生命周期过长

访问出现局限性(静态只能访问静态)。

什么时候使用static修饰成员变量(类变量)

当对象中出现共享数据时,该数据的变量成员可以用静态修饰;

对象中特有的数据要定义成非静态存在于堆内存中。

什么时候定义静态函数(静态方法)

当函数内部没有访问到非静态数据(对象特有数据)时

那么该函数可以设计成静态的;

Static代码块

静态代码块和类一起加载;

 

 

Person  p = new person(zhangshan,20);

这句话都做了什么事情

 

1、因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。

2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化;

3、在堆内存中开辟空间,分配地址;

4、在堆内存中建立对象的特有属性,并进行默认初始化;

5、对属性进行显示初始化;

6、对对象进行构造代码块初始化;

7、对对象进行对应的构造函数初始化;

8、将内存地址赋给栈内存中的p变量。

                       设计模式

设计模式:解决某一类问题最行之有效的方法;23中设计模式

 

 继承

1、在java语言中,只支持单继承;不支持多继承。

2、因为多继承容易带来安全隐患:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个。

但是java保留啦这种机制。并用另一种体现形式来完成:多实现;

 

Java支持多层继承。也就是一个继承体系。(一个子类只能有一个父类,不能有多个父类)

 

 覆盖(重写)

2、子父类中的函数

当子类中出现和父类一模一样的函数时,当子类对形象调用该函数时,会运行子类函数的内容。如同父类的函数被覆盖一样。

这种情况是函数的另一个特性:重写(也叫覆盖);

 

当子类继承啦父类,沿袭了父类的功能;到子类中,但是子类虽具备该功能,但是功能的内容却和父类中的方法内容不一致,这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,重新定义功能内容。

 

3、子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。

4、静态只能覆盖静态。

5、 重载:只看同名函数的参数列表。

重写:字父类方法要一模一样。

子父类中构造函数的特点

1、在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句,super();super()会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();

2、为什么子类一定要访问父类中的构造函数?

因为父类中的数据子类可以直接获取,所以子类在对象建立时,需要先查看父类是如何对数据进行初始化的,所以子类在对象初始化时,要先访问以下父类中的构造函数,

如果要访问父类中指定的构造函数,可以通过手动定义super()语句的方式来指定。

3、注意:super()语句一定定义在子类构造函数的第一行;

4、结论:子类中的所有的构造函数,默认都会访问父类中的空参数的够直接函数;

因为子类每一个构造函数内的第一行都会有一句隐式super();

 

当父类中没有空参数的构造函数时,子类必须手动通过super()语句形式来指定要访问父类中的构造函数。

 

当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。

子类中至少会有一个构造函数会访问父类中的构造函数。

final(最终)

继承的弊端:打破了封装性。

 

final:最终,作为一个修饰符

1、可以修饰类,函数,变量。

2、final修饰的类不可以被继承。为了避免被继承,被子类复写功能。

3、final修饰的方法不能被复写。

4、final修饰的变量是一个常量,只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。

5、内部类定义在类中的局部位置上是,只能访问该局部被final的局部变量。

抽象类(abstract class className{}

当多个类中 粗翔相同功能,但是功能主体不同,这时可以进行向上抽取,这时只能抽取功能定义而不抽取功能主体。

abstract class className{

Abstract void study();

}

抽象意思:看不懂

抽象类的特点:

1、抽象方法一定定义在抽象类中;

2、抽象方法 和抽象类都必须被abstract 关键字修饰;

3、抽象类不可以用new创建对象,因为调用抽象方法没有意义。

4、抽象类中的方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用;

5、如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

抽象类中可以有具体的方法实现。

抽象类和一般类没有太大的不同;

 

该如何描述事物就怎么描述事物,该事物出现了一些看不懂的东西,这些不确定的部分,也是事物的功能,需要明确出现,但是无法定义实现,通过抽象来表示。

 

抽象类比一般类多了个抽象函数,抽象类不能实例化。

抽象类中除了定义抽象方法外,还可以定义一般方法。

抽象类中可以不定义抽象方法,作用是不让类实例化。

 

模板设计模式

 

 

 

 

 

接口

1、当接口初期理解:可以是认为是一个特殊的抽象类

当抽象类中的方法都是抽象的,该类可以通过接口的方式来表示

Interface 表示接口

接口里的方法全抽象,

2、接口定义是,格式特点:

1、接口中常见定义:常量和抽象方法

2、接口中 成员都有固定的修饰符

常量:public static final xxxx

方法:接口中的成员都是public的;

3、接口是不可以创建对象的,因为有抽象方法。

需要被子类实现所有的方法,子类对接口中的抽象方法全部覆盖后,子类才可以实例化。

否则子类是一个抽象类。

接口多实现

接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。

 

一个类可以继承一个类并实现多个接口;(a extends b  implements  c, d {}).

 

接口与接口之间的关系支持继承。

 

接口的多实现是指一个类可以实现多个接口;

多态

多态:事物存在的多种体现形态;

1、多态的体现

父类的引用指向了直接的子类对象

父类的引用也可以接受自己的子类类型

2、多态的前提

必须是类与类之间有关系,要么继承要么实现。

通常还有一个前提:存在覆盖;

3、多态的好处

多态的出现大大的提高了代码的扩展性。

4、多态的应用

我们能转换的是父类引用指向了自己的子类对象时,该引用可以被强制转换成子类,

多态自始至终都是子类在做着变化。

5、多态的弊端:

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

在多态中成员函数的特点:

在编译时期:参阅引用型 的变量所属的类中的是否有条用的方法,如果有,编译通过,如果编译通过,在运行时期:参阅对象所属的类中是否有调用的方法。

总结:成员函数在多态调用时,编译看左边(父类),运行看右边(子类)。

在多态中成员变量的特点:

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:无论编译和运行,都参考左边。

 

内部类

定义:当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部类事物在使用外部事物的内容。

内部类的访问规则:

1、内部类可以直接访问外部类中的成员,包括私有。

之所以可以直接方位外部类中的成员,是因为内部类中持有了一个外部类的引用格式 外部类名.this.成员变量名.

2、外部类要访问内部类,必须建立内部类对象.

访问格式:

1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部诶对象。

外部类名.内部类名 变量名 外部类对象。内部类对象;

2、当内部类在成员位置上,就可以被成员修饰符所修饰。

比如private将内部类进行封装。

Static:内部类就具备static的特性。

当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。

在外部其他类中,如何直接访问静态内部类的非静态成员?

New Outer.Inner().function();

在外部其他类中,如何直接访问static内部类的静态成员呢;

Outer.Inner.function();

 

注意:当内部类中定义静态成员,该类必须是静态的;

      当外部类中的静态方法访问内部类时,内部类也必须是静态的;

内部类定义在局部时:

1、不可以被成员修饰符修饰

2、可以直接访问外部类中的成员,因为还持有外部类中的引用,

但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

匿名内部类

1定义:就是内部类的简写格式;

2定义匿名内部类的前提:

内部类必须是继承一个类或者实现接口。

3、匿名内部类的格式: new父类或者接口(){定义子类的内容}

4、其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。

5、匿名内部类中定义的方法最好不超过3个。

Exception

1.自定义异常 在函数中声明,还需要在函数中调用

Throw new XXXXException();

 

Excepion中有一个特殊的子类异常RuntimeException运行是异常。

如果在函数内部抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过。

之所以不用在函数上声明,是因为不需要让调用者处理。

当该异常发生。希望程序停止,因为在运行时,出现了无法继续运算的情况,希望程序停止后,对代码进行修正。

 

自定义异常时:如果该异常的发生,无法再继续进行运算。就让自定义异常继承RuntimeException.

 


 

0 0
原创粉丝点击