/ 前言 /
面向对象OOP是基于面向过程而言,面向对象简单来说就是将功能封装到对象(数据和操作结合)里,我们面向对象,让对象去完成这些功能。万物皆对象。
(在我们程序员眼中,一切皆对象)
理解面向对象,经典案例:把大象塞进冰箱
面向过程的做法:1.打开冰箱门 2.把大象塞进去 3.关闭冰箱门 当有两个不同的人用不同的方法实现这样的步骤,我们需要为不同的人量身定做不同解决事情的方法。
面向对象,找个对象帮你做事 我们把冰箱作为对象,1.冰箱门可以被打开 2.大象可以被塞进去 3.冰箱门可以被关闭(面向对象写出通用的方法,屏蔽了所有人的差异)
/ 正文 /
static的含义
继承的规则
子类实例化的过程
方法的覆盖
final关键字
抽象类的特性
接口的规范
数据类型的转换
包和访问权限修饰符
包装类和内部类
static可以修饰的元素
属性 – 共享
方法 – 访问的方式
块 – 执行的时机
只能修饰类成员,不能修饰局部变量。
需要注意的问题:
静态方法可以直接访问静态变量,如要访问非静态变量必 须先实例化。
静态方法中不能this。
静态方法不能被非静态方法覆盖。
所有对象共享
也称为类变量
两种方式访问:
类名.属性;
对象名.属性
不需要实例化,可以直接访问;
也称为类方法
两种方式访问:
直接访问:类名.方法名();
实例化后访问:对象名.方法名();
作用:
简化方法的使用;
便于访问静态属性;
限制:
静态方法只能直接访问静态成员。静态方法中不能this;
静态方法不能被非静态方法覆盖;
必须public权限修饰符
必须static静态修饰符
必须返回空值void
main函数名不可改变
String[] args命令行参数
隐式赋予变量默认值;
显式赋予初始值;
构造方法体赋予新值;
静态程序块
非静态程序块
格式:修饰符 class 子类名 extends 父类名
Java中只能单继承,也就是说每个类只能有一个父类。
父类的别名:
基类BaseClass
超类SuperClass
子类的别名:
衍生类
Child Class
Derived Class
子类继承父类的所有属性和所有方法;
但是构造器不继承;
子类实例化是先实例化其父类,然后实例化子类。
要先调用父类的构造器,父类构造器运行完毕,才调用子类的 构造器。
如果实例化类D,说出构造器执行的顺序。
super()
指向父类的引用。
作用:调用父类的构造器
只能出现在子类的构造器中,且必须是第一行
super()中的参数,决定了调用父类哪个构造器
如果子类构造器中没有出现super,那么默认super(),即调用父类的空构造器。
this()
指向本类的引用。
作用:调用本类的构造器
只能写在构造器的第一行
在同一个构造器中super()和this()不能同时出现
所谓 “覆盖(override)” 是在声明子类的成员方法时,其名称和参数都与父类的成员方法的名称和参数一样,在面向对象的程序设计中称为方法的覆盖。
规则
在父子类之间继承时发生
多个方法的名称相同
返回值类型必须相同
每个方法参数数量和参数类型和顺序相同
权限修饰符要求:子类方法的要不小于父类方法的
子类方法只能抛出父类方法异常或其异常的子类。
方法覆盖如下例所示:
父类方法:protected void getArea( int w, int h) throws IOException;
子类方法:public void getArea( int x, int y) throws FileNotFoundException;
final可以修饰的元素:
变量(属性和局部变量和形参):不能被重新赋值
在声明的同时赋值
方法:不能被覆盖,即不能修改。类:不能被继承 注:* final类型的属性比较特殊,可以在声明的同时赋值,还可 以在构造器中赋值,在其他的方法中不能够赋值。
常量一般定义成下面的形式:
public static final double PI=3.14;
首先:
一般把它设置为静态static,多个实例共享该常量,没有必 要每个对象保存一份;
其次:
设置为final类型,赋值以后不能再改变;
第三:
注意遵守常量命名规范,所有字母大写,单词之间使用下 划线,如MAX_VALUES。
只有方法声明,没有方法实现的方法;
抽象方法用abstract声明,以“;”结尾。
public abstract void getArea();
含有抽象方法的类必须声明为抽象类;
用abstract声明class
public abstract class Rectangle{
public abstract void getArea();
}
注意:
抽象类不能被实例化;
其包含的抽象方法必须在其子类中被实现,否则该子类只 能声明为abstract;
抽象方法不能为static;
在下列情况下,一个类必须声明为抽象类:
当一个类的一个或多个方法是抽象方法时;
当类是一个抽象类的子类,并且没有实现父类的所有抽象 方法,即只实现部分;
当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;
本质
抽象类是抽象方法和非抽象方法的集合
特殊情况
全部是抽象方法
全部为非抽象方法
实际上是一套规范
接口不是一个类,不能实例化;
接口是常量和抽象方法的集合;
接口对类来说是一套规范,是一套行为协议;
定义格式如下:
public interface MyInterface
{
interfaceBody
}
接口实质上就是一个常量和抽象方法的集合。为了使用一个接口,你要编写实现接口的类。
如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象。
格式如下:
public class MyClass implements MyInterface{
//实现接口中所有抽象方法
}
接口使用interface关键字来定义,而不是class。
接口中定义的变量都是公共静态最终变量。
接口中没有自己的构造函数,而且接口中定义的方法全部都是 抽象方法,即只提供方法的定义,而没有提供方法的具体实现的语句。
接口采用多继承机制,而不像类一样采用单继承机制。
接口默认:
常量:public static final
抽象方法:public abstract
接口不能含有任何非抽象方法,而抽象类可以。
类可以实现许多接口,但只能有一个父类。
接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。
public static final int MAX_SPEED=100;
有三种方式:
对象名.MAX_SPEED
类名. MAX_SPEED
接口名. MAX_SPEED
前提:具有继承关系
原则:子类就是父类
向上造型:子类转换为父类,自动转换;
向下造型:强制转换
曾经向上转换过的对象,才能再向下转换。
向上转换损失了子类新扩展的属性和方法
仅剩下父类中声明过的属性和方法
Person p = new Student();
Student s = (Student)p;
instanceof运算符的一般格式:
object instanceof class
object instanceof interface
返回值都是boolean
本质上遵守引用类型的转换规则
分为两种表现形式
赋值多态
传参多态(隐式的赋值多态)
多态的机制
Override
Object类是所有类的超类,在Object类中定义的方法,在所有 类中都可以使用。
一个类可以不是Object类的直接子类,但一定是Object类的子 类,Java中的每一个类都是从Object扩展来的。
Object是Java语言中唯一一个没有父类的类。
Object类常用方法:
public int hashCode()
返回十六进制整数,唯一标识一个对象
public String toString()
返回 类名@hashcode
public boolean equals(Object obj)
比较两个对象引用的值是否相等(比较地址)
理解equals()方法和==运算符的区别是非常重要的。
equals()只能比较引用类型,==既能比较引用类型又能比较 基本类型。
equals()方法从Object类继承
原意:比较对象引用的值
一般都被子类方法覆盖,不再比较引用的值
==运算符
比较基本数据类型:相当于算术等号
比较引用数据类型:比较引用的值,不能被覆盖。
java.lang
Java语言包,任何程序中,该包都被自动导入。
java.awt
图形用户界面包。
java.awt.event
图形用户界面事件处理包。
java.swing
跨平台轻量级组件包。
java.sql
数据库访问包。
java.io
这个包由对您的输入/输出操作有用的类组成。
java.util
该包提供了许多创建如:lists, calendar, date等所需要的类和接口。
java.net
该包提供了许多进行TCP/IP网络编程的类和接口。
导入包中所有的类:import package_name.*;
依照下列语法导入单个类:import package_name.class_name;
导入网络包中所有的类:import java.net.*;
public > protected > friendly > private
封装
权限/位•置 | private | friendly | protected | public |
---|---|---|---|---|
类内部 | √ | √ | √ | √ |
同包无继承关系类 | √ | √ | √ | |
同包子类 | √ | √ | √ | |
不同包子类 | √ | √ | ||
不同包无继承关系类 | √ |
Everything is object.
Java编程语言不把基本数据类型看作对象。
Java 编程语言提供包装类来将基本数据类型看作对象。
基本数据类型:byte char short int long float double boolean
引用数据类型:Byte Character Short Integer Long Float Double Boolean
包装类的创建办法
基本数据类型通过构造器转换为包装类
int pInt = 500;
Integer wInt = new Integer(pInt);
Integer a=new Integer(3);
包装类的常用方法
primitive wrapper
Contructor
String wrapper
Contructor(除Character,注意Boolean)
static valueOf( String s) 静态有参数
wrapper primitive
typeValue() 无参数
String primitive
static parseType()
equals()
toString()
内部类就是定义在另一个类内部的类。
内部类对于同一包中的其它类来说,内部类能够隐藏起来。
内部类与外部类
无需创建外部类的对象,即可从内部类访问外部类的变量和方法。
必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。
如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。
不能定义static变量
从其他类访问内部类
在Outer内访问Inner,只需如下:
Inner in=new Inner();
在Outer外访问Inner,必须如下:
Outer o = new Outer(); //实例化外部类
Outer.Inner oi=o.new Inner(); //实例化内部类
内部类的权限修饰符
普通类的访问控制方式
friendly
public
内部类定义为
private
protected
public
friendly
静态内部类
Outer.Inner inn=new Outer.Inner();
非静态内部类不可以使用上面的方式
可以定义static变量
就相当于定义在外部的类。
局部内部类
Outer.Inner inn=new Outer.Inner();
非静态内部类不可以使用上面的方式
可以定义static变量
就相当于定义在外部的类。
class A{
int a;
public void method(){
}
class B{ }
}
class A{
int a;
public void method( int c ){ int b=0;
class B{ }
}
}
匿名内部类
匿名内部类:
顾名思义,匿名内部类就是没有类名的内部类.
/ 总结 /
本文主要讲了面对对象的高级特性和用法,这是面对对象的高级用法总结,理解好这些会有助于我们更加去深入了解java这门语言。
往期推荐:
如何入门做软件开发
为什么我不推荐入行程序员
做全栈开发很难吗
关注我的公众号,学习技术或投稿
长按上图,识别图中二维码即可关注