目录
四:Java类设计
1.类
类的基本特点
-
类是对某一事物抽象的描述,对象是某一类中的一个具体的实例或者多个具体的示例;并且类是创建对象的模板
-
类中有封装和隐藏的作用
-
类中封装有成员属性:成员属性是对类的静态描述
-
类中封装有成员方法:成员方法是对类的动态描述
类声明{ 成员变量的声明; 成员方法的声明; } 类声明的完整格式: 修饰符 class<泛型> 类名 extends 父类 implements 接口列表 /** *修饰符: *(1)访问控制修饰符(public,private,default,protected) *(2)abstract(抽象类) *(3)final(最终的) *(4)static(静态的) * *继承(extends): *(1)属性的继承 *(2)方法的继承 * *接口(interface)(后面在详细介绍) *(1)接口的特点? *(2)接口中成员属性的特点? *(3)接口中成员方法的特点? */
局部变量与成员变量
-
局部变量:方法中的变量,不可以使用修饰符(访问控制修饰符,abstract,static都不可以)
-
成员变量:在类中,可以使用
-
注意:都可以使用final修饰(定义为常量,不可以被修改)
成员变量的基本特点
-
父类的所有成员变量都会被继承(private也会被继承)
-
成员变量可以被“覆盖”(创建子类的时候会同时创建所有成员变量)
-
使用this关键字可以访问本类的成员变量
-
使用super()关键字可以访问父类的构造方法给父类成员变量赋值
-
即使父类成员变量为private,但是创建子类的时候仍然创建了该变量,只是无法被直接访问
成员方法的基本特点
-
成员方法中有一类特殊的方法叫构造方法(后面详细介绍构造方法)
-
方法有方法名字,方法体(取名字最好满足阿里巴巴开发手册)
-
如果为abstract修饰的方法,就可以不用写方法体,但是需要子类实现(抽象方法其实就是一个接口)
-
static关键字可以让方法直接使用类名字访问(静态的)
-
java方法传递都是形参(只传递值,引用(地址))
方法的重载
-
在原有方法上在写一个与原方法名相同的方法
-
但是要求参数必须不同(类型不同,或者个数不同);顺序不同也可以(在类型不同的基础上)
-
单纯的访问控制修饰符不同,不算方法的重载
-
简单的说,就是两个方法满足(1)名字相同;(2)参数列表的类型依次匹配不相同(Integer与int也满足)
-
考试的时候很容易考察
方法的重写
-
@override注解:检查方法重写是否正确(告诉程序这个是重写的方法,帮我检查一下;同时也可以告诉阅读者)
-
方法的重写发生在子类与父类中(子类重写父类方法)
-
方法签名必须相同(方法名和参数)
-
其实成员方法没有“覆盖”的概念(但是可以近似的实现)
-
方法的“重写”就是方法的“覆盖”;其实就是叫法不同而已
构造方法深入理解
-
构造方法是实例化类的方法,即创建对象时使用
-
构造方法的作用通常是初始化对象
-
如果程序员不写构造方法,编译器则会自带一个无参构造方法;如果写了,则不带
-
留一个问题:所有类(接口)都有构造方法吗?
-
抽象类有构造方法(使用子类构造方法的时候,都会先调用父类的构造方法(super关键字))
-
但是接口不可以有构造方法,接口不可以被实例化(抽象类和接口相似,但是有区别)
-
实例化子类的时候如果不指定父类构造方法,会默认调用父类的无参构造方法
-
同一个类中,一个构造方法中可以访问其他构造方法
main方法深入理解
-
main方法是程序的入口,程序可以有多个main方法(即多个入口)
-
在我们打包jar包或者war包的时候,会指明将哪个main方法作为入口
-
举个例子,就像是exe文件一样,它作为程序的入口只能有一个;但一个程序可以有多个exe文件
-
String[] args:args为一个字符串变量,便于在程序启动的时候注入参数
-
main方法处于一个类中,并且main方法是public和static的
-
public(公开的)和static(静态的)是为了便于jvm能够找到main方法,并且启动程序
-
......(关于main方法的更多可以自己慢慢去发现,探索)
Object类深入理解
-
Object类是一切类的父类(间接父类)
-
不写extend其实就是默认继承了Object类;写了就是间接继承了Object类(因此创建的所有类都有Object类中方法)
-
Object类中含有这些方法(下面简单介绍一下)
-
getClass()方法:返回对象执行时候的Class实例
-
hashCode()方法:hashcode就是在hash表中有对应的位置
-
equals()方法:使用的是“==”;比较的是地址(String类重写了该方法,使得可以比较String字符串的内容)
-
clone()方法:在Java语言中, clone方法被对象调用,所以会复制对象
-
toString()方法:重写很简单,其实就是返回该类中所有成员属性的值
-
notify()方法:能够唤醒一个正在等待这个对象的monitor的线程
-
notifyAll()方法:能够唤醒所有正在等待这个对象的monitor的线程
-
wait(long)方法:能让当前线程阻塞
-
wait(long,int)方法:能让当前线程阻塞
(5与集合框架有关,9—12都与多线程有关)
equals方法与“==”深入理解
-
equals方法在Object类中;使用的是“==”,比较的是地址
-
String类中重写了该方法,使起可以比较,String字符串是否相等
-
如果我们也像比较类对象是否相等;就需要重写该方法(具体的重写可以看String类的,仿照着写几遍就会了)
-
后面会详细深入介绍String字符串类
toString方法深入理解
-
返回本类中的所有成员属性
-
自己定义的类需要使用的话,需要重写该方法(很easy)
2.对象(*)
对象基本特点
-
对象的定义:对象是类的实例化
-
对象通过new创造,并且用引用去指向
对象的声明
-
创造一个实例化对象分两步
-
第一步:创建引用去指向(接受)对象;有继承关系的话还可以,利用多态的性质接受不同的对象
-
第二步:通过new(调用构造方法)实例化对象
-
注意:如果没有第二步的话,会报错(空指针异常)
对象的创建
-
使用new创建对象
-
使用反射原理创造对象(反射的时候再介绍)
-
等等......
Java垃圾回收机制(GC)
-
Java垃圾回收机制先了解一下概念,以后会在深入理解Jvm的时候谈到
-
GC的垃圾回收算法
-
JDK 8以后几乎每一代的版本都会去优化GC
instanceof运算符
-
instanceof是java里面特有的运算符
-
用于判断一个对象是否是属于某个类
-
继承关系,也是可以判断
对象的引用深入理解
-
对象的引用就是指针
-
多态的性质,可以使父类引用指向子类对象
this引用与super引用
-
this使指向本类中某一个对象的一个变量,this相当于“我”,可以指向成员属性或者方法
-
如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据(this.成员属性,this( ),this.成员方法( ))
-
在一个构造函数中可以调用另外一个构造函数初始化对象
-
super关键字可以指向父类的成员属性或者成员变量
-
this.成员属性,this( ),this.成员方法( )
参数传递
-
参数传递都是传递的值,并不是参数本身
-
引用类型的(即类)传递的是指针(如:数组,包装类)
static关键字深入理解
-
只能修饰内部类;无法修饰顶层类(外部类)
-
修饰成员属性:成员属性变成公有的,所有实例对象访问的是同一个(学生类中,学生的总身高)
-
修饰成员方法:使方法变成静态的
-
通过类名就可以直接访问,不需要new出对象;但是通过对象也可以访问,只是不推荐
3.访问控制修饰符
关键字
-
public:公开的
-
protected:使不同包的子类可以访问
-
default(默认的)
-
private:私有的,只有本类中可以访问
修饰类
-
同一个文件中,只能有一个类是公开的(public)
-
那个公开的类只能是public或者default的;都是默认的也可以
-
对于顶层类(外部类)来说,只有两种修饰符:public和默认(default)
-
内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public);其实就是将内部内看成一个成员方法
修饰成员属性
-
public:所有类都可以访问
-
protected:同一个包和不同包的子类可以访问
-
default:同一个包中可以访问
-
private:同一个类才可以访问
修饰成员方法(构造方法)
-
public:所有类都可以访问
-
protected:同一个包和不同包的子类可以访问
-
default:同一个包中可以访问
-
private:同一个类才可以访问
4.内部类(*)
内部类的分类
-
成员内部类:与成员属性或者成员方法并列
-
局部内部类:
-
匿名内部类:
-
静态内部类:
5.Java的包
包简介
-
包定义:包其实就是一个文件夹
-
作用:方便管理类,可以将作用相似的类放在同一个包中(关键字package)
-
类的完整名称为:包名 + 类名;所以说不同包中类名可以相同,其实完整名字并不相同
-
在不同的包下,类(.class文件)的名称可以重复
-
在相同的包下,类(.class文件)的名称不可以重复
improt关键字详解
-
在使用其他包中的类的时候,需要写类的完整名字
-
因为类的完整名字为:包名称+类名称;因此显得代码非常冗余,非常麻烦
-
因此sun公司引入了导包的机制
-
先将要使用的类所在的包improt导入该类,然后再使用类的时候就不需要写包名了
-
因为我已经引入了包了,不会再出现只用类名表示意思含糊的情况了(同一个包中类名必须相同)
-
注意:导入包与否与访问控制修饰符无关;如果包中类的成员属性或者成员方法为private的,依旧无法访问
-
简单的说:improt导包就是为了简化代码的
import java.util.Scanner; //导入包具体到类 import java.util.*; //不具体到类,导入该包中所有的类