1.什么是面向对象?
面向对象基于面向过程的,思想特点
1)更符号我们说中的思想行为习惯
2)让复杂的事情简单化
3)我们从执行者变成了指挥者
2.面向对象的三大特征
封装,继承,多态
3.什么是类?类和事物的关系,什么是对象
类是Java中最基本的单元,类是描述一组事物的属性和行为的集合!
和事物之间 关系:一一对应(程序中描述真实存在的现实世界的事物)
对象:对应的是具体的事物,描述具体的某个人/某个事物它的属性信息以及它的行为信息
4.成员变量和局部变量的区别
1)在类中的书写位置不同
局部变量:在方法定义中或者方法声明上
成员变量:在类中方法外
2)在内存中不同
局部变量:在栈内存中
成员变量:在堆内存中
3)生命周期不同
局部变量:随着方法调用而存在,随着方法调用结束而消失(局部变量:基本数据类型) 局部变量: 基本数据类型变量/引用数据类型变量
成员变量:随着对象的创建而存在,随着对象的创建完毕,等待GC垃圾回收器空闲时候回收而消失
类名 对象名 = new 类名() ;
4)初始化不同
局部变量: 可以先定义,在初始化;或者直接先初始化,无论怎样,必须在使用之前初始化,否则报错
成员变量:可以不进行初始化,加载进堆内存的,存在系统的默认初始化,然后可以进行显示初始化
5.方法的形式参数是引用类型(类),调用方法时实际参数怎么传递
方法的形式参数是引用类型---类,需要当前类的对象 class Student{ public void study(){ System.out.println("好好学习,天天向上!") ; } } class StudentDemo{ public void method(Student student){//方法的形式参数是Student类型,需要当前类的对象 student.study() ; } } //测试类 class StudentTest{ public static void main(String[] args){ //调用的StudentDemo类中的method方法 //创建StudentDemo类对象 StudentDemo sd = new StudentDemo() ; Student s = new Student() ; sd.method(s) ;//传入实际参数 } }
6.方法形式参数是基本类型和引用类型(String除外),他们的区别
方法的形式参数如果是基本类型,实际参数传递的数据值,而且形式参数的改变不会影响实际参数
方法的形式参数如果是引用类型,数组,类, 形式参数的改变会实际参数, 而且传递的实际参数是当前类对象/数组对象/接口对象...
封装
7.什么是封装
概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,
而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装: 将一个事务的属性私有化,加入private关键字,对外保证安全性,仅限当前类访问,超过当前类不能直接访问 对外提供公共的setXXX()/getXXX()访问方法!
7.1 封装的作用
1.使用封装可以保证数据的规范,不符合规范的数据将无法进行操作
2.提高了代码的可维护性,同时又可以不影响外部的使用
3.通过封装方法可以有效减少耦合。耦合:模块与模块之间,代码与代码之间的关联程度,对属性封装后,和调用相关的代码就会变得相对简单,可以降低耦合
7.2 封装的好处
-
隐藏类的内部实现细节
-
只能通过提供的方法进行访问,其他方法无法访问
-
可以根据需求添加复杂的逻辑判断语句
-
方便修改实现
8.匿名对象和this
8.1 什么是匿名对象
没有名字的对象
格式: new 类名() ;
好处:
1)使用一次,及时就被gc垃圾回收器回收了,因为不存在栈内存指向堆内存,所以直接 在堆内存中开辟空间,使用完毕就被回收!
2)可以作为参数传递
3)从内存角度考虑,节省内存
8.2 什么是this,this作用是什么
this:this是代表当前类对象的地址值引用
作用;就是为了区分局部变量和成员变量名称一致的时候,局部变量隐藏成员变量,加入this
this.变量名--->变量名---成员变量名
this.方法名()---->方法名---->当前类的成员方法
9.static关键字的特点
1)被static的变量,方法,称为类变量/类方法,他们是随着类的加载而加载,随着类的加载完毕 而结束,他们优先于对象存在,先加载类(类就加载一次),然后再去new对象
2)static关键字不能和this共存 this代表的当前类对象的地址值引用,和对象有关 static:和类相关的
3)最基本的特点:能够被多个对象共享,共用
4)访问方式: 被static修饰的变量/方法---静态变量/静态方法
推荐的方式 类名.变量名; 类名.方法名();
10.构造方法是什么,它的作用是什么
构造方法是一个特殊的方法: 方法名和类名一致 没有具体的返回值类型,连void都没有
格式: public 类名(){//无参构造方法
}
public 类名(参数列表){//有参构造方法
}
构造方法是可以重载: 方法名相同,参数列表不同 参数个数不同 参数类型不同 考虑类型的顺序
构造方法的作用: 就是给类的成员进行数据初始化的
Student s2 = new Student("zeze",20,"男") ;
1.有参构造方式赋值
2.类在加载的时候,需要堆类的成员进行默认初始化,然后有参构造方法显示初始化
11.给成员变量赋值的方式有几种
两种方式:
1)通过setXXX(数据类型 变量名)来赋值
2)通过有参构造方法的方式进行显示初始化
12.静态代码块,构造方法,构造代码块的优先级
在类的成员位置
static{ } 特点:随着类的加载而加载,而且优先于对象存在;类加载一次,静态代码块执行一次
构造代码块: 在类的成员位置定义的{},可以通过构造代码块给成员进行赋值,但是实际开发中都是用的构造方法,很少用构造代码块
构造方法: 每次执行构造方法之前,如果存在构造代码块,优先执行构造代码块,然后在执行构造方法
优先级: 静态代码块>构造代码块>构造方法
继承
13.什么是继承
继承: 就是将多个类的共性内容抽取到一个独立的类中,然后让这多个类和这一个类产生一种关系, 就叫继承关系 extends
13.1 继承的好处
继承的好处:
1)提高了代码复用性
2)提高了代码的维护性(结构层次很清晰,子类,父类的所有成员信息都可以看到)
3)类与类之间的关系,继承关系---是多态的前提条件
13.2 继承的特点
继承具有以下特点:
1.只支持单继承,即一个子类只允许有一个父类
2.子类可以拥有父类的属性和方法
3.子类可以拥有自己的属性和方法
4.子类可以重写覆盖父类的方法
5.可以声明父类,创建子类(又称父类装载子类)
14.this和super的区别
this: 代表当前类对象的地址值引用 Student s = new Student() ; //空间地址值
super: 代表的父类的空间标签(父类对象的地址值引用) 访问变量:
this.变量名; 访问当前类中的成员变量
super.变量名; 访问的父类的中的成员变量 访问成员方法:
this.方法名() ; 访问当前类中的成员方法
super.方法名() ;访问的父类中的成员方法 访问构造方法:
this(); 访问的当前本类的无参构造方法 this(xxx) ;访问的是当前类的有参构造方法
super() ;访问的父类的无参构造方法 super(xx) ;访问的是父类的有参构造方法
15.方法重写Override和方法重载Overload的区别
方法重写: 继承关系中,子类出现了和父类一模一样的方法(权限修饰符,返回值类型,方法名,参数列表都相同) 子类将父类的方法覆盖了;
方法重载:在定义方法的时候,方法名相同,参数列表不同(参数类型,参数个数,类型的顺序),与返回值无关;
重载的目的:是为了提供某个功能的扩展性,同样一个功能,可以传递不同类型的参数
eg: Math.abs(double/int/float...)
16.final关键字的特点
final:最终的,无法更改的,状态修饰符
final:修饰类,类不能被继承 修饰成员方法,该方法不能重写 修饰成员变量,此时变量是一个常量
自定义常量:public static final :实际开发中传统方自定义常量就是这么写
1.编译时期常量---jvm不需要加载 public static final 基本数据类型 变量名 = 值 ;
2.运行时期常量---jvm是需要加载类的 public static final 引用数据类型 对象名 = new 类名() ;
final修饰的基本数据类型,基本数据类型的数据值不能在赋值了
final修饰引用数据类型,当前类不能再去new对象了 final Student s = new Student() ;//s地址值是当前地址,不能在重新new了
17.继承的访问
17.1 继承中构造方法的访问:如何访问
子类不能继承父类的构造方法,是通过super访问父类的构造方法
当前子类继承父类的时候,子类的所有构造方法都默认的访问父类的无参构造方法 当前父类的无参构造方法没有给出,子类出现问题:
子类的所有构造方法都报错,如何解决呢?
1)手动给出父类的无参构造方法
2)间接的 访问父类的有参构造方法
3)不推荐:this(xx)-->先执行本类的有参构造方法,然后本类在有参构造方法中 在通过this();访问本类的无参构造方法,然后本类无参构造方法中super(xx) ;访问父类的有参构造方法;
第三种方式的目的:就是子类的所有构造方法中只要有一个让父类进行初始化即可.
17.2 继承中成员变量名称一致,如何访问
就近原则:
1)现在子类的局部位置中找
2)局部位置没有,在子类的成员位置中找
3)如果子类成员位置没有,在父类的成员位置中找
4)如果在父类的成员位中找不到,就报错了,不存在
多态
18.什么是多态
一个事物在不同时刻体现的不同形态
宏观角度去说:(现实世界事物分析)
微观角度考虑:内存中的变化
19.多态的前提条件是什么
1)继承关系,必须存在,没有继承关系----谈不上多态
2)必须存在方法重写,因为子类需要覆盖父类的功能
3)必须有父类引用指向子类对象-------->称为"向上转型"
格式:class Fu{}
class Zi extends Fu{ *//方法重写
}
Fu fu = new Zi() ;
20.多态的成员访问特点(重点)
1)成员变量(非静态) 编译看左,运行看左
2)成员方法(非静态) 编译看左,运行看右, 子类的方法将父类的方法覆盖了,所有使用的子类的功能
3)静态方法算不上方法重写--- 跟类相关,类名.方法名()
编译看左,运行看左
4)构造方法----访问---由于多态还是需要继承的,所以分层初始化
21.多态的好处是什么
1)提高代码的复用性(由继承保证)
2)提高代码的扩展性(有多态保证:父类引用指向子类对象)
Fu fu = new Zi() ;// 如果方法的形式参数是引用类型,父类类型,可以传递子类对象!!! public void method(Student s){ //---传递实际参数需要Student的具体对象 } public void method(Person s){//Person类型---父类 ---子类Student //---传递实际参数需要Person类的子类对象 Person p = new Student(); }
22.多态的弊端是什么
22.1 弊端
父类引用指向子类对象
对象名.方法名() ---看父类中是否有这个方法,编译看左!
不能访问子类的特有功能
22.2 如何解决
方式1:创建具体的子类对象
子类 new 子类对象
在堆内存中new,消耗内存空间,不建议(从内存焦点考虑)但是你非要使用,当前可以访问!
方式2:
既然你可以父类引用指向子类对象, (向上转型:使用的都是父类的东西)
Fu fu = new Zi() ;能不能将使用子类的引用来访问呢?
即 将父类的引用强转转换为子类的引用 :强转类型转换的格式'
Zi z = (Zi)f ; (向下转型) 子类型 变量名 = (子类型)父的引用;
23.向下转型 出现的异常
向下转型使用不当,会出现运行时期异常!
ClassCastException:类转换异常
解决方案:
改动代码---因为考虑内存中和当前接收的引用类型不匹配,看内存的变化