【java】面向对象基础

一、面向对象和面向过程的区别
    面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。
1、面向过程
    按步骤实现,适合简单、不需要协作的事物。比如 “如何开车,点火、踩离合、挂挡和踩油门,车就开走了。
2、面向对象
    面向对象程序设计(Object-oriented Programming,OOP)    
    面向对象分析法(Object-oriented Analysis ,OOA)
    面向对象设计(Object-oriented Design,OOD)
    面向接口程序设计(Interface-oriented Programming,IOP)
    
    面向对象就是将一个具体事物的属性抽象出来的过程,适合复杂,需要很多协作的事物。比如“如何造车,先找出车是由什么物体组成的,车窗、轮胎、发动机等等。
    
3、面向对象和面向过程的总结
    1.都是解决问题的思维方式,都是代码组织的方式。
    2.解决简单问题可以使用面向过程
    3.解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程。
    它们并不是对立的,是相辅相成的。

二、对象是什么_对象和数据管理
    对象就是一个内存中的内存块,包含了很多相关数据和方法。

三、对象和类的关系_属性_成员变量_方法
    类可以看做对象的一个模板,对象的抽象,系统根据类的定义来造出对象 。

面向对象思想的本质:

  以类的方式组织代码,以对象的方式(封装)数据。

对象:是具体的事物。

类:是对对象的的抽象(抽象  抽出象的部分)

先有具体的对象,然后抽象各个对象之间象的部分,归纳出类,通过类再认识其他对象。

    类:class           对象:Object,instance(实例)

【java】面向对象基础
   构造方法名必须与类名保持一致,一个java文件可以写多个类,但只能有一个public修饰的类。

Java中的return语句总是和方法有密切关系,return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句)。

四、内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程
    天下文章一大抄,大多数编程语言的底层都类似。
    java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area

【java】面向对象基础

【java】面向对象基础

【java】面向对象基础

【java】面向对象基础

五、构造方法详解_构造方法重载

    构造器也叫构造方法(constructor),用于对象的初始化。

【java】面向对象基础

【java】面向对象基础

