类和对象

类和对象

对象是类的一个实例

1、Java面向对象的三(四)大特征(抽象):

(1)封装
把对象的属性和行为作为一个独立的整体,并尽可能隐藏对象的内部细节,只保留有限的接口和外部发生关系,使得外部不能直接访问对象的内部属性,保证了数据的安全性
为什么使用封装?
①易用、简单;②安全③易维护
好处:
①只能通过规定的方法区访问数据;
②隐藏类的实现细节;
③方便加入控制语句;
④方便修改实现经过封装的属性,不能直接访问,要通过公共属性set/get方法访问
(2)继承
是从已有的类中(父类)派生出新的类(子类),新的类能够吸收已有类的属性和行为,继承的好处是提高了代码的可用性和维护性
为什么使用继承?
可以更好的实现代码的重用
(3)多态
不同类对同一消息做出响应,即统一消息可以根据发送对象的不同而采取多种不同的行为方式,多态的必要条件:继承,重写和向上造型(父类的引用指向子类的对象)
多态的好处:
①可替换性:多态对已存在代码具有可替换性。
②可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
③接口性:多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
④灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。
⑤简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要

2、重载与重写

重载和重写都是多态的一种体现,重载是编译期的多态性,重写是运行期的多态性。
重载:
1、参数类型、个数、顺序至少有一个不相同
2、不能重载只有返回值不同的方法名
3、存在于父类和子类、同类中;
重写:
1、方法名、参数、返回值相同
2、子类方法不能缩小父类方法的访问权限
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)
4、存在于父类和子类之间
5、如果方法被定义为final则不能被重写
6、子类函数的访问修饰权限不能少于父类的;

3、抽象类

抽象:
提取事物的本质,共性的属性和方法,忽略某些不必要的细节和个性的差异
①抽象类
1、抽象类不能直接实例化,并且对抽象类使用new 运算符是编译时错误,它只能作为父类被继承。
2、允许(但不要求)抽象类包含抽象成员。
3、抽象类不能使用final关键字
②抽象方法:
只有声明,没有实现,abstract修饰抽象方法
③抽象类的使用原则:
1、抽象类必须有子类,子类利用extends关键字来继承抽象类,一个子类只能够继承一个父类;
2、抽象类的子类(如果不是抽象类),那么必须要重写抽象类中的全部抽象方法;
3、抽象类可以利用对象的向上转型机制,通过子类对象进行实例化操作。

4、接口

接口
当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是对行为的抽象,类是对属性和行为的抽象
特征
①接口中的方法的定义不需要abstract来修饰;
②接口是不可以实例化的,需要有类来实现接口;
语法: class 类名 implements 接口名,接口名……{
//实现每一个接口的方法
}
③接口中的方法不能和private、final、static共存,但是在java8以后可以使用static修饰方法,但是由static修饰的方法必须有方法体,才能够由类名调用然后执行
④在接口中,可以定义属性,可以通过接口的实现类的实例化来访问,还可以通过接口名来访问(推荐),接口中的属性不能被修改,我们接口中的属性默认都是final static的
⑤接口可以继承(单继承),也可以多级继承和多继承。

5、抽象和接口的相同点和不同点

相同点:
(1)都不能被实例化,能被其他类继承(实现)
(2)都包含抽象方法,子类都必须实现这些抽象方法
不同点:
(1)类:抽象类是对事物的抽象,接口是对行为的抽象
(2)方法:抽象类中可以包含普通方法,接口中不能有普通方法
(3)成员:抽象类可以一样普通成员变量,接口中不能有普通成员变量,只有静态变量
(4)静态:抽象类中可以有静态代码块和静态方法,而接口不能
(5)子类:一个类只能继承一个抽象类,而可以实现多个接口

6、类的访问修饰符

修饰符 同类中 同一个包中(没有父子类关系) 同一个包中(有父子类关系) 不同包(有父子关系) 不同包,也没有父子关系
修饰符 同类中 同一个包中(没有父子类关系) 同一个包中(有父子类关系) 不同包(有父子关系) 不同包,也没有父子关系
在这里插入图片描述

7、关键字

1、This关键字

