面向对象的几个问题

1.面向对象思想的特点
     (1)是一种更符合我们思想习惯的思想(懒人思想,我把事情自己不做,交给别人去做)
     (2)可以将复杂的事情简单化(对使用者来说简单了,对象里面还是很复杂的)
     (3)角色发生了转换,将我们从执行者变成了指挥者
     (4)就是不断的创建对象,使用对象,指挥对象做事情。(如果有对象,直接用对象,对我们直接提供服务)

2.面向对象的特征
     (1)封装:是隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
     (2)继承:把多个类中相同的属性提取出来定义到一个类中。
     (3)多态:同一个对象不同时刻体现出来的不同状态。

3.类与对象的关系
     (1)是一组相关的属性和行为的集合(所有的同学都具备相同的属性和行为,比如:姓名,年龄,学习,这样就把所有的学生成为学生类)
     (2)对象是该类事物的具体体现(例如每个同学都具备自己特有的属性和行为)
     (3)类是抽象(抽取出同类事物中相同的、相似的部分就叫抽象)的,对象是具体的或者是类是一般的,对象是特殊的
     (4)类中可以包含成员变量、类变量、成员方法、类方法、构造函数、构造代码块、静态代码块等

4.成员变量和局部变量的区别?
     (1)在类中的位置不同
         a.成员变量:在类中方法外
         b.局部变量:在方法定义中或者方法声明上
     (2)在内存中的位置不同
         a.成员变量:在堆内存(成员变量属于对象,对象进堆内存)
         b.局部变量:在栈内存(局部变量属于方法,方法进栈内存)
     (3)生命周期不同
         a.成员变量:随着对象的创建而存在,随着对象的消失而消失
         b.局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
     (4)初始化值不同
         a.成员变量:有默认初始化值
         b.局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

5.private关键字的特点
     (1)封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private是实现封装的一种形式
     (2)private是一个权限修饰符,可以修饰成员变量和成员方法
     (3)被private修饰的成员,只能在本类中访问
     (4)当成员变量被private关键字修饰后,需要提供对应的get和set方法供外部访问

6.谈谈你对this的理解?
     (1)this只能代表本类对象
     (2)this代表所属函数(方法)的所属对象
     (3)谁来调用我,我就代表谁
     (4)this可用于区分成员变量和局部变量同名的情况

1.构造方法的特点?
     (1)构造方法主要作用是给对对象的属性进行初始化
     (2)方法名与类名完全一致,没有返回值类型,连void都没有
     (3)构造方法也是方法,只是比较特殊,是在创建对象后马上调用,后期不能单独调用,既然是方法,就可以重载
         a.方法名相同
         b.参数列表不同(数量不同,顺序不同,类型不同)
         c.与返回值类型无关
     (4)如果自定义类中没有提供构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不再提供默认的无参构方法,要想再使用空参构造,必须显示给出

2.java中创建一个对象的过程?
     (1)将类的字节码文件加载进内存
     (2)声明一个该类类型引用
     (3)在堆内存创建对象s
     (4)给对象中属性默认初始化值
     (5)属性进行显示初始化
     (6)构造方法进栈,对对象中的属性赋值, 构造方法弹栈
     (7)将对象的地址值赋值给s

3.谈谈你对static关键字的理解?
     (1)被static关键字修饰的成员,属于该类中所有对象的共享内容可以直接用类名调用,也可以用对象调用,但是建议用类名调用
     (2)随着类的加载而加载,优先于对象存在:随着字节码文件的加载而加载的,那时候还没有对象呢
     (3)静态修饰的内容一般我们称其为:与类相关的,类成员(静态变量:类变量,静态方法:类方法)
     (4)在静态方法中是没有this关键字的(因为this指的是一个具体的对象,而静态在加载到内存时还没有具体的对象)
     (5)静态方法只能访问静态的成员变量和静态的成员方法,非静态的成员方法既可以方法静态的成员方法和成员变量,又能访问非静态的成员方法和成员变量.(静态不能访问非静态)

4.静态变量和成员变量的区别?
     (1)所属不同
         a.静态变量属于类,所以也称为为类变量
         b.成员变量属于对象,所以也称为实例变量(对象变量)
     (2)内存中位置不同
         a.静态变量存储于方法区的静态区
         b.成员变量存储于堆内存
     (3)内存出现时间不同
         a.静态变量随着类的加载而加载,随着类的消失而消失
         b.成员变量随着对象的创建而存在,随着对象的消失而消失
     (4)调用不同
         a.静态变量可以通过类名调用,也可以通过对象调用
         b.成员变量只能通过对 象名调用

