类的继承:
继承:子类除了拥有父类的属性和行为,还可以定义自己的属性和行为
继承语法:class 子类名 extends 父类名
继承好处:代码重用率比较高,也就是代码共享;易维护;使编码更高效
java api中的祖宗类:Object类,是所有类的超类
继承原则:java只可以单继承,一个子类只能有一个直接父类
说法:子类就是父类,但父类不是子类
子类实例化:实例化的过程总是先调用父类的构造方法,然后再调用子类的构造方法,也就是说子类实例化总是先实例化父类,然后再实例化子类,这个过程是默认的,不需要自己去编写
多态:
1.两种形式:对象的多态 方法的多态
2.要想多态,必须具备什么条件?
第一:要有继承关系或者实现统一的接口
第二:子类要重写父类的方法
第三:父类引用指向子类对象
3.多态的优点:便于应用功能扩展,非常方便
静态 static:
static 表示静态的意思,就是类的意思
static 修饰的变量,代码块,方法,所有对象共享
static 方法不可以访问非static类型的变量
也就是静态的类的方法可以访问静态的变量,但是不能访问对象的东西
反过来就可以:对象可以访问类的东西
类——>对象的 不可以
对象——>类的 可以
static 修饰的东西既然是类的,那么怎么调用:类名.变量名 类名.方法名
寿命比较长:用static修饰的东西,类在则东西在
单例:
1.构造器私有,不允许别人随意调用
2.提供一个静态的公共的获取本类的实例的方法
3.在方法中进行实例生产的控制,只要静态变量不为空,就不再生产,这样就
final:
final 修饰的类,不能被继承
final 修饰的变量,值不能被修改,其实就是常量,这样所有对象共享,节省内存
定义常量的格式:
[访问修饰符] static final 数据类型 常量名(大写)=值
final 修饰的方法:不可以被重写
抽象类:
1.抽象类不可以被实例化
2.如果一个方法没有方法体,那么它必须声明为抽象方法
[访问权限控制符] abstract [返回值] 方法名([参数列表])
*3.如果一个类中有抽象方法,那么这个类必须声明为抽象类
[访问权限控制符] abstract 类名{ }
4.抽象类可以全部都是抽象方法,也可以全部都不是抽象方法
5.子类如果不实现抽象类中的抽象方法,那么子类也是抽象类
接口:
作用:主要用于软件层与层之间的解耦合
发明者为什么发明接口:在软件设计期间,代码都是声明的多,没有具体实现,所以它们采用了接口这种表达方式
定义:
[权限访问控制符] interface 接口的名称{ }
使用规则:接口不可以被实例化
结构:接口中有常量和抽象方法
只要是接口中定义的方法一定是抽象方法
只要是接口中定义的变量一定是常量
接口与抽象类的区别:
1.接口中都是抽象方法
2.抽象类中除了抽象方法还可以定义变量,实现的方法,抽象类仍然是面向对象编程的一个类模板
java的继承是单继承,但是接口是多继承
接口和类的关系:
接口作为一个行为规范,其中定义的大都是抽象方法,待实现类去实现
所以类实现接口,语法是 class 类名 implements 接口名
类实现接口,可以实现多个接口:
语法是: class 类名 implements 接口名1,接口名2,接口名3...{ 类体 }
接口和接口的关系:
接口可以继承接口,让自己变得更强大
语法: interface 子接口名字 extends 父接口1,父接口2,父接口3{ 接口的body }
如果一个类既要继承父类,又要实现接口怎么办?
例子: Hudie类 有一种蝴蝶叫菜花蝶,是该类的子类,同时发现这种蝶有行为,可以变色
我们如何定义这个需求:
class Hudie 父类
class Caihuadie 子类
interface ChangeColor 接口
内部类:
内部类的分类:成员内部类,静态内部类,局部内部类
怎么使用:
内部类可以无限制的访问外部类的属性和方法
但是外部类不可以随意访问内部类的属性和方法
内部类——>外部类 ok
外部类——>内部类 不ok
造型:
下溯造型:曾经向上转过的对象才能再向下转
下溯造型代码使用不当,就会出现问题,所以务必先判断再强转
判断格式:对象名称 instanceof 类名.
对象名称 instanceof 接口名.
返回值是boolean类型
上溯造型:声明类型是父类型,实际值是子类型的实例
上溯造型自动转型ok,但是会损失原子类实例所拥有的特有的方法
访问权限:
访问权限:它们可以修饰类 成员变量(属性) 成员方法 构造方法 内部类
权限最小:私有属性,只能本类访问,安全级别最高
//private int id; 当前类可见
默认访问权限:friendly,本类,同一包中的其他类可见
//int id;
访问权限:protected 本类,同一包中的其他类,子类
//protected int id;
公共的:public 所有类都可以访问,这样安全级别最低
//public int id;
方法的覆盖:
三点必须相同:方法名相同,参数列表相同,返回值相同
访问权限只能大于等于父类的被覆盖的方法,不能小于父类
重写可以直接拷贝父类的方法进行扩展,也可以通过工具自动生成
关于包的使用注意事项:
1.java.lang包中的所有类在使用时是自动导入,不需要import
2.其他包如果涉及到跨包访问,那么需要使用import导包,建议这样写:
import 包名.子包名.类名;
除非真的需要该包中的很多类,否则不要使用这个语法: import 包名.子包名.*;
包的结构与文件目录结构一致;
类中包的声明格式:
package 顶级包名. 一级包名. 二级包名. 其他级包名;
java中常用的包:
java.util;
java.lang;
java.sql;
java.awt;
java.swing;
java.io;
java.net;
Super:
需求:子类需要实例化,需要给一些属性赋值,那么怎么办?
子类中希望调用父类的构造方法,怎么调用?
super( ); 默认调用的是父类的空构造器
super(12,"asd"); 这个调用的是父类的需要两个参数的构造器
super调用的是直接父类的构造方法,不是祖父的
super( ); 这个调用必须出现在第一行,如果该构造器没有,那么会报错
super( );调用父类构造器比较方便
子类构造方法中没有super,那么默认会调用父类空构造器,系统会给代码加一个super()
this 关键字的使用:
this 表示对当前对象的引用
this( ) 可以调用当前类中的其他构造器,根据参数个数和类型决定调用哪个构造器
this( ) 和super( )一样必须出现在代码中的第一行
this( ) 和super( )不可以出现在同一个构造方法中