javase_面向对象

一、概述

1、面向对象是一种思想,让我们由执行者变成指挥者,执行者是面向过程,指挥者是面向对象.例如人开冰箱门,开冰箱门这个动作应该属于门而不是人,冰箱自己最清楚门应该怎么开,人只是调用了冰箱的这个动作.

2、面向对象开发例子 1.电脑坏了,找个修电脑的人,我们调用修电脑这个人修电脑的功能即可,自己不需要知道具体怎么修;2.公司老板找人完成软件开发...

3、开发的时候先想是否java已经实现了这个功能,找这个对象拿过来用,如果没有,自己造一个对象来用,自己能用别人也能用,开发就是找对象,找不到就建对象,然后用对象.

4、类和对象的关系,类是事物的描述(属性,行为),对象是实实在在的个体.

5、引用传递和值传递的区别.

6、成员变量和局部变量区别: 作用范围,存储位置,有无默认值.

7、面向对象三个特征: 封装,继承,多态.

二、封装

1、对外提供简单接口,封装细节 ,私有是封装的一种表现形式.

2、构造函数可以私有化一般是为了安全.

3、构造函数给不同的对象进行初始化,构造代码块是给所有的对象进行统一初始化(可以把构造函数中共同的东西提到这里).

三、this

1、this 代表它所在函数当前对象的引用,但凡本类功能内部调用本类对象都使用了this表示,因为在写类的时候对象还没定义.

2、this 用在构造函数直接相互调用,只能用this语句,且只能写在第一行.

3、类中方法之间可以互相调用,静态方法省略的是类名,非静态省略的是this.

四、static

1、只能修饰成员变量和成员方法,不能修饰局部变量.

2、随着类的加载(创建类对象或调用类的静态方法,类名 变量=null,不会加载)而加载,随类消失而消失,只执行一次(生命周期比非静态成员变量长).

3、1.优先于对象的存在 2.所有对象共享 3.类直接调用 4.放在方法区或叫数据区

4、静态方法中不能访问非静态变量;静态方法中不能使用this,supper.

5、什么时候使用static?

对于成员变量一般是需要共享的数据;对于成员方法,一般是该方法没有封装该类的特有属性时(即非静态成员变量),例如工具类Array中的方法.

五、初始化顺序

加载类的时候->静态变量->静态代码块(给类初始化,可以用来给静态变量赋值)->非静态成员变量->代码块(给对象初始化,不可以给静态变量赋值)->特定构造函数.

六、继承

1、提高代码复用性,类之间产生关系,父类提供子类共性的东西.

2、不支持多继承,有安全隐患,因为当多个父类中定义相同方法时,子类对象调用不确定调用哪个,支持多层继承,祖孙三代.

3、super 父类对象的引用,如果子类和父类中出现同名非私有成员变量时,子类访问本类中的变量用this,父类要访问本类中的变量用super,super的用法和this几乎一样.

4、函数的另一个特性重写(覆盖),子类和父类中函数一模一样(子类权限必须大于父类权限),子类对象调用,会调用子类的方法;函数的另一个特性是重载.

5、子类所有的构造函数默认第一行是super(),写在第一行;和this用法一样 super(4)调用父类参数传递4的构造函数,加括号掉用构造函数,不加括号代表当前对象和父类的引用.

七、final

继承的一个弊端是打破类的封装性,因为它的方法可以被重写, 因此出现了final,修饰类不能被继承(String类是final),修饰方法不能被重写,修饰变量是一个常量,只能赋值一次(作为函数的形式参数时函数被多次调用可以赋不同的值,这是俩回事).常量字母大写,单词间用_,相当于一个锁变量块,此时还往往加上public static 用来共享.

八、抽象类

1、抽象方法(没有方法体)只能放在抽象类中.

2、抽象类和抽象方法都用abstract修饰.

3、抽象类不可以new因为调用抽象方法没意义.

4、如果子类只覆盖部分抽象方法,那子类还是抽象类因为继承了其他抽象方法,抽象类可以有非抽象方法,抽象类通过继承实现.

5、java中有没有抽象方法的抽象类,仅仅是为了不让实例化.

/*模板方法设计模式*/
模板方法:在定义功能时,功能的一部分是确定的,一部分是不确定的,而确定的部分在使用不确定的部分,那么就可以将不确定的部分暴露出去,让子类去完成.
例:获取一段程序的执行时间
abstract class GetRuntime{
  public final int getTime(){
    int start = System.currentTimeMillis();
    runCode();
    int end = System.currentTimeMillis();
    System.out.print(end - end)/1000;
  }
  abstract void runCode();
}
class Zi extends GetRuntime{
  void runCode(...)
  Zi z = new Zi();
  z.getTime();
}