只能在类的方法中使用,this是变量的地址
打印一个对象,输出的是这个对象的地址
This代表当前调用这个this所在的方法的对象的本身
谁调用方法,则方法中的this和谁的地址一样
This.name this后面带的是属性
This可以在方法区区分同名的类的属性和参数

2、static关键字

①修饰在属性上
定义类属性:
Static 数据类型 变量名;
类属性访问:
类名.类属性名 推荐使用
对象名.类属性名 不推荐使用
Static修饰在属性上的内存图:
在这里插入图片描述
类属性的生命周期:
User.class加载到jvm中时类属性就产生了。
Jvm消失时候类属性就消失了。
对象属性的生命周期:
当对象被创建的时候就产生了。
当对象所在的方法执行完毕后,就会被垃圾回收器回收掉
②修饰在方法上
语法:public static 返回值类型(void) 方法名(数据类型 参数名){}
类方法的调用
类名.类方法名 推荐使用
对象.类方法名
在这里插入图片描述
在类方法中不能使用对象的属性,类方法只能使用类属性

3、final关键字

①修饰在方法上
final修饰的方法不能被复写
语法:
权限修饰符 final 返回值类型 方法名(参数列表){
方法体;
}
②修饰在属性上
Final修饰的属性不能被修改
语法:
权限修饰符 (static) final 数据类型 属性名=值;
属性名一般采用大写,多个单词使用下划线分隔,而且这种常量多定义在接口中
③修饰在类上
final修饰的类不能被继承
语法:final class 类名{
属性名;
方法;
}

面试题:

1、重写和重载区别
重写(Overriding)和重载(Overloading)的区别
方法的重写和重载是Java多态性的不同表现。二者多态的差别在于,重载的编译时多态,重写是运行时多态。重写是父类与子类之间多态性的一种表现,而重载是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写,子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载。
重写的特点 :
①、重写的子类的方法名称、参数类型必须要和父类方法的完全匹配,才能达到重写的效果;
②、重写的子类的方法的返回值类型必须和父类方法的一致,其修饰符可以扩大,不可以缩小;
③、重写的子类的方法所抛出的异常只能是父类方法抛出异常的子异常;
④、被private、final等关键字修饰的方法是不能被重写的;
⑤、 一个不是用abstract标识的方法不可以重写成abstract方法。
重载特点 :
①、在使用重载时只能通过不同的参数样式(例如,不同的参数类型,不同的参数个数,不同的参数顺序);
②、方法的异常类型和数目不会对重载造成影响;
③、不能通过访问权限、返回类型、抛出的异常进行重载(例如,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果)。
2、构造器能否重写
重写发生在父子类中,而构造器不能被继承,所以就不能被重写
3、String类能否被继承
String是final的,不能被继承
4、是否可以从一个静态方法内部发出对非静态方法的调用
不可以,静态方法只能访问静态成员
5、接口是否可继承接口,抽象是否可实现接口,抽象类是否可继承具体类
接口可以继承接口;
抽象类可以实现接口;
抽象类可以继承具体类,但前提是具体类有明确的构造函数
6、内部类可以引用它的包装类的成员吗
一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员
7、请阐述什么是多态?什么是静态绑定?什么是动态绑定?动态绑定画图解释。
多态是同一个行为具有多种形式状态,就是基类的引用既可以引用自己对象,也可以引用派生类的对象
静态绑定是在编译期就执行的,可以理解为方法的重载,即方法的方法名相同,而参数列表不同,可以是参数的个数不同或者是参数的参数类型不同。或者方法的修饰符是final,static,private或者是构造方法,这样编译器在编译期间就可以准确的知道该调用哪个方法。
动态绑定是在运行期执行的,必须有继承、重写和向上造型(父类的引用引用派生类的对象)
在这里插入图片描述
8、final, finally, finalize 的区别
①、final
修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
②、finally
在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
③、finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
9、构造方法和普通方法的区别
①构造方法是用来实例化对象的,而普通方法是用来执行对象的某个行为的;
②构造方法名必须和类名一致,而普通方法可以自由定义;
③构造方法不需要定义返回值数据类型,而普通方法必须有;
④构造方法每使用一次就会实例化一个新的对象。而普通方法始终是对同一个对象执行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值