类和对象
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、静态方法中不能使用this、super关键字
因为静态成员先于对象存在,所以静态方法中不能使用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.