面向对象主要体现在3个特性:
1、封装性:它的原则是将不需要对外提供的内容都隐藏起来,把属性都隐藏起来,提供公共方法对其访问。
2、继承:子类可以继承父类的属性和方法,同时又可以自己添加一些特有的属性和方法。
3、多态:有两种意义上的多态,一种是名称上的多态,是指可以操作传递不同信息,以便让对象根据相应的消息来产生一定的行为;一种是和继承有关的多态,是指同一操作被不同对象调用可能产生不同的行为。
有些书上还说抽象也是面向对象的特性。
类是对现实生活中事物的描述;对象是这类事物实实在在存在的个体。
对于类应注意的地方:
1、在一个类中类方法只能调用类方法,但是实例方法既可以调用实例方法也可以调用类方法;类方法只能调用类变量,但实例方法既可以调用实例变量也可以调用类变量,成员变量和成员函数的操作只能放在方法中执行。
2、对于外部类只能由public,abstract修饰修饰,其中用public修饰的类,在一个包中只能有一个,并且类名必须和文件名一致。用abstract修饰的类,是抽象类,可以定义抽象方法,也可以定义普通方法,但是普通类中不可以定义抽象方法。
3、对于内部类,还可以用static修饰符来修饰,因为可以把内部类看成外部类的一个成员函数或变量,在静态函数中不能用this、super语句。(其中的this和super语句只能放在构造函数的第一行,因为初始化动作要先执行,且一个构造函数只能出现this和super中的一个)
static(静态)关键字:
用法:static是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,除了可以被对象调用外,还可以直接被类名调用。
特点:
1、随着类的加载而加载(也就是说静态会随着类的消亡而消亡,生命周期最长)
2、优先于对象存在(静态是先存在的,对象是后存在)
3、被所有对象所共享
4、可以直接被类名所调用
静态和非静态成员的区别:
1、存在位置不同:静态成员加载后存在于方法区(共享区/数据区)中,非静态成员随着对象的建立存在于堆内存中
2、生命周期不同:静态成员生命周期最长,随着类的消失和消失;非静态成员随着对象的消失而消失。
静态使用注意事项:
1、静态方法只能访问静态成员。
2、静态方法中不可以出现this、super关键字,因为静态优先于对象存在。
3、主函数是静态的。
4、方法中的变量是不能被static修饰的,因为方法中的变量都是局部变量。
静态的利与弊:
利处:对象共享数据,进行单独存储,节省空间。
弊端:生命周期过长,访问出现局限性。(看静态注意事项)
什么时候使用静态:
因为静态修饰的内容有成员函数和变量因此可以从两个放面下手:
1、什么时候定义静态变量?
当对象出现共享数据是,该数据可以被静态所修饰
2、什么时候定义静态函数?
当功能函数中没有非静态数据时可以用静态修饰
静态的应用:
通常工具类中的方法都是静态的
扩充:对于工具类中的构造函数可以私有化,防止创建新对象占用堆内存,浪费空间
静态代码块:
格式:
static {
静态代码块中的执行语句;
}
特点:随着类的加载而执行,只执行一次,用于给类初始化(一般不用)
public class practice2 {
public static void main(String[] args) {
new StaticTest().print();
new StaticTest().print();
}
}
class StaticTest{
static{//静态代码块
System.out.println("zjd");
}
public void print(){
System.out.println("123");
}
}
对于这个程序执行的结果为zjd 123 123 可以看出静态代码块只执行一次
构造代码块:
格式:
{
执行语句;
}
特点:用于给对象初始化的;
在程序运行中各部分执行的先后顺序为:
对于单个类:
静态变量或静态代码块--->实例变量或构造代码块---->构造函数(其中静态变量和静态代码块优先级是一样的,谁在前面谁先加载,实例变量和构造代码块优先级也是一样的)
对于有父类的时候:
父类的静态变量或父类的静态代码块---->子类的静态变量或子类的静态代码块--->父类中的实例变量或构造代码块--->父类中的构造函数---->子类中的实例变量或构造代码块--->子类中的构造函数
匿名对象:
当调用对象属性和对象方法没有意义是可以使用匿名对象。
使用方式一:当对象的方法只是用一次的时候可以用匿名对象因为这样写比较简化。
例如B b=new B();b.print();可以替换为new B().print();
使用方法而:可以将匿名对象作为实际参数进行传递。
例如:
class A{ }
class B{
A a;
B(A a){this.a=a;}
}
class C{
public static void main(String[] args){
new B(new A());//将匿名对象当参数传递个B的构造函数,实现代码的简化
}
如果用普通方法那么main数中应写成
A a=new A();
B b=new B(a);
这要比匿名对象复杂不如匿名对象代码简化