目标:知识回顾
类:描述相同事物共同特征的抽象
对象:具体存在的实例 实例=对象
在代码层面,必须先有类,才能创建对象
定义类的格式
修饰符 class 类名{
}
注意:
–类的首字母必须大写,满足驼峰式命名
–一个java文件中可以定义多个类,但是有且就有一个是
public修饰的。public修饰的类名必须成为代码的文件名称
类的成份研究:
类有五大成份:
1.成员变量(描述类和对象的属性信息)
2.成员方法 (描述类和对象行为信息)
3 构造函数 (初始化一个对象并返回引用)
4 代码块
5 内部类
构造器复习:
作用:初始化一个类的对象并返回引用
格式:
修饰符 类名(形参){
}
构造器初始化对象的格式:
类名 对象名称=new 构造器
注意:
一个类会默认带一个无参构造器,但是一个类写了有参构造器,无参构造器就会被覆盖。
this关键字回顾:
this代表了当前对象的引用
this关键字可以用在实例方法和构造器中
this用在方法中,谁调用这个方法,this就代表谁
this用在构造器中,代表了构造器正在初始化那个对象的引用
封装的回顾:
面向对象三大特征:封装,继承,多态
封装的作用:
1.可以提高安全性
2.可以实现代码组件化
封装的规范:
1.建议成员变量私有,用private修饰
private修饰的方法,成员变量构造器只能在本类被访问
2.提供成套的gatter+setter暴露变量取值赋值
public修饰符,是公开的意义
封装小结:
封装的核心思想,合理隐藏,合理暴露
封装已经成为java代码风格已经形成规范。即使代码毫无意义,还是要按照封装写代码
目标:static关键字的概述。(重点)
引入:
我们之前定义了很多成员变量(name , age , sex)
其实我们只写了一份,但是发现每个对象都可以用,就说明
Java中这些成员变量或者方法是存在所属性的。
有些是属于对象的,有些是属于类本身的。
Java是通过成员变量是否有static修饰来区分是类的还是属于对象的。
static == 静态 == 修饰的成员(方法和成员变量)属于类本身的。
按照有无static修饰,成员变量和方法可以分为:
成员变量:
(1)静态成员变量(类变量):
有static修饰的成员变量称为静态成员变量也叫类变量,属于类本身的,
直接用类名访问即可。
(2)实例成员变量
无static修饰的成员变量称为实例成员变量,属于类的每个对象的,
必须用类的对象来访问。
成员方法:
(1)静态方法
有static修饰的成员方法称为静态方法也叫类方法,属于类本身的,
直接用类名访问即可。
(2)实例方法
无static修饰的成员方法称为实例方法,
属于类的每个对象的,必须用类的对象来访问。
小结:
成员变量有2种
-- 有static修饰的属于类叫静态成员变量,与类一起加载一次,直接用类名调用即可。
-- 无static修饰的属于类的每个对象的叫实例成员变量,
与类的对象一起加载,对象有多少个,实例成员变量就加载多少份。必须用类的对象调用。
成员方法有2种:
-- 有static修饰的属于类叫静态方法,直接用类名调用即可。
-- 无static修饰的属于类的每个对象的叫实例方法,必须用类的对象调用。
拓展:成员变量和成员方法访问的拓展。(面试常考)
方法:实例方法,静态方法。
成员变量:实例成员变量,静态成员变量。
8种访问形式的问答:
a.实例方法是否可以直接访问实例成员变量?可以的,因为它们都属于对象。
b.实例方法是否可以直接访问静态成员变量?可以的,静态成员变量可以被共享访问。
c.实例方法是否可以直接访问实例方法? 可以的,实例方法和实例方法都属于对象。
d.实例方法是否可以直接访问静态方法?可以的,静态方法可以被共享访问!
--------------------------------------------------------------------
a.静态方法是否可以直接访问实例变量? 不可以的,实例变量必须用对象访问!!
b.静态方法是否可以直接访问静态变量? 可以的,静态成员变量可以被共享访问。
c.静态方法是否可以直接访问实例方法? 不可以的,实例方法必须用对象访问!!
d.静态方法是否可以直接访问静态方法?可以的,静态方法可以被共享访问!!
目标:继承(extends)的概述。
面向对象的三大特征:封装,继承,多态。
继承是Java中一般到特殊的关系,是一种子类到父类的关系。
例如:学生类继承了人类。 猫类继承了动物类。
被继承的类称为:父类/超类。
继承父类的类称为:子类。
继承的作用?
“可以提高代码的复用”,相同代码可以定义在父类中。
然后子类直接继承父类,就可以直接使用父类的这些代码了。
(相同代码重复利用)
子类更强大:子类不仅得到了父类的功能,它还有自己的功能。
继承的特点:
子类继承了一个父类,子类就可以直接得到父类的属性(成员变量)和行为(方法)了。
继承的格式:
子类 extends 父类{
}
小结:
继承是子类到到父类的一种关系。
子类继承了一个父类,子类就可以直接得到父类的属性和行为了。
在Java中继承是 “is a” 的关系。Cat extends Animal:猫是一个动物。
在Java中,子类是更强大的,子类不仅继承了父类的功能,自己还可以定义自己的功能。
目标:子类不能继承父类的内容。
引入:
子类继承父类,子类就得到了父类的属性和行为。
但是并非所有父类的属性和行为等子类都可以继承。
子类不能继承父类的东西:
子类不能继承父类的构造器:子类有自己的构造器。(没有争议的)
有争议的观点(拓展):
子类是否可以继承父类的私有成员(私有成员变量,私有成员方法)?
-- 我认为子类是可以继承父类的私有成员的,只是不能直接访问而已。
-- 以后可以暴力去访问继承自父类的私有成员~~~
子类是否可以继承父类的静态成员?
-- 我认为子类是不能继承父类的静态成员的,
-- 子类只是可以访问父类的静态成员,父类的静态成员只有一份可以被子类共享访问。
共享并非继承。
目标:继承后-成员变量的访问特点。
就近原则:
子类有找子类,子类没有找父类,父类没有就报错。
小结:
this代表了当前对象的引用,可以用于访问当前子类对象的成员变量。
super代表了父类对象的引用,可以用于访问父类中的成员变量。
目标:方法重写。
方法重写的概念:
子类继承了父类,子类就得到了父类的某个方法
但是子类觉得父类的这个方法不好用或者无法满足自己的需求
子类重写一个与父类申明一样的方法来覆盖父类的该方法,子类的这个方法
就进行了方法重写。
方法重写的校验注解: @Override
Java建议在重写的方法上面加上一个@Override注解。
方法一旦加了这个注解,那就必须是成功重写父类的方法,否则报错!
@Override优势:可读性好,安全,优雅!!
方法重写的具体要求:
1.子类重写方法的名称和形参列表必须与父类被重写方法一样。
2.子类重写方法的返回值类型申明要么与父类一样,要么比父类方法返回值类型范围更小。(以后再了解)
3.子类重写方法的修饰符权限应该与父类被重写方法的修饰符权限相同或者更大。(以后再了解)
4.子类重写方法申明抛出的异常应该与父类被重写方法申明抛出的异常一样或者范围更小!(以后再了解)
方法重写的规范:
1.加上@Override注解。
2.建议“申明不变,重新实现”。
3.父类静态方法和私有方法都不能被重写
小结:
方法重写是子类重写一个与父类申明一样的方法覆盖父类的方法。
方法重写建议加上@Override注解。
方法重写的核心要求:方法名称形参列表必须与被重写方法一致!!
建议“申明不变,重新实现”。
目标:继承后构造器的特点。
继承后子类构造器的特点:
调用子类构造器的时候,子类的构造器一定会先调用父类的无参数构造器再执行自己的构造器。
为什么子类构造器一定要先调用父类无参数构造器:
1.子类的全部构造器的第一行默认有一个super()调用父类无参数构造器。
2.调用子类构造器初始化子类对象的时候,必须先调用父类构造器去初始化继承自父类的成员。
小结:
子类构造器默认一定会先调用父类的无参数构造器再执行自己。
目标:继承的特点
1.单继承:一个类只能继承一个直接父类。
为什么Java是单继承的?
答:反证法,假如Java可以多继承,请看如下代码:
class A{
public void test(){
System.out.println("A");
}
}
class B{
public void test(){
System.out.println("B");
}
}
class C extends A , B {
public static void main(String[] args){
C c = new C();
c.test(); // 出现了类的二义性!所以Java不能多继承!!
}
}
2.多层继承:一个类可以间接继承多个父类。(家谱)
3.一个类可以有多个子类。
4.一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类!!