------- android培训、java培训、期待与您交流! ---------
面向对象
面向过程:强调的是过程(动作)
面向对象:强调的是对象(实体)
特点:1)面向对象是一种常见思想
2)将复杂问题简单化
3)让曾经在过程中的执行者,变为对象的执行者
类与对象的关系:
类:事物的描述
对象:该对象的实例。
类:对象的蓝图,生成对象的模板,是对一类事物的描述,是抽象的概念上的定义
对象:对象是实际存在的该类事物的每个个体,因而也称为实例
类之间的3种关系?
依赖关系(uses-a)
聚集关系(has-a)
继承关系(is-a)
包实际上就是物理上的文件夹,可以把类放到不同的包中。
把一个类放到包中,需要在类中加上什么语句?
需要加上包声明package语句,必须写在源文件的第一句。
什么时候需要导入类?用什么语句?
当使用的类和当前类并不在同一个包中的时候,用import语句导入。默认包中的类可以导入吗?
不可以,不在默认包中的类无法使用默认包中的类。
java中哪个包中的类是自动导入的?
java.lang包
什么叫做完整类名?
顶层包名.子包名.类名
定义的类其实就是在定义类中的成员,成员就是成员变量和成员函数。
成员变量和局部变量的区别
1) 成员变量定义在类中,整个类中都可以访问,局部变量定义在函数中,语句、局部代码块中,只对所属区域有效
2) 成员变量存在于堆内存的对象中,局部变量存在于栈内存的方法中
3) 成员变量随着对象的创建而存在,随着对象的消失而消失,局部变量随着所属区域而存在,随着区域的结束而释放
4) 成员变量都有初始化值,而局部变量不需要初始化。
类类型的变量一定指向对象,要不就是null。
匿名对象:没有名字的对象,实例new car()其实就是对象的简写格式。当对象对方法仅进行一次调用的时候,就可以简化为匿名对象。匿名对象可以作为实际参数进行传递:Car c1=new Car();show(c1),也可以用匿名对象如show(new car())
匿名对象使用场景: 1:当对方法只进行一次调用的时候,可以使用匿名对象。
2:当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。
基本数据类型参数传递:
引用数据类型参数传递:
封装:隐蔽对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离,便于使用,提高复用性,提高安全性
封装原则:将不需要对外提供的内容都隐蔽起来
把属性对隐蔽,提供公共方法对其访问
构造函数:
特点:1)函数名与类名一致
1) 不定义返回值类型
2) 没有具体的返回值
作用;给对象进行初始化
注意:多个构造函数是以重载的方式存在的。
创建对象都必须要通过构造函数初始化(如果一个类没有定义构造函数,那么该类就会有一个空参构造函数,如果在类中定义了指定的构造函数,那么默认的空构造函数就没有了)
一般函数与构造函数的区别:
1) 构造函数:对象被创建是,就会调用与之对应的构造函数,对对象进行初始化,一般函数是在对象创建时,需要函数功能是才调用
2) 构造函数:对象创建时,会调用一次,一般函数,在对象创建后,可以调用多次。
构造函数中有return语句吗?可以有
This:代表其所在函数所属对象的引用(this代表本类的引用)
This的引用场景:当在函数内需要用到调用该函数对象时,就用this
Static:用于修饰成员(成员函数和成员变量)即使关键字又是修饰符
Static特点
1) 随着类的加载而加载
2) 优先于对象存在
3) 被所用对象所共享
4) 可以直接用类名调用
5) Static修饰的数据是共享数据
Static注意:
1) 静态方法只能访问静态成员(非静态既可以访问静态,可以访问非静态)
2) 静态方法不可以有this、super关键字
实例变量就是成员变量
成员变量与静态变量的区别
1) 两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的被回收而释放,静态变量随着累的加载而存在随着类的消失而消失
2) 调用的方式不同
成员变量被对象调用,静态变量可以被对象调用,还可以被类调用
2) 别名不同
成员变量也成为实例变量,静态变量也成为类变量
3) 储存位置不同
成员变量存储在堆内存的对象中,也叫对象的特优数据
静态变量存储在方法区中的静态区,也成为对象的共享数据
主函数:
特点:格式固定,被jvm所识别和调用
Public(权限必须最大)static(不需要对象)void(没有返回值)main(函数值,固定名字)(String args[](主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型))
静态应用场景
1静态变量 :当分析对象中所具备的成员变量的值相同
这时就用静态修饰。只要数据在对象都是不同的,就是对象的特有数据,必须存储在对象中,如果是相同数据,对象不做修改,只使用,既不需要存储在对象中,这是就用静态的
2静态函数:该函数功能是否有访问到对象的特有数据,
静态代码块:随着类的加载而执行,而且只执行一次
作用:用于给类进行初始化。
————————————————————————
{ }:构造代码块:可以给所有对象进行初始化
构造函数:只给指定的对象初始化
————————————————————————
Person p = new Person(); 创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的
栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。New
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
多态
多态:某一事物的多种行态
多态在代码中的体现:父类或者接口的引用指向其父类的对象
多态的好处:提高了代码的扩展性
多态地弊端:前期定义的内容不能使用后期子类的内容
多态的前提:必须有关系,继承和实现,要有覆盖
类型提升:作用是限制对特定功能的访问,即有些特定功能不能访问
向下转型:作用为了使用子类中的特有方法
注意:对于转型,自始至终都是子类对象在做着类型的转化
Instanceof:用于半段对象的具体类型,只能应用与引用数据类型判断
多态:成员特点
成员变量:
编译时:参考引用型变量所属的类中是否有调用是成员变量,有:编译通过,没有:编译不通过
运行时:参考引用型变量所属的类中是否有调用的成员变量,有:运行该所属类中的成员 简单说:编译和运行都参考=左边
成员函数:编译时:参考引用型变量所属的类中是否有调用的函数 有:编译通过 没有:不同过 运行时:参考的是对象所属的类中是否有调用的函数
简单说:编译看左边,运行看右边
静态函数:编译时:参考引用型变量所属的类中是否有调用的静态方法
运行时:参考引用型变量所属的类中是否有调用的静态方法
简单说:运行编译都看左边
内部类:
讲一个类定义在另一个类中,对里面的类称为内部类
特点:可以直接访问外部类的成员,包括私有成员
而外部类要访问内部类中的成员必须要建立内部类的对象
内部类可以分成几种?
实例内部类:声明在方法外边没有static修饰符
静态内部类:声明在方法外边有static修饰符
局部内部类:声明在方法里边
Class outer{
Private int num=3;
Class Inner //内部类
{
Void show()
{System.out.println(“show run“+num);
}
}
}
Class InnerClassDemo
{ public static void main (String args[])
{
Outer.Inner in=new Outer().Inner();另一个类直接访问外部类中的内部类成员
Outer.Inner in=new Outer .Inner();///如果内部类是静态的,相当于一个歪歪不类
Out.inner.function; 如果内部类是静态的,成员是静态的
}
}
注意:如果内部类定义了静态成员,该内部类也必须是静态的
为什么内部类能直接访问外部类成员
因为内部类持有外部类的引用 外部类.this
内部类可以存放在局部位置上:内部类在局部位置上只能访问局部中被final修饰的局部变量
匿名对象类:就是内部类的简写格式。
简写前提:内部类必须继承或者实现一个外部类或者接口
使用场景:当函数时接口类型是,而且接口的方法不超过三个,可以用匿名内部类作为实际参数进行传递
继承
继承的好处:
1)提高了代码复用性
2)让类与类之间产生了关系,给多态提供了前提
注意:Java中支持单继承,不直接支持多继承,但对c++中的多继承机制进行改良
单继承:一个子类只有一个直接父类,多继承可以有多个直接父类
Java不支持多继承原因:会产生调用的不确定性:
|
|
|
如图:假如类C继承A,B那么如果类C调用show方法,则就不知道会调用类A的show方法还是调用类B的show方法,这样就会产生不确定性。
Java支持多层继承:C继承B,B继承A。就会出现继承体系
当要使用一个继承体系时
1)查看该体系中的顶层类。了解体系的基本功能
2)创建体系中的最子类对象,完成功能的使用。
什么时候定义继承
1) 当类与类之间存在所属关系的时候,就定义继承
注意:当本类成员和局部成员变量同名时用this区分
当子父类的成员变量同名时用super区分父类
在子父类中,成员的特点体现
1)成员变量:当子类与父类成员变量相同;则调用的时候是用的子类的成员变量
2)成员函数:当子函数与父函数相同时,会运行子类函数,这种现象称为覆盖(override)
覆盖注意事项:1)
子类方法覆盖父类方法时,子类权限必须大于等于父类权限
Private修饰的函数不叫覆盖如:private void show()和publicvoid show()不叫覆盖
2)静态只能覆盖静态,或被静态覆盖。
什么时候用覆盖:当对一个类进行子类的扩展时,子类需要保留父类的功能声明但是要定义子类中的该功能的特定内容是就用覆盖
构造函数:为什么在子类构造对象的时候,发现访问子类构造函数时,父类也运行了
因为在子类的构造函数第一行有一个默认的隐式语句,super()
注意:构造函数不能覆盖
如果父类中没定义空参构造函数,那么子类的构造函数必须要super明确要调用父类中的那个构造函数
同时子类构造函数中如果使用了this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义在第一行,所以只能有一个
注意:super语句必须要定义在子类构造函数的第一行,因为父类的初始化动作先完成
Final:是一个修饰符,可以修饰类,方法,变量。
Final修饰的类不能被继承
Final修饰的方法不能被覆盖。
Final修饰的变量是一个常量,只能赋值一次
抽象类的特点;
1)方法只有声明没有实现,该方法时抽象方法,需要abstract修饰抽象方法必须定义抽象类中,该类必须也被abstract修饰
2)抽象类不可以被实例化,因为调用抽象方法没意义
3)抽象类必须有其子类覆盖并实现所有抽象方法后,才可被实例化否则这个类还是抽象类
抽象类中有构造函数用于给子类对象进行实例化
抽象类中可以不定义抽象方法
抽象关键字不能和那些关键字并存啊
Private static final都不行
抽象类和一般类的异同点:
相同点:都用来描述事物,都在内部定义了成员
不同;一般类不能定义抽象方法,只能定义非抽象方法
抽象类可以定义抽象方法,也可以定义非抽象方法
一般类可以被实例化,抽象类不可以被实例化
抽象类一定是父类吗
是的:因为需要子类覆盖方法后才能被实例化
接口:
1) 接口中的成员有什么特点?
数据域必须是(publicstatic final修饰)公有静态常量
方法必须是(publicabstract修饰)公有抽象
没有构造方法
2) 接口能创建对象实例吗?
不能,接口没有构造器,不能创建对象
3) 接口和类的关系?
接口和类之间是实现关系,一个类用implements语句实现了某接口,这个类被称为接口的实现类,一个类可以实现多个接口,一个类实现了某接口,必须覆盖这个接口中的所以方法,否则这个类必须是个抽象类
4) 接口和接口的关系?
接口和接口之间是继承关系,一个接口用extends继承另外一个接口,称为这个接口的子接口。
一个接口可以继承多个父接口
接口中的成员,这些成员都有固定的修饰
全局常量:public static final
抽象方法:public abstract
由此看见:接口中的成员都是公共的权限
类与类之间是继承关系,类与接口直接是实现关系
接口不可以实例化智能友实现了接口的子类并且覆盖了接口中的所有抽象方法该子类才能被实例化否则这个类就就是抽象类
一个类在继承另一个类时,还可以实现多个继承
接口:是对外暴露的规则,是程序的功能扩展,降低耦合性,用来多实现
接口和抽象类的区别
相同点:都是不断抽取的抽象概念
不同点:抽象类体现在继承关系,一个类只能单继承接口体现实现关系,一个类可以多实现 抽象类可以定义非抽象方法,供子类调用,接口的方法都是抽象的接口都有固定修饰符
每日总结与心得:开发时,记住,属性是用于存储数据的,直接被访问,容易出现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的访问方法。 这个方法一般有两个,规范写法:对于属性 xxx,可以使用setXXX(),getXXX()对其进行操作。
今天我在网上看到一个面试题我认为挺不错的,题目是这样的:什么是内部类?Static Nested class 和Inner class 的不同。内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到一个类中而已,这么一点小事,你还要把它放到类内部的一个类中,过分了啊!提供内部类,不是为让你干这种事情,无聊,不让你干。我想可能是既然静态成员类似 语言的全局变量,而内部类通常是用于创建内部对象用的,所以,把 全局变量 放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被禁止),内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,由于StaticNested class 不依赖于外部类的实例对象,所以Static Nested class, 能访问外
部类的非static 成员变量。当在外部类中访问Static Nested class时,可以直接使用 Static Nested class的名字,而不需要加上外部类的名字了,在Static Nested class中也可以直接引用外部类的 static的成员变量,不需要加上外部类的名字。在静态方法中定义的内部类也是 Static Nested class,这时候不能在类前面加static 关键字,静态方法中的 与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的 的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加 final修饰符。
在这与大家共享一下希望用点用吧。