2.谈谈你对继承的理解?
     (1)继承与类之间产生关系,子父类关系
     (2)继承提高了代码的复用性和维护性,单同时增加了类与类之间的耦合性
     (3)java只支持单继承,不支持多继承,但是Java支持多层继承
     (4)继承中的注意事项:
         a.子类只能继承父类所有非私有的成员(成员方法和成员变量)
         b.子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
         c.不要为了部分功能而去继承
     (5)在创建对象时,子类中所有的构造方法默认都会访问父类中空参数的构造方法
         a.因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化。           
         b.其实:每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
     (6)父类没有无参构造方法,子类怎么办?
         a.super解决:用super(....)显式调用父类的有参构造,如:super(name,age);->super("zs",30);
         b.this解决:通过this调用本类的有参构造,然后在本类的有参构造里,又调用了父类的有参构造,相当于间接调用父类的有参构造.
         c.super(…)或者this(….)必须出现在构造方法的第一条语句上,只能出现其一
     (7)继承中成员方法关系?
         a.不同名的方法:直接调用就可以
         b.同名的方法:称为方法的重写,用子类对象直接调用的是子类已经重写的方法   
         c.要想调用父类的方法,可以在子类重写的方法中添加super();

3.谈谈你对this和super关键字的理解?
     (1)this:代表当前对象的引用,谁来调用我,我就代表谁
     (2)super:代表当前对象父类的引用
     (3)this和super的使用区别
         a.调用成员变量
             * this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
             * super.成员变量 调用父类的成员变量
         b.调用构造方法
             * this(...)    调用本类的构造方法
             * super(...)    调用父类的构造方法
         c.调用成员方法
             * this.成员方法 调用本类的成员方法,也可以调用父类的方法
             * super.成员方法 调用父类的成员方法

4.什么是方法的重载和重写?
     (1)重载:在同一个类中,方法名相同、参数列表不同(数量不同、类型不同、顺序不同)、与返回值类型无关的多个方法构成重载
     (2)重写:在继承中,子父类出现了一模一样的方法(返回值类型可以是子父类)
         当子类需要父类的功能而功能主体子类有特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类有的内容
     (3)重写的注意事项
         a.父类中私有法不能被重写,因为父类私有方法子类根本就无法继承,既然子类无法继承,就谈不上重写
         b.子类重写父方法时,访问权限不能更低,最好就一致
         c.父类静态方法,子类也必须通过静态方法进行重写
             * 其实这个算不上方法重写,但是现实确实如此.至于为什么算不上方法重写(静态只能覆盖静态)
         d.子类重写父类方法的时候,最好声明一模一样。

5.final关键字的特点?
     (1)修饰类,类不能被继承
     (2)修饰变量,变量就变成了常量,只能被赋值一次
     (3)修饰方法,方法不能被重写(有时所有方法都很重要,都不需要被重写,需要将类定义成final的)
     (4)final修饰局部变量:基本类型,是值不能被改变,引用类型,是地址值不能被改变,对象中的属性可以改变
     (5)final修饰变量的初始化时机?
         a.未被static关键字修饰
             * 可以显示初始化
             * 可以在构造方法中初始化
         b.被static修饰
             * 可以显示初始化
             * 可以在静态代码块中初始化
             * 不能在构造方法中初始化

1.谈谈你对多态的理解?
     (1)多态就是事物存在的多种形态
     (2)多态的前提
         a.要有继承关系。
         b.要有方法重写。
         c.要有父类引用指向子类对象。
     (3)多态中的成员访问特点
         a.成员方法:编译时看父类(左边),运行时看子类(右边)
         b.成员变量:编译时看父类(左边),运行时看父类(左边)
         c.静态方法:编译看父类(左边),运行看父类(左边)。
             (静态和类相关,算不上重写,所以,访问还是左边的)
             只有非静态的成员方法,编译看左边,运行看右边
     (4)多态的好处和弊端
         a.好处
             * 提高了代码的维护性(继承保证)
             * 提高了代码的扩展性(由多态保证),可以当作形式参数,可以接收任意子类对象
         b.弊端
             * 不能使用子类的特有属性和行为

2.谈谈你对抽象类的理解?
     (1)抽象类的概述?
         a.在某些情况下,父类只知道子类包含怎样的方法,无法准确知道这些子类如何实现该方法
         b.多个具有相同特征的类中抽取一个抽象类,以这个抽象类为子类的模板,从而避免子类设计的随意化
         c.限制子类必须有哪些方法,不关注实现细节.
     (2)抽象类特点
         a.抽象类和抽象方法必须用abstract关键字修饰
             * abstract class 类名 {}
             * public abstract void 方法名();//当不知道该方法具体是怎么实现的                       
         b.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
         c.抽象类不能实例化那么,抽象类如何实例化呢?
             * 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
         d.抽象类的子类
             * 要么是抽象类
             * 要么重写抽象类中的所有抽象方法
     (3)抽象类的成员特点
         a.成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量
         b.构造方法:必须有。
             * 用于子类访问父类数据的初始化。
         c.成员方法:既可以是抽象的,也可以是非抽象的。
             * 抽象方法 强制要求子类做的事情。
             * 非抽象方法 子类继承的事情,提高代码复用性。

