面向对象的三大特性

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 封装的好处

  1. 隐藏类的内部实现细节

  2. 只能通过提供的方法进行访问,其他方法无法访问

  3. 可以根据需求添加复杂的逻辑判断语句

  4. 方便修改实现

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:类转换异常

解决方案:

改动代码---因为考虑内存中和当前接收的引用类型不匹配,看内存的变化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值