-------
android培训、
java培训、期待与您交流! ----------
三大特征
封装 (encapsulation)
继承 (inheritance)
多肽 (polymorphism)
object-oriented programming 面向对象程序设计
创建对象的格式:
类名 对象名 = new 类名();
调用成员变量与成员方法的格式:
对象名.成员变量
对象名.成员方法名()成员变量是有初始化值的
成员变量和局部变量的区别:
代码位置:
成员变量:在类中方法外
局部变量:在方法内
内存位置:
成员变量:堆内存中
局部变量:栈内存中
是否有默认值:
成员变量:有默认值
局部变量:没有默认值
使用范围:
成员变量:在整个类中都可以访问
局部变量:只能在该方法中访问
创建时间:
成员变量:随着对象的创建而存在,随着对象的释放而消失 生命周期长
局部变量:随着方法的调用而存在,随着方法使用完毕而消失
变量的使用原则: 就近原则
如果在局部找到了,使用局部变量
如果在类中的成员位置找到了,使用成员变量
如果在类中也没有找到,报错
封装(Encapsulation)
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
private关键字:
是一个权限修饰符。
用于修饰成员(成员变量和成员函数)
被私有化的成员只在本类中有效
将成员变量私有化,对外提供对应的set ,get方法对其进行访问。
提高对数据访问的安全性
构造函数
特点:
函数名与类名相同
不用定义返回值类型
没有具体的返回值。
作用:
给对象进行初始化
格式:
修饰符 类名(参数列表){}
注意事项:
A:多个构造函数是以重载的形式存在的。
B:如果当前类中没有写构造函数,那么,在程序执行的时候,JVM会自动为当前类添加空参构造函数
如果当前类中写了构造函数,那么,在程序执行的时候,JVM不会为当前类添加空参数构造函数
C:当创建对象的时候,会调用构造函数,给创建出来的对象进行成员初始化的
D:(推荐做法)
定义一个类的时候,为了防止出现构造函数调用的问题,
每定义一个类,就手动的将空参数的构造函数实现
this关键字
(业余版)
代表的是当前对象的引用
(专业版)
特点:this代表其所在函数所属对象的引用。
换言之:this代本类对象的引用
this关键字的使用:
1、当局部变量与成员变量重名的时候,可以使用this关键字来区分
2、在构造函数中使用
格式:this.成员变量
注意:针对成员的修改只对当前对象有效
static关键字的由来
| 多个对象共享同一个属性,使用静态
| 被静态修饰的方法,直接类名调用,方便,不用创建对象
static关键字 的由来
static关键字:
用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用
使用注意
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
通过观察结果发现:
非静态的成员变量修改,只对当前对象有效;
而静态的成员变量修改,对所有的对象有效;
所以,可以将所有对象共享的属性定义为 静态的。
在访问的时候:
普通方法调用:
可以调用普通变量,还可以调用 静态变量
可以调用普通方法,也可以调用 静态变量
静态方法调用:
只能调用静态变量
只能调用静态方法
请记住:静态只能访问静态
静态成员与普通成员的区别
位置上的区别
静态成员: 方法区
普通成员: 堆内存
创建时间与销毁消失
静态成员: 随着类的加载而存在,随着类的消失而消失
普通成员: 虽则对象的创建而存在,随着对象的消失而消失
调用上的区别
静态成员: 对象.成员 类名.成员
普通成员: 对象.成员
理解上的区别
静态成员: 多个对象共享同一个属性
普通成员: 每一个对象单独所拥有的
静态代码块
静态代码块 -- 构造代码块 -- 构造函数
运行的特点: 只运行一次
格式 : static { .... }
API(帮助文档) Application Programming Interface
继承的概述
概念: 在一个已有类的基础上,作为修改,得到一个新的类
继承的特点(子类可以直接访问父类中的非私有的属性和行为)
继承的特点(Java只支持单继承,不支持多继承)
特点:
子类可以直接访问父类中非私有的属性与方法
java中只支持单继承,不支持多继承
java中支持多层(重)继承
成员的特点(成员变量)
变量的就近使用原则
成员变量与局部变量重名,使用 this 关键字
子父类成员重名, 使用 super 关键字
this: 当前对象的引用
super: 父类的引用
成员的特点(成员方法)
方法的重写
概念: 子类将父类的方法重新实现
注意事项:
子类方法的权限 要大于等于 父类方法权限
静态方法 只能覆盖 静态方法
子类不能覆盖父类私有方法
成员的特点:
成员方法:
函数覆盖(函数重写、方法重写):
子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。
父类中的私有方法不可以被覆盖。
在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
super.方法名 访问父类中的同名方法
注意事项:
覆盖时,子类方法权限一定要大于等于父类方法权限
静态方法只能覆盖静态方法。
请解释下 什么是方法重写、什么是方法重载?
方法重载(Overload): 在一个类中,方法名相同,参数列表不同
方法重写(Override): (民间)子类将父类中的 方法 从新实现。
(官方)子类继承父类,子类与父类有同名的方法,子类将父类的方法重新实现。
main方法解析
public: 为了main方法设为最大访问权限
static: 不能创建对象,直接类名调用
void : main方法是JVM调用的,如果main方法有返回结果,
那么这个结果返回给JVM,我们无法拿到的,所以main设置void类型
main : JVM只认得main方法, 其他的不认识
String[] : 字符串数组
args : 字符串数组的名字
作用:静态代码块用来加载驱动的,
因为驱动只需要加载一次
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,
那么多个类无需再定义这些属性和行为,只要继承那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类。
子类可以直接访问父类中的非私有的属性和行为。
通过 extends 关键字让类与类之间产生继承关系。
class SubDemo extends Demo{}
好处:
继承的出现提高了代码的复用性。
继承的出现让类与类之间产生了关系,提供了多态的前提。
math类的演示
(Math.E);
(Math.PI)
字段摘要
static double E
比任何其他值都更接近 e(即自然对数的底数)的 double 值。
static double PI
比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。
absolute 绝对值
Math.abs(12.345); 12.345
Math.abs(-12.345); 12.345
ceil天花板 大于等于参数的最小整数
Math.ceil(12.345); 13.0
Math.ceil(-12.345); -12.0
floor 地板 小于等于参数的最大整数
Math.floor(12.345); 12.0
Math.floor(-12.345); -13
max 返回两个数中较大的一个
Math.max(Math.max(123.3, 250.5) , 200.0);
pow /返回第一个参数的第二个参数次幂的值。
random() 0.0 <= num < 1.0
round 圆 循环 // 四舍五入
sqrt 开平方 /返回正确舍入的 double 值的正平方根。
抽象类的特点:
A: 抽象方法与抽象类必须使用 abstract来修饰
B: 包含抽象方法的类一定是抽象类
C: 抽象类不可以创建对象
D: 继承抽象类的子类,要么声明为抽象类,要么重写父类中所有的抽象方法
E: 抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式:修饰符 abstract 返回值类型 函数名(参数列表) ;
Person
| Girl
| Boy
抽象类中的成员
成员变量:
普通变量
常量
抽象类中的成员
成员方法
普通方法
抽象方法
注意: 抽象类中 可以没有抽象方法
问: 如果一个抽象类中没有抽象方法,那么,为什么要设置为抽象类呢?
答: 防止创建当前类的对象
抽象类中的成员特点
构造函数: 有
问:抽象类不能创建对象,那么,有构造函数有什么用吗?
答:子类创建对象的时候,调用父类构造函数,为父类中成员进行初始化
final关键字
final最终的意思
final可以修饰类,方法,变量。
final修饰的方法不可以被覆盖。
final修饰的变量是一个常量。只能被赋值一次。
final修饰的类不可以被继承。
内部类只能访问被final修饰的局部变量。
定义:某一类事物的多种存在形态
Person
| Girl
| Boy
前提条件:
需要存在继承或者实现关系
要有覆盖操作
父类引用指向子类对象
多态中的成员特点
成员变量:
编译的时候:看的是左边的父类
运行的时候:看的是左边的父类
多态中的成员特点
成员方法:
编译:看左边的父类
运行:看右边的子类
多态中成员的特点
静态成员方法:
编译:看左边的父类
运行:看左边的父类
总结:除了成员方法运行看右边子类以外,都看左边父类
好处和作用:
多态的存在提高了程序的扩展性和后期可维护性
好处:多态的存在提高了程序的扩展性
后期可维护性(父类 Person 完成的)
弊端:不能使用子类特有方法
Person
| Girl
| Boy
| Other
抽象类相关问题
1、抽象类中是否有构造函数?
有
作用: 子类创建对象时,调用父类构造函数,可以为父类的成员初始化
2、抽象类中可不可以没有抽象方法?如果没有,为什么要定义成抽象类?
可以
防止创建本类对象
3、抽象关键字abstract不可以和哪些关键字共存?
final: 最终的意思,修饰的方法 不能被重写
abstract: 修饰的方法,必须要重写,冲突
private: 私有的意思,修饰的方法,子类不能重写
abstract: 修饰的方法,必须要重写,冲突
static: 静态的意思,修饰的方法,类名直接调用
那么,如果该方法可以设置为抽象
类名.方法名调用,没有意义
abstract: 修饰的方法,必须要重写
发现呢, 抽象类中只有抽象方法,这种时候,在java中,提供 一个新的技术来描述,叫接口
(接口是一个特殊的抽象类)
接口,它不是一个类,所以它没有的默认继承Object类
格式:
interface 接口名{
...
}
接口有了,但是怎么和其他的类 联系起来呢?
我们通过一个技术,实现来让接口与类产生关系 关键字 implements
让类与接口产生关系 实现关系
接口的特点
A: 定义接口使用 interface , 实现一个接口使用 implements
B: 成员特点:
构造函数:
接口中没有构造函数
成员方法:
只有抽象方法
默认的修饰符: public abstract
成员变量:
只有final 修饰的常量
默认的修饰符: public static final
C: 接口不能直接创建对象
D: 一个类在继承一个类的同时,可以实现多个接口
类与类之间的关系:
继承关系,java中只支持单继承,不支持多继承,但是支持多层(重)继承
类与接口之间的关系:
实现关系,java中支持单实现,也支持多实现
接口与接口之间的关系:
继承关系,java中接口来说,支持单继承,也支持多继承
面试题:
问:java中支持多继承吗?
答:分情况,在一般情况下,java中只支持单继承,但是,接口是一
接口与抽象类的区别?
共 性: 都是不断抽取出来的抽象的概念
区 别:
1、关键字:
接口: interface
抽象类: abstract
2、接口: 实现关系,可以多实现
抽象类: 继承关系,只能单继承
3、成员的区别
接口:
构造函数:
没有
成员方法:
只有抽象方法
成员变量:
常量
抽象类:
构造函数:
有,子类创建对象的时候,调用父类中构造函数,用来给父类中成员初始化的
成员方法
普通方法
抽象方法
成员变量
普通变量
常量
什么时候使用抽象类? 什么时候使用接口?
接口: 部分子类必须要做的操作,定义在接口中
抽象类: 所有子类都必须要做的操作,定义在抽象类中
内部类: 类A中有一个类B,类B就叫做内部类
class A{
class B{
}
}
访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。
而外部类要访问内部类中的成员必须要建立内部类的对象。
内部类: 在一个类中,定义另外一个类
根据位置的不同:
成员位置:成员内部类
局部位置:局部内部类
外部类
创建内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
方式一:
方式二:(推荐)
Outer ou = new Outer();
ou.method();
成员内部类 使用的修饰符
private: 提高数据安全性
static: 方便调用
发现使用static 修饰内部类之后,原先的创建对象方式 不能用了。
新的格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
局部内部类
发现内部类 访问外部类的局部位置的变量时,局部位置的变量需要final修饰。
为什么要final修饰呢?
当method方法执行完毕后,变量num就在内存中释放了,
而创建出来的内部类对象,在这个时候成为了垃圾,但是这个垃圾,不会立刻释放出内存
会等到系统空闲的时候,由JVM的自动垃圾回收机制将这个垃圾 清理出内存。
那么,在没有清理出内存的这段时间,这个内部类对象会一直指向着num变量。
而num变量已经释放了,所以会报错。
为了,解决该错误,只能将num 变量的生命周期延长到与类对象相同。
通过 final 关键字来 修饰num 变量,程序就可以使用了
内部类定义在成员位置上
可以被private static成员修饰符修饰。
被static修饰的内部类只能访问外部类中的静态成员。
内部类定义在局部位置上
也可以直接访问外部类中的成员。
同时可以访问所在局部中的局部变量,但必须是被final修饰的。
】
不能被private static 修饰 因为
1.
因为他本身就是在内部使用的,外部不能访问
2.
所以声明为static的变量实质上就是全局变量。所以static不能修饰局部变量。
静态修饰的内容被所有对象共享,局部变量的作用域只能是所在的函数,而且是在栈内存中存在,当出了作用域就会被释放,根本不能让所以对象共享,而且静态修饰的内容存在于方法区,在内存中和局部变量的存储空间也不一样,所以是不能修饰局部的
匿名内部类
就是内部类的简化写法。
简单理解:
就是建立一个带内容的外部类或者接口的子类匿名对象。
前提:
内部类可以继承或实现一个外部类或者接口
匿名内部类的位置:
如果在成员位置上应该是没法在堆内存中存储 没有名字你怎么存储
而在局部位置直接用了。不用存储
局部位置
匿名内部类格式为:
new 外部类名或者接口名(){
重写父类或者接口的抽象方法
也可以定义特有的方法
};
发现其实匿名内部类就是一个接口或者外部类的子类对象
学习多态的时候,可以讲 父类引用 指向 子类对象
-------
android培训、
java培训、期待与您交流! ----------