一、final关键字的概述及特点
final关键字可以修饰什么?
可以修饰的类, 方法, 变量.
被其修饰后有什么作用?
A. 被其修饰的类, 就不能被继承
B. 被其修饰的方法, 不能被重写
C. 被其修饰的变量,就变成了常量(自定义常量)只能赋值一次
final修饰的(成员变量), 其初始化时机为?
1. 在创建变量的时候直接赋值 -> 推荐方案
2. 在构造方法弹栈之前完成初始化也可以.
二、static关键字的概述及特点
什么是静态?
在java当中静态指的就是static关键字, static是一个修饰符.
static可以修饰方法和变量.
静态有什么特点?
A. 被类的所有对象所共享B. 随着类的加载而加载, 优先于对象存在
C. 多了一种调用方式, 可以通过类名.进行调用
什么时候用静态呢?共性用静态, 特性用非静态. --> 成员变量
什么时候该用静态修饰成员方法呢?
--> 为了更方便的调用方法.
一般, 工具类中的方法都用静态修饰.
如果一个类中的所有方法都是静态的, 我们通常会多做一步操作.
私有构造方法 --> 为了不让其他类创建本类对象.
三、static方法的访问特点及注意事项
静态方法
可以调用静态的成员变量可以调用静态的成员方法
不可以调用非静态的成员变量
不可以调用非静态的成员方法
只能在静态的方法中调用静态的成员
总结: 静态中只能访问静态.
非静态方法
可以调用静态的成员, 也可以调用非静态的成员.
重点记 : 静态中没有this和super关键字.
为什么没有this和super?
因为this和super只有在创建对象之后才存在, 静态则是随着类的加载而加载.
在使用静态的时候, 有可能对象还没有被创建.
四、抽象类的概述
什么是抽象类?
把像的部分, 和相似的部分抽取到一个类中.
换句话来说, 抽象类就是一个特殊的父类.
抽象类和普通的父类有什么区别?
抽象类当中可以定义抽象方法.
抽象方法又是什么?
当我们将共性的行为抽取到一个父类当中
发现某些方法是描述不清的
而且还是强制要求子类去做(重写)的方法.
当我们将事物的共性向上抽取之后, 发现某些行为描述不清了, 而且这些行为还是强制要求子类去重写的.
这时候就可以将该行为定义为抽象方法, 抽象方法一定要存活于抽象类或者是接口当中.
五、抽象类的特点
A:抽象类和抽象方法必须使用abstract关键字修饰
B:抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
C:抽象类不能实例化抽象类如何实例化呢?
参照多态的方式,通过子类对象实例化。
D:抽象类的子类要么重写抽象类中的所有抽象方法
要么子类也是抽象类
一个抽象类中, 是否可以完全没有抽象方法?
可以, 这样做的目的是为了不让其他类创建本类对象.六、抽象类的成员特点
1. 成员变量可以定义常量, 也可以定义变量
2. 成员方法
可以定义一般方法, 也可以定义抽象方法
3. 构造方法
抽象类中有构造方法, 目的是为了给子类进行初始化的.
结论: 抽象类对比普通的父类, 就多了一点, 可以定义抽象方法.
七、接口的概述
什么是接口?
广义上来说, 对外暴露规则的都是接口
狭义的角度来看, 接口指的就是java中的关键字 interface
如果对于规则二字暂时理解不上去的话, 也可以将接口理解为, 特性的行为定义在接口当中.
为什么要有接口?
接口的出现可以实现程序的解耦性.接口的出现打破了Java当中只支持单继承的局限性, 我们可以让一个子类在继承了父类的同时, 去实现多个接口.
八、接口的特点
A:定义接口使用的是interface关键字
B:类和接口之间是实现关系,用implements关键字表示
C:接口不能实例化
接口有没有其他的方式实例化呢?参照多态的形式使用实现类来实例化。
D:接口的实现类
要么重写接口中的所有的抽象方法
要么让实现类(子类)变成一个抽象类. --> 不推荐
多态的几种形式:
具体类多态(几乎不用)
抽象类多态(常用)
接口多态(最常用)
九、接口的成员特点
接口的成员特点有哪些?
1. 成员变量只能是常量, 因为即使写成了int num = 10; 系统也会默认加上 public static final三个关键字
而且三个关键字没有顺序关系.
2. 成员方法
接口中的方法只能是抽象方法
因为即使写成 void show(); 系统也会默认加上 public abstract
jdk1.8版本之后, 接口中可以定义方法体了.
但是需要在返回值类型的前面加上default关键字
3. 构造方法
没有构造方法!
十、类与类_类与接口_接口与接口的关系
类与类之间的关系
继承关系, 只支持单继承, 不支持多继承, 但是可以多层继承
类与接口的关系
实现关系, 可以单实现, 也可以多实现, 并且可以在继承了一个类的同时, 实现多个接口.
接口与接口的关系
继承关系, 可以单继承, 也可以多继承!
十一、抽象类与接口的区别
A:成员区别抽象类:
成员变量: 可以是变量, 也可以是常量
构造方法: 有, 方便子类进行初始化操作
成员方法: 可以是抽象的, 也可以是非抽象的.
接口:
成员变量: 只能是常量, 因为即使什么都不写, 也默认加上了 public static final
成员方法: 只能是抽象方法, 因为系统默认加上了public abstract
构造方法: 没有
B:关系区别
类与类继承关系, 只可以单继承, 但是可以多层继承
类与接口
实现关系, 可以单实现, 也可以多实现, 并且可以在继承一个类的同时, 实现多个接口
接口与接口
继承关系, 可以单继承, 也可以多继承.
C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的(共性)功能。接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的(扩展)功能
十二、包的概述和注意事项
包的作用是什么?
包实际上就是文件夹, 用来管理类文件的
如何定义一个包?
通过package关键字定义.
如何划分包?
一般通过两种形式划分
包的命名一般是公司的域名倒着写com.baidu.xxx
A. 根据模块划分
com.baidu.gjp.domain --> 用于存放JavaBean类 Person Student
com.baidu.gjp.service --> 业务层
com.baidu.gjp.view --> 视图层
com.baidu.gjp.tools --> 工具类
com.baidu.gjp.dao --> 用于操作跟数据库相关的类文件.
...
B. 根据功能划分
com.baidu.car.mp3
com.baidu.car.gps
com.baidu.car.video
...
import class package的顺序关系是?
package --> import --> class
引用不同包下的类文件(导包的方式)
// ctrl + shif + o 整理包// alt + /
// ctrl + 1
十三、四种权限修饰符的概述和访问特点
本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类)private Y
默认 Y Y
protected Y Y Y
public Y Y Y Y
练习:
分析以下需求,并用代码实现:
1.定义动物类
属性:
年龄,颜色
行为:
eat(String something)方法(无具体行为,不同动物吃的方式和东西不一样,something表示吃的东西)
生成空参有参构造,set和get方法
2.定义狗类继承动物类
行为:
eat(String something)方法,看家lookHome方法(无参数)
3.定义猫类继承动物类
行为:eat(String something)方法,逮老鼠catchMouse方法(无参数)
4.定义Person类
属性:
姓名,年龄
行为:
keepPet(Dog dog,String something)方法
功能:喂养宠物狗,something表示喂养的东西
行为:
keepPet(Catcat,String something)方法
功能:喂养宠物猫,something表示喂养的东西
生成空参有参构造,set和get方法
5.定义测试类(完成以下打印效果):
keepPet(Dog dog,Stringsomethind)方法打印内容如下:
年龄为30岁的老王养了一只黑颜色的2岁的宠物
2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃
keepPet(Cat cat,Stringsomethind)方法打印内容如下:
年龄为25岁的老李养了一只灰颜色的3岁的宠物
3岁的灰颜色的猫眯着眼睛侧着头吃鱼
public abstract class E04_Animal {
private String color;
private int age;
public abstract void eat(String sth);
public E04_Animal() {
super();
}
public E04_Animal(String color, int age) {
super();
this.color = color;
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class E04_Dog extends E04_Animal{
public void lookHome(){
System.out.println("狗看家");
}
@Override
public void eat(String sth) {
System.out.println("狗吃"+sth);
}
public E04_Dog() {
super();
}
public E04_Dog(String color, int age) {
super(color, age);
}
}
public class E04_Cat extends E04_Animal{
public void catchMouse(){
System.out.println("猫捉老鼠");
}
@Override
public void eat(String sth) {
System.out.println("猫吃"+sth);
}
public E04_Cat() {
super();
}
public E04_Cat(String color, int age) {
super(color, age);
}
}
public class E04_Person {
private String name;
private int age;
public void keepPet(E04_Dog d,String sth){
System.out.println("年龄为"+age+"的"+name+"养了一只颜色为"+d.getColor()+"年龄为"+d.getAge()+"的宠物");
System.out.println(d.getAge()+"岁的"+d.getColor()+"颜色的狗两只前腿死死的抱住"+sth+"猛吃");
}
public void keepPet(E04_Cat c,String sth){
System.out.println("年龄为"+age+"的"+name+"养了一只颜色为"+c.getColor()+"年龄为"+c.getAge()+"的宠物");
System.out.println(c.getAge()+"岁的"+c.getColor()+"颜色的猫眯着眼睛侧着头吃"+sth);
}
public E04_Person() {
super();
}
public E04_Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class E04_Main {
public static void main(String[] args) {
whatPet(new E04_Person("老王", 62), new E04_Dog("黑", 3), "骨头");
whatPet(new E04_Person("老李", 62), new E04_Cat("白", 5), "老鼠");
}
private static void whatPet(E04_Person p,E04_Animal a,String sth){
if(a instanceof E04_Cat){
p.keepPet((E04_Cat)a, sth);
}else if(a instanceof E04_Dog){
p.keepPet((E04_Dog)a, sth);
}
}
}