构造方法的重载和方法重载一样:同一个类中、方法的名称相同,形参列表不同(类型、个数、【不同类型参数】顺序不同)。

                                                    只有返回值不同不构成方法的重载( int a(String str){}, void  a{String i},

                                                    调用:a(), 谁能告诉我是调哪个方法/p>

                                                    只有形参的名称不同,不构成方法的重载

 

六、this的本质_对象创建过程的4步

    this表示当前方法下创建好的对象

【java】面向对象基础

【java】面向对象基础

3.——>this指向当前对象,对象在堆中,static方法在方法区中

七、static关键字_内存分析静态变量和静态方法

【java】面向对象基础

【java】面向对象基础

静态:static
用法:是一个修饰符;用于修饰成员(成员变量和成员函数)
当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用格式:类名.静态成员

静态的特点:
1.随着类的加载而加载
也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
2.优先于对象的存在
明确一点:静态是先存在的对象是后存在的
3.被所有对象共享
4.可以直接被类名调用

实例变量和类变量的区别
1.存放位置
类变量随着类的加载存在于方法区中,实例变量随着对象的建立存在于堆内存里
2.生命周期
类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失
实例变量随着“对象”的消失而消失

静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
  非静态方法可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
  因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字
3.主函数是静态的。
  
  静态的利弊
  利:对 对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份
  可以直接被类名所调用
  弊:生命周期过长,访问出现局限性(只能访问静态)
 

static方法里不能调用非静态成员(方法和属性),非静态方法里可以调用静态方法和属性!

main方法里面调用非静态方法时,需要new一个对象,因为静态方法,静态类属于模板,非静态类和方法属于对象。

【java】面向对象基础

【java】面向对象基础

八、JAVA的参数传值机制_值传递

【java】面向对象基础

【java】面向对象基础

方法2新建了一个对象,对象的地址不同,对象的属性不会被修改

九、继承_interfaceOf的使用

    面向对象的三大特征:继承、封装、多态。

1.继承使用要点:

【java】面向对象基础

2.instanceof 运算符

   

【java】面向对象基础

 

十、方法的重写override_返回值类型问题

    子类通过重写父类的方法,可以用自身的行为替换父类的行为。

【java】面向对象基础

重写(Override)就是指父子类之间的,一定是在不同类之间的(而且是父子关系),方法名和参数必须相同;
           要跟重载(Overload)区分开,它是指同一类内部的(可以是父子关系),方法名相同、参数必须不同。

有一种情况子类是否可以重载父类的方法在父子类的公开方法不在同一个类下,方法名相同、参数不同,单看子类,他继承了父类(有重载方法)的公开方法,此时子类中已经包含了父类的同名不同参的方法,子类也包含了重载方法,此时在子类中添加一个同名不同参的方法还是重载,因为满足重载的特征。

【java】面向对象基础

子类是否可以重载父类的方法载可以发生在子类中吗/h1>

一、争议

这是网上经常被提起的两个问题,有的说不可以,理由重载是同一类中,方法名相同,参数列表不同的一组方法的定义。
但是认为可以的理由是子类可以继承父类所有的公有方法(构造器方法除外),然后在子类中定义与继承方法同名不同参数列表的方法,这也叫重载。

二、个人理解

感觉第一个问题本身的问法就存在问题。没有这一说。 重载可以发生在子类中吗同意 “重载是同一类中,方法名相同,参数列表不同的一组方法的定义”这种看法。 但我们单看子类,他继承了父类(有重载方法)的公开方法,此时子类中已经包含了父类的同名不同参的方法,子类也包含了重载方法,此时在子类中添加一个同名不同参的方法还是重载,因为满足重载的特征。

不同观点,欢迎指正

十一、==和equals方法和equals方法的重写

【java】面向对象基础

【java】面向对象基础

“==” 若比较引用类型,必须地址相等即是同一个对象,否则返回false!

equals方法比较对象内容是否相同

【java】面向对象基础

equals的含义为比较2个字符串是否相等,在源码里面,如果2个String变量指向的是同一个对象,那么直接返回ture

【java】面向对象基础

 

十二、super父类对象引用_继承树追溯问题

【java】面向对象基础

【java】面向对象基础

【java】面向对象基础

 

this和super不能同时出现在构造方法中,是因为this和super都要定义在第一行,所以只能有一个;
那么为什么要定义在第一行呢br>        先说super,因为子类继承了父类的属性和方法,所以在先初始化父类的属性和方法,这样子类才可以初始化自己特有的,因为java中不允许调用没有初始化的成员。

因为实例化一个对象运行两次super是不安全的。this放在第一行,也是因为要先初始化父类和this代表的构造函数先,因为当前构造函数可能用到那些成员,所以那些成员得要先初始化。

          this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

十三、封装的使用_访问控制符

【java】面向对象基础

 

【java】面向对象基础

default的属性和方法,不同包的子类不能访问!没有default这个关键字!不加修饰符,就表示默认的。

 

JavaBean的封装规则:   JavaBean是一种Java类,封装属性和方法的一种规则。

Java bean 是个什么概念际上JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。

javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后我会提供获取属性和设置属性的get/set方法

 

十四、多态

【java】面向对象基础

【java】面向对象基础

十五、对象的转型_向上自动转型_向下强制转型

【java】面向对象基础

 

【java】面向对象基础

Java多态中重载方法参数分别为父类和子类时的疑惑:

能调用那些方法,由引用类型决定,具体执行情况,由实际内存对象类型决定。

 

  十六、final修饰变量、方法和类

【java】面向对象基础

十七、数组的使用_内存分析_动态初始化和遍历_数组越界异常

【java】面向对象基础

 

【java】面向对象基础

 

数组中的3种初始化方式_静态初始化_动态初始化_默认初始化:

【java】面向对象基础

 

数组的遍历_foreach循环: 用于读取数组中的所有元素,不能修改!

【java】面向对象基础

 

十八、抽象类_抽象方法

【java】面向对象基础

【java】面向对象基础

抽象类可以有构造方法,不能用new实例化对象。

抽象方法的意义在于:将方法的设计和方法的实现分离了!

十九、接口详解

      1.为什么需要接口口和抽象类的区别/p>

        接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。

        接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。

      2.接口相关规则

        接口中所有方法都是抽象的。

        即使没有显式的将接口中的成员用public标示,也是public访问类型的

        接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量。
        可以定义一个新接口,用extends去继承一个已有的接口

        可以定义一个类,用implements去实现一个接口中所有方法。

        可以定义一个抽象类,用implements去实现一个接口中部分方法

     3.接口实现

      

【java】面向对象基础

         Java的类只支持单继承,接口支持多继承

【java】面向对象基础

         Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继承的危险性。
                 class Student extents Person implements Runner,Flyer

                {…}

         注意:extends 必须位于implements之前

 

二十、内部类详解

【java】面向对象基础

1.成员内部类(可以使用private、默认、protected、public任意进行修饰。类文件:外部类$内部类.class)

a)非静态内部类

【java】面向对象基础

非静态内部类不能有静态方法、属性、静态初始化块,因为非静态内部类的对象从属于外部类的对象,static修饰的方法、属性从属于类。

b)静态内部类

【java】面向对象基础

总结:

  1. 普通成员内部类可以访问外部类的普通属性、方法,外部类不能直接访问非静态内部类成员
  2. 普通成员内部类可以看做外部类的一个普通属性,它可以直接访问这个类的内容,
  3. 普通内部类对象必须寄宿在外部类对象里面,所以先有外部类对象才有内部类对象。

 

  1. 当一个静态内部类对象存在,并不一定存在对应的外部类对象,所以不能直接访问外部类的普通属性,普通属性从属于对象,
  2. 静态内部类可以直接访问外部类静态的属性和方法。

2.匿名内部类:就是没有名字的内部类,所以只能使用一次。

【java】面向对象基础

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。

匿名内部类在实现时必须借助一个接口或者一个抽象类或者一个普通类来构造,从这过层次上讲匿名内部类是实现了接口或者继承了类,但是不能通过extends或implement关键词来继承类或实现接口。

 

   匿名内部类的注意事项:

(1)匿名内部类不能有构造方法。
(2)匿名内部类不能定义任何静态成员、方法和类。
(3)匿名内部类不能是public,protected,private,static。 
(4)只能创建匿名内部类的一个实例。
(5)一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。  
(6)因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
(7)匿名类和内部类中的中的this:有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
 

3.方法内部类

 

 

 

 

 

 

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91528 人正在系统学习中

来源:无所不能的Tomcat

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年11月17日
下一篇 2018年11月17日

相关推荐