11_7
1.什么是构造方法?
1)方法名和类名一致
2)没有具体返回值类型
3)连void也没有
使用构造方法的注意事项:
1)一个类中如果没有提供任何构造方法,系统会默认提供一个无参构造方法
2)如果一个类中提供了有参构造方法,系统不会无参构造方法
给成员变量赋值就两种方式:
1)setXXX(xx)赋值!
2)有参构造方法赋值!
2.什么时候将变量定义为成员变量?
如果这个需求能够描述现实事物的属性,这个时候才能将变量定义为成员变量.
其余全部是局部变量,因为局部变量它的生命周期:随着方法调用存在,随着方法调用结束而消失
3.static关键字
static关键字的特点
1)随着类的加载而加载,
类在加载的时候,静态相关的成员(类成员:静态的变量或者静态的方法),随着类的加载而先进内存(静态区)
2)优先于对象存在,不能和this共存
3)static能体现"共享,共用"的意思
如果需求中有"共用"含义,这个变量直接使用static修饰
4)被static修饰的成员(变量/方法),推荐的访问方式是使用类名.静态变量
类名.静态方法名()
不推荐使用 对象名.静态变量/方法
使用静态相关变量/方法的注意事项
1)非静态的方法既可以访问静态的,也可以访问非静态的
2)静态只能访问静态的东西(静态变量/调用静态方法)
4.代码块(重点掌握:代码块的优先级,静态代码块,构造代码块,构造方法)
一个类中如果有静态代码块,有构造代码块,有构造方法
静态代码块>构造代码块>构造方法
5.继承(extends)
将多个事物(类)的共性内容抽取到一个独立的事物(类)中,这个事物(类)和其他事物(其他类)之间产生一种关系,称为"继承",关键字"extends"
格式:
class 父类名{
共性内容:属性私有化
对外提供公共的访问方法
//其他成员方法
}
class 子类名 extends 父类名{
}
从下面代码看,继承的特点:
1)提高了代码的复用性
2)提高了代码的维护性(方便后期维护)
3)类与类产生的继承关系,是多态的前提条件
弊端:
继承的关系:是存在局限性,不要为了使用部分功能而去使用继承.
继承的好处:
1)类和类之间的关系,只支持"单继承"
2)不支持多继承,但是可以"多层继承"
11-8
1.继承的注意事项
1)子类继承父类,继承父类的私有的成员,私有的成员,可以间接访问!
2)子类继承父类,构造方法是不能继承的,通过一个关键字类访问
super()
2.继承的成员变量访问问题
1)子类继承父类,如果子类和父类的成员变量名称不一致,(分别访问即可)
2)子类继承父类,子类和父类的成员变量名称一致,访问(采用"就近原则")
如果如果一致,而且一模一样,方法重写Override (方法覆盖/方法复写),重写的时候必须要保证它的访问权限足够大!
class Fu{
public void show(){}
}
class Zi extends Fu{
void show(){ //不行,访问权限问题:要么跟父类的一模一样,要么永远带上public
}
}
3.继承的构造方法访问问题:super来访问
3.子类继承父类,子类的所有构造方法的默认第一句话都是super();(可以省略的不写)
访问父类的无参构造方法
4.如果父类中没有给出无参构造方法(存在有参构造方法),子类会出现什么情况?如何解决呢?
1)解决方案1:永远给出类的无参构造方法
2)如果现在不给出父类无参构造方法,如何解决呢?
让子类的所有构造方法显示的访问父类的有参构造方法!
3)子类的所有构造方法中的某一个只要能够让父类初始化即可!
5.多态的概念
从现实世界事物中考虑:"多态" 一个事物多种形态!
6.多态的前提条件
1)必须有继承关系(如果没有继承,不谈多态)
2)必须存在方法重写
猫和狗都需要吃饭,吃的东西不一样(具体的动物类中应该给出具体体现)
3)必须存在父类引用子类对象
格式:
父类名 对象名 = new 子类名();(向上转型)
7.多态的成员访问特点:
1)成员变量:编译看左,运行看左!
2)成员方法:编译看左,运行看右!
静态的方法:算不上方法重写,这种跟类相关,类一加载就可以直接使用(类名.方法名())
3)构造方法:由于存在继承,构造方法在执行的时候,分层初始化,先让父类初试化,然后再是子类进行构造初始化!
8.多态的好处:
1)可以提高代码的扩展性(父类引用指向子类对象 Fu fu = new Zi()) 多态保证的(重点)
2)可以提高代码的复用性以及维护性(由继承保证的)
9.多态的弊端:
父类引用指向子类对象,父类名 对象名 = new 子类名();
这种格式无法访问子类的特有功能
解决方案:
1)直接创建子类对象 子类名 对象名 = new 子类名();
2)推荐:向下转型
父类名 对象名 = new 子类名();向上转型
子类名 对象名 = (子类名)父类的引用;向下转型 --前提是必须有向上转型
11-9
1.多态的一个弊端
用于向下转型时候,如果向下转型(将父类引用强转为子类引用),使用不当(),会导致程序出现异常 "ClassCastException" 类转换异常
比如说狗不能转成猫
2.abstract关键字(抽象)
什么是抽象类?
一个事物的某个行为应该具体的事物的具体体现,将这个事物顶层次(父类)可以定义"抽象"
抽象类的定义:
abstract class 类名{}
有抽象方法的类一定是抽象类,抽象类不一定都是抽象方法(重点)
抽象方法的格式:
权限修饰符 abstract 返回值类型 方法名(空参/无参)
抽象类的特点:
1)抽象类不能进行实例化!(不能创建对象)
2)抽象类的子类如果也是抽象类,不能实例化,一定会提供最具体的子类,完成实例化(创建对象)
抽象的父类名 对象名 = new 具体的子类名();
3.抽象类的成员特点
成员变量:既可以是变量,也可以是常量(加入final修饰)
成员方法:既可以存在抽象方法(不能省略abstract关键字,必须强转子类重写),也可以定义非抽象方法
构造方法:无参构造/有参构造都可以存在,构造方法都需要让父类先初始化,然后再是子类进行初始化
4.如果一个类没有任何抽象方法,把这个类定义为抽象类的意义?
意义就是:不让外界直接创建对象(抽象类不能创建对象)---需要提供具体的子类进行实例化
5.abstra和哪些关键字冲突?
不能和private一起用:被private修饰的成员需要在当前类进行访问,而如果加入abstract,强制子类完成
不能和final一块用:被final修饰的成员方法,不能被重写!而abstract抽象方法,必须强制子类重写
不能和static一块用:被static修饰的成员方法,算不上重写
abstract关键字应用范围:
1)定义类--抽象类
2)定义方法--抽象方法
6.接口
什么是接口?
接口,体现的是这个事物本身不具备的功能,额外的功能
接口定义--java代码定义
interface 接口名{}
接口的特点:
1)接口的方法不能有方法体,只能是抽象方法,而且隐藏public abstract(可以省略不写)
2)接口不能实例化(不能创建对象)
3)如果接口的实现类它是一个抽象类(不能实例化),肯定有一个具体的接口的实现类来进行new对象
接口名 对象名 = new 具体的子实现类();接口多态
开发中定义接口的实现类(子类)名
class 接口名+Impl implements(实现) 接口名{
}
接口的成员方法:
成员变量:只能是常量--存在默认修饰符public static final(可以省略)
成员方法:只能是抽象方法--存在默认修饰符public abstract(可以省略)
构造方法:接口没有构造方法!
7.权限修饰符的范围
private-->默认修饰符-->protected-->public
11-10
1.关于类于类,类与接口,接口与接口的关系.
类与类:只支持单继承,不支持多继承,但是可以多层继承
类与接口:是实现关系,一个类继承另一个类的同时,可以实现多个接口!
接口与接口:(继承关系),不但可以单继承,也可以多继承
2.方法形式参数如果是引用类型
数组---->需要传递数组对象
类
具体类----->实际参数,需要传递当前类对象
抽象类---->抽象类不能实例化,实际参数传递该抽象类的子类对象 (抽象类多态)
接口 ----->接口不能实例化,实际参数需要传递该接口的子实现类对象(接口多态)
3.方法的返回值问题:
1)返回基本类型: 需要什么基本数据类型,使用对应性的类型接收
2)研究引用类型:
类
具体类: 需要返回的是当前具体类的对象 !
抽象类: 需要返回的是当前抽象类的子类对象(抽象类多态)
接口 :需要返回的是接口的子实现类对象(接口多态)
4.package包---本质就是文件夹(目录)
程序员在编写代码存储的地址
包---->开发中 (公司域名反写,多个包中间.隔开)
公司域名
com.qf
本质
com文件夹
qf文件夹
xx.java
包----为了维护代码结构的(代码分层)
com.qf.pojo/domain/entity: 存放Java实体类(满足JavaBean规范:)
1)这个类是具体类
2)属性私有化 (属性必须全部字母小写)
3)对外提供公共的setXXX(xx)/getXXX()
5.内部类(了解)
一个类A中,有一个类B,将类B就称为类A的内部类,类A就是类B的外部类!
内部类有两种格式
1)成员内部类---->在一个外部类的成员位置(类中,方法外)定义的类
2)局部内部类---->在外部类的局部位置(方法定义中)定义的类
成员内部类:
成员内部类可以访问外部类的成员,包括私有相关的!
如何直接通过外部类去访问内部类的成员呢?(格式 重点)
外部类.内部类名 对象名 = new 外部类名().new 内部类名();
成员内部类---还可以static修饰符(记忆)
1)静态的成员内部类只能外部类的静态成员!
2)静态的成员内部类中无论是静态方法还是非静态方法:访问外部类的成员必须静态
3)想直接通过外部类来访问静态成员内部类的成员信息,访问格式
外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
11-11
1.局部内部类
特点和成员内部类一样,局部内部类也可以直接外部类的包括私有!
1)也可以访问外部类的成员包括私有
2)面试题:局部内部类访 访问它的成员方法里面的局部变量,局部变量有什么特点?(重点)
jdk7以前(包括jdk7):局部内部类访问局部变量的时候,局部变量必须使用final进行修饰!,为什么?
局部变量它随着方法调用而存在,随着方法调用结束而消失,但是现在是通过局部对象调用它的成员方法还在使用这个局部变量
局部变量必须为常量(加入final)---局部内部类对象不会立即消失,等待gc回收!
jdk8以及jdk8以后 jvm已经对这个局部变量优化 ,将final已经省略了!
2.匿名内部类: 没有名字的类
应用范围: 在局部位置中的(方法定义中或者声明上)
匿名内部类的格式:
new 类名或者一个接口名(){
重写方法(){
...
}
}
匿名内部类的本质:就是继承该类(抽象类)或者是实现类了该接口的子类对象!
3.匿名内部类在开发中应用:
形式参数问题
如果方法的形式参数是一个抽象类,调用方法的时候实际参数需要这个抽象类的子类对象!
4.
方法的返回值是一个抽象类,需要返回该抽象类的子类对象
方法的返回值是一个接口,需要返回该接口的子实现类对象!
5.选择排序:
使用数组0角标对应的元素依次和后面的元素比较,小的往前放,第一次比较完毕,最小出现在最小索引处!
6
java常用类之 java.lang.Object类
表示所有的类的根类(超类或者父类),所有的类默认继承自Object,拥有这个类的所有非私有方法
public final Class getClass() :("反射"后面讲的)获取任意Java类型的字节码文件对象 (返回值表示正在运行的那个类或者接口)
面试题:
在Java中获取一个类的字节码文件对象的方式有几种?
三种方式
public final Class getClass() 任意java对象调用getClass()
任意Java类型的class属性
Class类有一个静态方法 forName("包名.类名") ---反射中讲