Java概述之面对对象上

一、类和对像

1、定义类

重要概念:类和对象(实例)。类是某一批对象的抽象,对象是具体存在的实体。

定义类的语法格式:
[ 修饰符]class 类名 {多个成员变量、方法、构造器定义 }
定义成员变量的语法格式:
【修饰符】 类型 成员变量名【=默认值】;
定义方法的语法格式:
【修饰符】方法返回值类型 方法名(形参列表){  方法体 }
定义构造器的语法格式:
【修饰符】构造器名(形参列表){ 构造器执行体 }
注意:类名、成员变量名、方法名应为合法的标识符;构造器可以由系统默认;构造器名与类名相同。

2、对象的产生和使用

创建对象的根本途径就是构造器 , 所以创建对象通过关键字 new 加上对应的构造器即可 .
如:Person p = new Person();
类或对象访问方法或成员变量的语法:
类.类变量|方法    或      实例.实例变量|方法。

3、对象、引用和指针

Person p = new Person();
这行代码创建了一个 Person 实例,也被称为对象 ,是实际的person对象,存放在堆中。
这个对象被赋给了 p 变量,是一个引用,存放在栈中。
即:栈内存里的引用变量并未真正存储对象的成员变量,实际数据存放在堆内存中,引用变量只是指向该堆内存里的变量。

4、对象的this引用

this 关键字总是指向调用该方法的对象, 在方法里的this指谁调用就指谁。
:this 不能用在有static修饰的方法中 .

二、方法详解

1、方法的所属性

一个类中的方法如果用  static 修饰了,这个方法就属于这个类,否则属于这个类的对象。

2、方法的参数传递机制

传递方式只有一种:值传递。
参数本身不会有任何影响。

3、形参个数可变的方法

以个数可变形参来定义方法,在最后一个形参的类型后增加三点(. . . )。

public static void test(int a,String...books);

长度可变的形参只能位于最后一个参数,且一个方法只能有一个可变长度的参数。

4、递归方法

一个方法体内调用它自身,被称为方法递归。
递归一定要向已知方向递归。

5、方法重载

如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。
方法的重载要满足两个条件 ( 两同一不同):
1. 同一个类中,方法名相同; 2. 形参不同。和返回值类型无关 . 所以在调用这些方法时要传入不同的参数值 .

三、成员变量和局部变量

1.成员变量和局部变量是什么

成员变量指的是在类范围里定义的变量;局部变量指的是在一个方法内定义的变量。

成员变量分为类变量和实例变量。
类变量由static修饰,属于类,与类共存亡,通过类或者实例访问时都是类的变量。
实例变量不以static修饰,属于实例,与实例共存亡,通过实例访问。
在整个类中有效。且成员变量不能同名。

局部变量分为形参,方法局部变量和代码块局部变量。
形参是在定义方法签名是定义的变量,只作用于整个方法。
方法局部变量是在方法体内定义的局部变量,从定义起到方法结束有效。
代码块局部变量是在代码块中定义的局部变量,从定义起到代码块结束有效。
方法局部变量和代码块局部变量必须初始化,否则不能访问。

局部变量和成员变量可以同名,方法内引用被局部变量覆盖的成员变量使用this(实例变量)或类名(类变量)作为调用者来访问。

2.成员变量的初始化和内存中的运行机制

当类被加载时,类变量就在内存中分配了一块空间。
当对象被创建时,实例变量就在内存中分配了内存空间。
并在分配空间后,系统自动为成员变量指定初始值。

3.局部变量的初始化和内存中的运行机制

局部变量赋初始值后,系统才为其分配内存,并保存初始值。
除形参外,局部变量都必须显示初始化。

4.变量的使用规则

成员变量的作用域扩大到类存在范围或者对象存在范围的害处:
增大了变量的生存时间,导致更大的内存开销。
扩大了变量的作用域,不利于提高程序的内聚性。

四、隐藏和封装

1.理解封装

封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部的操作和访问。
即:合理隐藏,合理暴露

2.使用访问控制符

private私有的。在同一个类里能被访问。
default默认的。包访问权限
protected受保护的。子类中也能访问
public公共的。在任何地方都可以访问
提供setter和getter方法操作和访问私有成员变量

使用原则:绝大部分成员变量用private修饰;类变量,全局变量考虑用public修饰;工具方法用private修饰;父类中希望被子类重写的方法用protected修饰;希望他类自由调用的方法用public修饰;构造器用 public  修饰;大部分外部类用public修饰。

3.package 、import  和import static

package 打包格式:package  包名;放在程序开始的顶端。

