面向对象(一)

面向对象基础

版权声明:任何人不得以非法或盈利目的进行营销,转载须经本人同意.本人不为此内容正确与否负责.

面向过程和面向对象都是对软件分析,设计和开发的一种思想(相辅相成),它指导者人们以不同的方式去分析,设计和开发软件

基本概念

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

构造器(方法)

在这里插入图片描述
构造方法的重载和普通方法基本没有区别
构造方法的第一句总是super()

注意:
* 1.构造方法没有返回类型
* 2.构造方法的方法名即类名
* 3.一个类中如果没有提供任何构造方法,则系统会自动提供一个默认的空参构造器
* 如果一个类中已经定义了构造方法,则系统就不会自动提供默认的空参构造器了
*
* 构造方法和set方法的异同:
* 相同:都可以给对象赋值
*
* 不同:
* a.赋值时机不同,构造方法是在创建对象时赋值,set方法是在创建对象后赋值
* b.使用次数不同,构造方法只能使用一次来赋值,set方法可以使用任意多次
* c.验证方式不同,set方法可以添加参数验证 ,构造方法默认情况下无法判断
*
* 问题:如果想要让构造方法也可以实现参数有效性判断?
* 在构造方法中直接调用已经写好判断能力的set方法即可

.......
public Customer(String name, String phone, String address) {
		//this.name = name;

		//调用自己类中的set方法实现name赋值,由于set方法已经做过参数有效性判断,
		//所以此处同样具有相同功能
		setName(name);
		this.phone = phone;
		this.address = address;
	}
	......
	public void setName(String name) {
		if (name.equals("梅超风")) {
			this.name = "admin";
			return;
		}
		this.name = name;
	}
	

this的本质

创建一个对象分为如下四步(三步):

  1. 分配对象空间,并将对象成员变量初始化为0/false/null

  2. 执行属性值的显示初始化
    3(2). 执行构造方法(因此,执行构造之前,对象已经创建完毕->1-2)

  3. 返回对象的地址给相关的变量

  4. this可以表示->当前对象
    this的本质就是"创建好的对象的地址".优于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表"当前对象".(写实体类时,创建构造方法-> this.a=a;…)

  5. 可以通过this在构造方法中__调用构造方法__(重载构造方法时减少冗余)

public class TestThis{
	..........
	TestThis(int a){
		this.a = a;
	}
	TestThis(int a,int b){
		this(a);            //注意:调用构造方法的语句只能放在第一句
		this.b = b;
	}
}

  1. this不能用于static方法中
    原因:this表示当前对象,而对象的数据信息存放在堆内存中,而static存放在内存中的方法区,获取不到
    而且static不能访问非static属性和方法也能体现于内存划分.

static

  1. 静态方法
  2. 静态属性–类加载时只执行一次,执行的时机是在类加载过后
    注意:一切静态属性/静态方法的初始化时机都是早于普通属性和普通方法
    类加载->初始化静态成员(一次)->初始化普通成员(多次,根据调用构造方法)
  3. 静态代码块
  4. 静态导入 – 导包时,import static com.corejava.util.DateUtil.parseDate;
    parseDate()即可直接使用,不需要前缀(效果相当于在本类定义此方法)
    在类中,用static声明的成员变量为静态成员变量,也称为类变量.类变量的生命周期和类相同.在整个应用程序执行期间都有效
    static修饰的成员变量和方法从属于类,普通变量和方法从属于对象

静态初始化块
构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员
注意:
静态初始化执行顺序

  1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止
  2. 构造方法执行顺序和上面顺序一样!

语句块

语句块分为四种

参数传值机制

java中,方法中所有参数都是"值传递",也就是"传递的是值的副本",也就是说,我们得到的是"原参数的复印件,而不是原件".因此,复印件改变不会影响原件(引用类型也是传值,但它的值是地址)

package

  1. 通常是类的第一句非注释性语句
  2. 包名:域名倒着写即可.再加上模块名,便于内部管理
    注意:
  3. 写项目时都要加包,不要使用默认包
  4. com.buendia和com.buendia.car,这两个包没有包含关系,是两个完全独立的包(只是逻辑上前者包含后者)