九、接口

一个例子说明使用接口的好处:

cpu和主板,之前cpu是直接焊接在主板上,现在主板厂商暴露针脚,只要cpu厂商按这个针脚做的cpu都可以直接装到主板上使用,这样以后电脑升级时,可以直接更换cpu.

1、接口编译也是class文件,接口中成员有固定修饰符,变量是public static final,方法是public abstract.

2、接口不能建对象,子类必须全部覆盖接口的方法,否则子类是抽象类.

3、类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系.

4、类可以同时继承一个类和实现多个接口 (只有接口和接口之间存在多继承,类之间只支持单继承).

5、接口特点:对外暴露规则,提高程序功能扩展 ,降低耦合性.

十、多态

1、重载和重写都是多态的体现,父类引用指向子类对象 ,提高代码复用性(传入谁谁运行,以前指挥一个对象去做事情,现在指挥一批对象去做事情,这里面有共性事物的抽象).

2、多态前提,1.存在继承或者实现;2.存在覆盖(只能使用父类的引用去访问父类的成员).

3、Animal a = new Cat(); //向上转型,Cat c = (Cat)a; //如果想使用猫的特有方法时,向下转型, 类似于int和byte之间的相互转换,Animal a = new Aniaml();Cat c = (Cat)a; 这是错的,此时Cat还不存在.

4、instanceof 判断对象的所属关系,当想用子类特有方法时可以用.

  testInstanceof(new Dog());
  void testInstanceof(Animal a){ //当子类个数有限时这么用,多的话也比较麻烦,if(a instanceof Animal) 无意义.
    if(a instanceof Cat){
      a.catchMouse();
    }else if(a instanceof Dog){
      a.kanjia();
    }
  }

5、多态中(非静态)成员函数的特点:

编译期:检查引用型变量所属的类中是否有调用的方法,没有编译失败

运行期:检查对象所属的类中是否有调用的方法,没有抛异常

简单就是编译看左边,运行看右边.

6、面试题: (一般只出现在面试时, 也就是覆盖一般不会出现在静态成员上,因为它是静态绑定 )

当多态情况下,父类和子类中出现同名变量(非静态)时,看左边, Fu f = new Zi(); f.num 调用Fu的num,多态情况下,静态成员函数和静态变量时,只看左边.

PS:单例设计模式

1、设计模式:类似"建筑",解决某一类问题最行之有效的方法,框架是大的设计模式.
2、单例设计模式:一个类在内存中只有一个对象,例:链接池可以使用单例模式,初始化的时候创建譬如100个connection对象,然后再需要的时候提供一个,用过之后返回到pool中,我们用单例模式,是保证连接池有且只有一个.
3、单例三步骤: 1.构造函数私有化2.类中创建一个本类对象3.提供一个方法可以获取该对象.
4、对于该类的事物该怎么描述还是怎么描述,当需要内存中该类对象唯一时就加上面三步.
5、懒汉式和饿汉式,延迟加载,实际中使用饿汉式,懒汉式有线程问题 (在判断是否为空时cpu切换,可以加sync..锁定,但是效率低).
6、线程问题中读的最小单位是一句话,也就是不会半句话处切换cpu, 所有一个方法中只有一句话时不考虑线程.
7、懒汉式线程问题解决方案:
class Ehanshi(){
  private ehanshi(){} Ehanshi e = null;
  public static Ehanshi getInstance(){
    if(e==null){
      --》此处切换cpu,会有线程问题 
      e = new Ehanshi();

    }
  }
}

解决方式一(效率低,每次需要判断是否锁定)
class Ehanshi(){
  private ehanshi(){} Ehanshi e = null;
  public static Ehanshi synchronized getInstance(){
    if(e==null){ e = new Ehanshi();}
  }
}
解决方式二 ,效率高 (但是还是建议使用饿汉式简单)
class Ehanshi(){
  private ehanshi(){} Ehanshi e = null;
  public static Ehanshi getInstance(){
    if(e==null){
      synchronized(Ehanshi.class){
        if(e==null){
          e = new Ehanshi();
        }
      }
    }
  }
}

 

时间: 2024-10-08 19:11:08

javase_面向对象的相关文章

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 类和对象 对象:客观存在的实体(一个具体的