包机制的两个方面的保证。 1. 源文件里要使用 package 语句指定包。 2.class 文件必须放在对应的路径下。

import  向某个Java文件中导入指定包层次下某个类或全部类。
语法: import package .  subpackage . . .ClassName ;(单个类)   import package 。subpackage 。。。*;(全部类)

import static 静态导入,导入的是类的静态属性。如: import static package.className .*;

Java源文件的大体结构:
package 语句
import | import static 语句
public classDefinition  ( 类) | interfaceDefinition (借口) |  enumDefinition (枚举)  

4.Java的常用包

java.lang .*, 核心类
java.util .*,   大量工具类、接口和集合框架类、接口
java.net.*,   网络编程相关的类、接口
java.io.*,     输入,输出相关的接口、类
java.text .*,   格式化相关的类
java.sql .*,    JDBC数据库编程的相关类、接口
java.awt .*,   抽象窗口工具集
java.swing .*.   Swing图形用户界面编程

五、深入构造器

1.使用构造器执行初始化

构造器最大的用处就是在创建对象时执行初始化,系统会默认的进行初始化。

如果程序员没有Java类提供任何构造器,则系统会为这个类提供一个无参的构造器。
一旦程序员提供了自定义的构造器,遇系统不再提供默认的构造器。

2.构造器重载

构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。
在构造器中可通过this来调用另外一个重载的构造器。

六、类的继承

1.继承的特点

Java 通过关键字extends来实现,实现继承的类称为子类,被继承的类称为基类、超类、父类。父类是大类,子类是小类。
Java 继承子类只有一个直接父类,有无限个间接父类。
子类继承父类的语法格式如下:
修饰符 classsubclass extends superclass { 。。。。。。}
子类扩展了父类,将可以获得父类的全部属性和方法,但不能获得父类构造器

2.重写父类

子类包含与父类同名方法的现象被称为方法重写,也被称为方法覆盖。
方法的重写要遵循“两同两小一大”指的是:方法名相同,形参列表相同。返回值类型更小或相同,抛出的异常更小或相同,访问控制权限要更大。
子类的对象无法访问父类中被覆盖的方法,但子类方法中可以调用父类方法中被覆盖的方法。

3.super限定

子类方法中通过关键字super来调用父类的方法或属性。
super不能限定子类构造器和static修饰的方法中的实例变量。

4.调用父类构造器

子类构造器总会调用父类构造器。
如果子类构造器没有显式使用 super 调用父类构造器;子类构造器默认会调用父类无参数的构造器。
创建一个子类实例时, 总会先调用最顶层父类的构造器。

七、多态

1.多态性

同一个类型的多个实例,在执行同一个方法时呈现出多种的行为特征就叫做多态。
编译时类型:声明该变量是指定的类型,在Java程序的编译阶段,Java编译器只认编译时类型。
运行时类型(实际类型):该变量实际所引用的对象的类型。

如果编译时类型和运行时的类型不一致,这就有可能出现所谓的多态。

Java执行方法时,动态绑定,方法总是执行该变量实际所指向对象的方法。

2.引用变量的强制类型转换

向上转型:子类对象可以直接赋值给父类变量,自动完成。
向下转型:父类变量直接赋给子类变量。

强制类型转换:类型转换运算符是小括号,语法如下 typevariable
注意:强制转换符只能在编译类型具有继承关系的变量之间进行;转换的目标类型应该是被转变量的实际类型。

3.instanceof运算符

instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的类,或者是子类、实现类的实例。是则返回true,否则返回false。
作用:在进行强制转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功转换,从而保证代码更加健壮。

八、继承与组合

1.使用继承的注意点

尽量隐藏父类的内部数据;不要让子类随意访问、修改父类的方法;尽量不要在父类构造器中调用将要被子类重写的方法。
派生子类的条件:子类是一种特殊的父类;

2.利用组合实现复用

组合是把旧类对象作为新类的成员变量组合起来,用以实现新类的功能,用户看到的是新类的方法,而不能看到被组合对象的方法。
继承是对已有的类做一番改造。
若有明确的整体、部分的关系,可以用组合。
继承要表达的是一种“是”的关系,组合表达的是“有”的关系。

九、初始化块

1.使用初始化块

初始化块的语法格式:
【修饰符】{   // 初始化块的可执行代码  }
修饰符只能是static   使用其修饰的称为静态初始化块
系统总是先调用该类里定义的初始化块。

2.初始化块和构造器

初始化块是构造器的补充,初始化块总是在构造器执行之前执行。初始化块是一段固定执行的代码,不能接收任何参数。

3.静态初始化块

如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块。静态初始化块总是比普通初始化块先执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值