import

  1. java.lang是java核心包,不需要导入直接使用(默认导入其包下的所有类)
  2. 如果导入两个同名的类,只能用包名+类名来显示调用相关类

extends

  1. 父类也称作超类,基类,派生类
  2. java中类只有单继承,但接口有多继承
  3. 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)
  4. 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
  5. eclipse中默认按ctrl+T可以查看类的继承树

instanceof 运算符

二元运算符,左边对象右边类,当对象是右边类所创建对象时(或者对象所属类的父类),返回true,否则false

override

子类通过重写父类的方法,可以用自身的行为替换父类的行为
__注意:__方法重写需要符合下面三个要点

  1. “==” : 方法名,形参列表相同
  2. “<=”: 返回值类型和声明异常类型,子类小于等于父类
  3. “>=”: 访问权限(范围),子类大于等于父类(如父类方法为public,则子类只能是public)

Object类(java.lang)

是所有java类的根基类,也就意味着所有的jav对象都拥有Object类的属性和方法
Object类中定义有public String toString()方法.其返回值是String类型,Object类中toString()源码为:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

根据如上可知,默认会返回"类名+@+16进制的hashcode",在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法

"==“和"equals()”

"=="代表比较双方是否相同.如果是基本类型,则表示值相等,如果是引用类型则表示地址相等即:是同一个对象
Object类中定义有:(我们经常重写它)
public boolean equals(Object obj)
return (this == obj);

提供定义"对象内容相等"的逻辑 注意,Object中的equals()底层用"=="实现
String(其他很多类也重写了)中重写了equals(),可以很方便的用equals()进行String字符串的值的比较,而非地址

super

super是__直接__父类对象的引用.可以通过super来访问父类中被子类覆盖(重写)的方法或属性
使用super调用普通方法时,语句没有位置限制,可以在子类中随便调用
若是构造方法的第一行代码没有显式调用super(…)或者this(…),那么java默认都会调用super(),含义是调用父类的无参构造方法,这里的super()可以省略

继承树追溯

属性/方法查找顺序(例如查找变量h)

  1. 查找当前类中有没有属性h
  2. 一次上溯每个父类,查看每个父类中是否有h,直到Object
  3. 如果没找到,则编译错误
  4. 上边1-3,只要找到h,则此过程终止
    构造方法调用顺序
    构造方法第一句总是:super(…)来调用父类对应的构造方法.所以流程就是先追溯到Object,然后再依次向下执行类的初始化块和构造方法,知道当前子类为止.
    __注意:__静态初始化块调用顺序,与构造方法调用顺序一样

封装(高内聚,低耦合)以及访问控制符

java是使用"访问控制符"控制哪些细节需要封装,哪些细节要暴露.
java中4中"访问控制符",分别为private,default,protected,public,他们说明了面向对象的封装性

修饰符同一个类同一包中子类所有类
privateY
defaultYY
protectedYYY
publicYYYY

一般使用private访问权限
写boolean变量的get方法时is开头

多态

指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同
多态要点

  1. 多态是方法的多态,不是属性的多态(多态与属性无关)
  2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
  3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了

对象转型

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型准换
向上转型后父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法
这时,我们就需要进行类型的强制转换,称之为向下转型.
在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型).否则会出现类型转换异常ClassCastException.

final

作用

  1. 修饰变量:被它修饰的变量不可改变.一旦赋了初值,就不能被重新赋值
  2. 修饰方法:该方法不可被子类重写,但是可以被重载
  3. 修饰类:修饰的类不能被继承.如Math,String等

foreach增强for循环

增强for循环for-each是JDK1.5增加的功能.专门用于读取数组或集合中的所有元素.即对数组进行遍历

final
作用

  1. 修饰变量:被它修饰的变量不可改变.一旦赋了初值,就不能被重新赋值
  2. 修饰方法:该方法不可被子类重写,但是可以被重载
  3. 修饰类:修饰的类不能被继承.如Math,String等

foreach增强for循环

增强for循环for-each是JDK1.5增加的功能.专门用于读取数组或集合中的所有元素.即对数组进行遍历

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值