3.abstract关键字不能与哪些关键字共同使用
     (1)abstract和static
         被abstract修饰的方法没有方法体
         被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
     (2)abstract和final
         被abstract修饰的方法强制子类重写
         被final修饰的不让子类重写,所以他俩是矛盾
     (3)abstract和private
         被abstract修饰的是为了让子类看到并强制重写
         被private修饰不让子类访问,所以他俩是矛盾的

4.谈谈你对接口的理解?
     (1)接口概述
         回顾猫狗案例,它们仅仅提供一些基本功能。
            比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
     (2)接口特点
         a.接口用关键字interface表示   
             * interface 接口名 {}
         b.类实现接口用implements表示
             * class 类名 implements 接口名 {}
         c.接口不能实例化
             * 那么,接口如何实例化呢?
             * 按照多态的方式来实例化。
         d.接口的子类
             * a:可以是抽象类。但是意义不大。
             * b:可以是具体类。要重写接口中的所有抽象方法。
     (3)接口成员特点
         a.成员变量只能是常量,并且是静态的并公共的。
             * 默认修饰符:public static final
             * 建议:自己手动给出。
         b.构造方法:接口没有构造方法。
         c.成员方法:只能是抽象方法。
             * 默认修饰符:public abstract
             * 建议:自己手动给出。

5.简述类与类,类与接口,接口与接口的关系?
     (1)类与类:
         a.继承关系,只能单继承,可以多层继承。
     (2)类与接口:
         a.实现关系,可以单实现,也可以多实现。
         b.并且还可以在继承一个类的同时实现多个接口。
     (3)接口与接口:
         a.继承关系,可以单继承,也可以多继承。

6.谈谈你对抽象类和接口的理解?
     (1)成员区别
         a.抽象类:
             * 成员变量:可以变量,也可以常量
             * 构造方法:有
             * 成员方法:可以抽象,也可以非抽象
         b.接口:
             * 成员变量:只可以常量
             * 成员方法:只可以抽象
     (2)关系区别
         a.类与类
             * 继承,单继承
         b.类与接口
             * 实现,单实现,多实现
         c.接口与接口
             * 继承,单继承,多继承
     (3)设计理念区别(面试时最好最初例子来)
         a.抽象类 被继承体现的是:”is a”(属于)的关系。抽象类中定义的是该继承体系的共性功能。
         b.接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
             * 对事物本质的抽象用抽象类,对事物功能的扩展用接口

1.java中哪几种权限修饰符,其对应的访问权限是什么?
                       本类     同一个包下(子类和无关类)    不同包下(子类)    不同包下(无关类)
         private         Y       
         默认            Y                 Y
         protected           Y                 Y                    Y
         public            Y                 Y                    Y                 Y

时间: 2024-10-04 21:12:24

面向对象的几个问题的相关文章

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de

php学习笔记 面向对象中[接口]与[多态性]的应用

代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽象方法(不

php面向对象

面向对象 什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程 序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性.灵活性和扩展性.为了实现整体 运算,每个对象都能够接收信息.处理数据和向其它对象发送信息. 什么是面向对象编程呢? 把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息.处理数据和向其它对象

面向对象注意事项

在面向对象中,有实例变量和类变量,实例变量为类对象的实例成员,而类变量不仅类可以直接调用,而且类的对象也可以调用.类对象可以对实例变量进行添加.修改.删除操作等... 下面就用个示例来做参考: #!/usr/bin/env python # -*- coding:utf-8 -*- class PersonInfo(object): commity_data = 123 def __init__(self,name,age): self.name = name self.age = age de

java面向对象:面向对象的思想和概述

1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情. 面向对象设计 其实就是在管理和维护对象之间的关系. 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism

6 面向对象之类和对象

1 面向对象和面向过程的区别 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想. 区别: 1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类.属性及其方法,然后通过实例化类.执行方法来完成功能. 2)封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能. 3)面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显. 2 类和对象 对象:客观存在的实体(一个具体的

简说面向过程与面向对象

昨天白天,因为在室外活动,无事可做,所以我思考了一天,在想怎么才能比较清晰的向人解释这两个概念.所以我对这两个概念的字面意思做了一下详细的解释.没想到,这可能真的会帮助我们非常简单的理解这两个概念. 面向:从字面上理解面向,就是我们的脸对着的地方,引申为我们能看到. 过程: 过程是事物从开始,到发展,到结束的整个经历 那么面向过程就是:我们能看到, 一个事物从 开始->发展->结束. 这对于我们写程序的人来说,可能会有感触,因为一开始我们写程序时.都是按照事件的发展.去安排计算机,一步一步的做