1、对象:软件中真实存在的单个个体/东西
类:类别/类型,代表一类个体
2、类是对象的模子,对象是类的具体的实例
3、类中可以包含:
(1)对象的属性/特征-----------------------成员变量
(2)对象的行为/动作-----------------------方法
4、一个类可以创建多个对象
5、访问对象
数据类型 引用类型变量 指向 对象
Student zs = new Student();
6、成员变量:写在类中,方法外--------有默认值
局部变量:方法中------------------------没有默认值
java规定:成员变量和局部变量是可以同名的,使用的时候默认采取的是就近原则
1、发生在同一类中,方法名相同,参数列表不同
2、编译器在编译时会根据方法的签名自动绑定方法
3、方法的签名:方法名+参数列表
byte,short,int,long,char-------------0
float,double-------------------------0.0
boolean------------------------------false
引用类型------------------------------null
1、作用:给成员变量赋初始值
2、与类同名,没有返回值类型(连void都没有)
3、在创建(new)对象时被自动调用
4、若自己不写构造方法,则编译器默认提供一个无参构造方法,若自己写了构造方法,则不再默认提供
5、构造方法可以重载
1、指代当前对象,哪个对象调用方法它指的就是哪个对象
只能用在方法中,方法中访问成员变量之前默认有个this.
2、this的用法:
(1)this.成员变量名-------------访问成员变量
注:成员变量与局部变量同名时,若想访问成员变量则this不能省略
(2)this.方法名()-----------------调用方法(了解)
(3)this()---------------------------调用构造方法(了解)
表示空,没有指向任何对象,若引用的值为null,则该引用不能进行任何点操作了,若操作则发生NullPointerException空指针异常
1、给元素赋值需要去new个对象
2、若想访问对象的数据,需要通过数组元素去打点
1、作用:代码复用
2、通过extends来实现继承
3、超类/父类:共有的属性和行为
派生类/子类:特有的属性和行为
4、派生类既能访问自己的,也能访问超类的,但超类不能访问派生类的
5、一个超类可以有多个派生类,一个派生类只能有一个超类-----------单一继承
6、具有传递性
7、java规定:构造派生类之前必须先构造超类
(1)派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
(2)派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
注:super()调用超类构造方法,必须位于派生类构造方法的第一行
8、泛化:将共有的抽出来的过程,泛化是设计层面的概念,从代码实现层面来说咱们就是继承,泛化就是继承
super的用法:
(1)super.成员变量名----------------------访问超类的成员变量
(2)super.方法名()---------------------------调用超类的方法
(3)super()-------------------------------------调用超类的构造方法
1、超类型的引用指向了派生类的对象
2、能点出来什么,看引用的类型
class Eoo{
Eoo o1 = new Eoo();
}
class Doo extends Eoo{
Doo o1 = new Doo();
}
public class Test{
public static void main(String[] args) {
Eoo o3 = new Doo() //向上造型
}
}
1、发生在父子类中,方法名相同,参数列表相同
2、重写方法被调用时,看对象的类型
3、当派生类觉得超类的行为不够好时,可以重写
4、重写的规则:两同两小一大
(1)两同:方法名相同,参数列表相同
(2)两小:
1)派生类方法的返回值类型小于或等于超类方法的
①void和基本类型必须相等
②引用类型必须小于和等于
2)派生类方法抛出的异常必须小于超类的
(3)一大:派生类方法的访问权限必须大于超类方法的
5、重写与重载的区别
(1)重写:发生在父子类中,方法名相同,参数列表相同,一般用于在派生类中修改超类的方法。
(2)重载:发生在同一类中,方法名相同,参数列表不同,是完全不同的方法,只是方法名相同而已。
1、package:声明包
(1)作用:避免类的命名冲突
(2)同包中的类不能同名,不同包中的类可以同名
(3)类的全称:包名.类名,包名常常有层次结构
(4)建议:包名所有字母都小写
(5)说明:package声明包必须位于第一行
2、import:导入类
(1)同包中的类可以直接访问,不同包的类不能直接访问,若想访问:先import导入类,再访问类
(2)说明:import导入类必须位于声明包的下一行
1、public:公开的,任何类
2、private:私有的,本类
3、protected:受保护的,本类、派生类、同包类
4、默认的:什么也不写,本类、同包类
5、类的访问权限只能是public或默认的,类中成员的访问权限如上四种都可以
1、静态变量:
(1)由static修饰
(2)属于类,存储在方法区中,只有一份
(3)常常通过类名点来访问
(4)何时用:所有对象所共享的数据(图片、音频、视频等)
2、静态方法:
(1)由static修饰
(2)属于类,存储在方法区中,只有一份
(3)常常通过类名点来访问
(4)静态方法没有隐式this传递,所以不能直接访问实例成员
(5)何时用:方法的操作与对象无关
3、静态块:
(1)由static修饰
(2)属于类,在类被加载期间自动执行,一个类只被加载一次,所以静态块也只执行一次
(3)何时用:初始化/加载静态资源(图片、音频、视频等)
1、实例变量:没有static修饰,属于对象的,存储在堆中,
有几个对象就有几份,通过引用打点来访问,在构造方法中给实例变量做初始化
2、静态变量:有static修饰,属于类的,存储在方法区中,
只有一份,通过类名打点来访,在静态块中给静态变量做初始化
1、堆
(1)存储new出来的对象(包括实例变量)
(2)垃圾:没有任何引用所指向的对象
垃圾回收器(GC)不定时到内存堆中清扫垃圾,回收的过程中透明的(看不到的),不一定一发现垃圾就立刻回收,通过调用System.gc()建议虚拟机尽快调度GC来回收
(3)实例变量的生命周期:创建对象时存储在堆中,对象被回收时一并被回收
(4)内存泄漏:不再使用的对象没有被及时的回收,严重的泄漏会导致系统的崩溃,建议:不再使用的对象应及时将引用设置为null
2、栈:局部变量
(1)存储正在调用的方法中的局部变量(包括方法的参数)
(2)调用方法时,会为该方法在栈中分配一块对应的栈帧,栈帧中存储局部变量(包括方法的参数),方法调用结束时,栈帧被自动清除,局部变量一并被清除。
(3)局部变量的生命周期:
调用方法时存储在栈中,方法调用结束时与栈帧一并被清除
3、方法区
(1)存储.class字节码文件(包括静态变量、所有方法)
(2)方法只有一份,通过this来区分具体的调用对象
4、实例变量和局部变量的区别:
(1)实例变量:写在类中、方法外;创建对象时存储在堆中,对象被回收时一并被回收;有默认值
(2)局部变量:写在方法中;调用方法时存储在栈中,方法调用结束时与栈帧一并被清除;没有默认值
5、java只有值传递,基本类型传递的是具体的数,引用类型传递的是具体的地址
1、修饰变量:变量不能被改变
class Aoo{
final int num = 5;
void show(){
//num = 55; //编译错误,final的变量不能被改变
}
}
2、修饰方法:方法不能被重写
class Boo{
final void show(){}
}
class Coo extends Boo{
//void show(){} //编译错误,final修饰的方法不能被重写
}
3、修饰类:类不能被继承
final class Doo{}
//class Eoo extends Doo{} //编译错误,final的类不能被继承
class Foo{}
final class Goo extends Foo{} //不能当超类,但能当派生类
1、必须声明同时初始化
2、通过类名点来访问,不能被改变
3、建议:常量名所有字母都大写,多个单词用_分隔
4、编译器在编译时会将常量直接替换为具体的值,效率高
5、何时用:数据永远不变,并且经常使用
1、由abstract修饰
2、只有方法的定义,没有具体的实现(连{}都没有)
3、抽象方法的存在意义
保证当发生向上造型时,通过超类型的引用能点出来那个方法,若设计为普通方法,则派生类可以重写也可以不重写,而设计为抽象方法,可以强制派生类必须重写
4、设计规则:
(1)将派生类所共有的属性和行为,抽到超类中
(2)派生类的行为都一样,则设计为普通方法,派生类的行为不一样,则设计为抽象方法
(3)将部分派生类所共有的属性和行为,抽到接口中,接口是对继承的单根性的扩展---------------实现多继承
符合既是也是原则时,应使用接口
1、由abstract修饰
2、包含抽象方法的类必须是抽象类
3、抽象类不能被实例化(new对象)
4、抽象类是需要被继承的,派生类:
(1)重写所有抽象方法
(2)也声明为抽象类(一般不这么做)
5、抽象类的意义:
(1)封装共有的属性和行为--------------------代码复用
(2)为所有派生类提供统一的类型-----------向上造型—代码复用
(3)可以包含抽象方法,为所有派生类提供统一的入口(能点出来),派生类的行为不同,但入口是一致的,同时相当于定义了一个标准
1、成员内部类:应用率低
(1)类中套类,外面的称为外部类,里面的称为内部类
(2)内部类通常只服务于外部类,对外不具备可见性
(3)内部类对象只能在外部类中创建
(4)内部类中可以直接访问外部类的成员(包括私有的),在内部类中有个隐式的引用指向了创建它的外部类对象------外部类名.this
class Mama{ //外部类
private String name;
Baby b = new Baby(); //内部类对象通常在外部类中创建
class Baby{ //内部类
void show(){
System.out.println(name);
System.out.println(Mama.this.name); //Mama.this指代它的外部类对象
2、匿名内部类:应用率高,大大简化代码
(1)若想创建一个类(派生类)的对象,并且对象只创建一个,此时该类不必命名,称为匿名内部类
(2)匿名内部类中不能修改外面变量的值,因为在此处该变量默认为final的
3、隐式对象:
(1)this:当前对象
(2)super:当前对象的超类对象
(3)外部类名.this:当前对象的外部类对象
4、做功能的套路
(1)先写行为/方法:
若为某对象所特有的行为,就将方法设计在特定的类中
若为所有对象所共有的行为,就将方法设计在超类中
(2)窗口调用:
若为定时发生的,就在定时器中调用
若为事件触发的,就在侦听器中调用
1、是一种引用数据类型
2、由interface定义
3、只能包含常量和抽象方法------默认权限是public
4、接口不能被实例化
5、接口是需要被实现/继承,实现/派生类:必须重写所有抽象方法
6、一个类可以实现多个接口,用逗号分隔,若又继承又实现时,应先继承后实现,接口可以继承接口
interface Inter1{
void show();
}
interface Inter2{
void test();
}
interface Inter3 extends Inter1,Inter2{
void say();
}
7、接口的意义:
(1)封装部分派生类共有的属性和行为,实现多继承
(2)制定了一个标准,一种规范,可以向上造型为:超类+所实现的接口
8、类和类------------------------继承extends
接口和接口------------------继承extends
类和接口---------------------实现implements
1、表现:
(1)同一个对象被造型为不同的类型时,有不同的功能
(2)同一类型的引用指向不同的对象时,有不同的实现,行为的多态:所有抽象方法都是多态的
2、向上造型/自动类型转换:--------------------代码复用
(1)超类型的引用指向派生类的对象
(2)能点出来什么,看引用的类型
(3)能造型成为的数据类型有:超类+所实现的接口
3、强制类型转换,成功的条件只有如下两种:
(1)引用所指向的对象,就是该类型
(2)引用所指向的对象,实现了该接口或继承了该类
4、何时用:想访问的属性/行为在超类中没有
5、强转时若不符合如上条件
(1)则发生ClassCastException类型转换异常
(2)建议:在强转之前先通过instanceof来判断引用的对象是否是该类型
public class MultiTypeDemo {
public static void main(String[] args) {
Aoo o = new Boo();
Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型
Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口
//Coo o3 = (Coo)o; //运行时ClassCastException类型转换异常
if(o instanceof Coo){ //false
Coo o4 = (Coo)o;
}else{
System.out.println("o不是Coo类型");
}
1、单行注释://
2、多行注释:/* */
3、文档注释:/** */
功能性注释,只在三个地方使用,分别是类上、方法上和常量上
/**
* 为指定用户添加问候语
* @param name 指定用户的名字
* @return 含有问候语的字符串
*/
public String sayHi(String name){
return INFO+name;
}
}