代码块的概述和分类
- A:代码块的概述
- 在java中 使用{}括起来的代码被称为代码块
B:代码块的分类
- 根据其位置和声明不同 可以分为 局部代码块 构造代码块 静态代码块 同步代码块
C:常见代码块的应用
- 局部代码块
- 在方法中出现:限定变量生命周期 及早释放 提高内存利用率
- 构造代码块(初始化块)
- 在类中方法外:多个构造方法方法中相同的代码存放到一起 每次调用构造方法都执行并且在构造方法前执行
- 静态代码块
- 随着类的加载而加载
- 只执行一次跟创建对象次数无头 一般用来加载驱动
- 优先于主方法的执行
- 局部代码块
继承案例演示
- A:继承(extends)
- 让类与类之间产生关系 子父类关系
- B:继承案例演示
- 动物类 猫类 狗类
- 定义两个属性(颜色 腿的个数) 两个功能(吃饭 睡觉)
- C:使用继承前案例演示
- D:使用继承后案例演示
继承的好处和弊端
- A:继承的好处
- 提高代码的复用性
- 提高代码的维护性
- 让类与类之间产生了关系 是多态的前提
- B:继承弊端
- 类的偶合性提高了
- 开发的原则:高内聚 低耦合
- 内聚:就是自己完成某件事的能力
- 耦合:类与类的关系
Java中继承特点
- A:java中类的继承特点
- Java中只支持单继承 不支持多继承(一个儿子只有一个爹)
- Java中支持多层继承
- B:案例演示
继承的注意事项和什么时候使用继承
- A:继承的注意事项
- a:子类只能继承父类所有非私有的成员(成员变量和成员方法)
- b:子类不能继承父类的构造方法 但是可以通过super()关键字访问父类构造方法
- 不要为了部分功能而去继承
- B:
继承成员变量的关系
A:案例演示
- a:不同名的变量
b:同名的变量
class Father{ int num1 = 10; int num2 = 20; } class Son extends Father{ int num2 = 30; public void show(){ System.out.println(num1+" "+num2);//结果10 30 } }
this和super的区别
- A:this和super的概述
- this:代表当前对象的引用
- super:代表当前对象父类对象的引用
B:this和super的使用区别
- a:调用成员变量
- this.成员变量 调用本类的成员变量 也可以调用父类的成员变量
- super.成员变量 调用父类的成员变量
- b:调用构造方法
- this() 调用本类的构造方法
- super() 调用父类的构造方法
c:调用成员方法
- this.成员方法 调用本类的成员方法 也可以调用父类的成员方法
super.成员方法 调用父类的成员方法
class Father{ int num1 = 10; int num2 = 20; } class Son extends Father{ int num2 = 30; public void show(){ System.out.println(this.num1);//结果10 System.out.println(this.num2);//结果30 System.out.println(super.num2);//结果20 } }
- a:调用成员变量
继承中构造方法的关系
- A:案例演示
- 子类中所有的构造方法默认都会访问父类中无参构造方法、
继承中构造方法的注意事项
- A:案例演示
- 父类中没有无参构造方法 子类怎么办
- super解决
- this解决
- B:注意事项
- super(…)或者this(…)必须出现在构造方法的第一条语句上
继承中构造方法的特点
继承中的面试题
class DemoExtends {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
/*
1,Jvm调用main方法 main方法进栈
2,执行Zi zi = new Zi(),因为Zi继承Fu 先加载Fu.class再加载Zi.class进方法区,在加载的同时执行Fu类的静态代码块
再执行Zi类的静态代码块
3,调用Zi的构造方法 因为是分层调用 先调用Fu的无参构造方法 再调用Zi的无参构造
4,调用super() 会执行Fu构造代码块 再执行Fu的构造方法
5,最后调用 会执行 Zi构造代码块 再执行Zi的构造方法
*/
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu(){
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi(){
System.out.println("构造方法Zi");
}
}
方法重写的概述及应用
- A:什么是方法的重写
- 重写:子父类出现一模一样的方法 (返回值类型可以是子父类)
- B:方法重写的应用
- 当子类需要父类的功能 而功能主体子类有自己特有的内容 可以重写父类中的方法 即沿袭了父类的功能 双
方法重写注意事项
- a:父类中私有方法不能被重写
- 因为父类私有不能被继承
- b:子类重写父类方法时 访问权限不能更低
- 最好就是一致
- c:父类静态方法,子类也必须通过静态方法进行重写
- 静态只能覆盖静态
方法重写的面试题
- A方法重写面试题
- override和overload的区别?overload能改变返回值类型吗
- overload可以改变返回值类型
- 方法重写:子类中出现了和父类中声明一样的方法 与返回值类型有关 返回值是一致的
- 方法重载:本类中出现 方法名相同 参数列表不同的方法 与返回 值类型无关
- 子类对象调用方法的时候
- 先找子类本身 再找父类
使用继承前学生和老师的案例
- A:案例演示
- 使用继承前学生和老师案例
- 属性:name age
- 行为:eat
- 老师特有的方法:teach
- 学生特有的方法:study
- 使用继承前学生和老师案例
使用继承后学生和老师的案例
猫狗案例分析
案例演示
- 从猫狗向上抽取一个共同的类动物
Cat:
- 成员变量:color leg
- 成员方法:eat catchMouse
Dog:
- 成员变量:color leg
- 成员方法:eat lookHome
- Animal:
- 成员变量 color leg
- 成员方法:eat
案例源码
class Test { public static void main(String[] args) { Cat cat = new Cat("黑色",4); cat.eat(); cat.catchMouse(); System.out.println("--------------"); Dog dog = new Dog("白色",4); dog.eat(); dog.lookHome(); } } /* * 案例演示 * 从猫狗向上抽取一个共同的类动物 * Cat: * 成员变量:color leg * 成员方法:eat catchMouse * Dog: * 成员变量:color leg * 成员方法:eat lookHome * Animal: * 成员变量 color leg * 成员方法:eat */ class Animal { private String color; private int leg; //构造方法 无参 有参 public Animal(){}; public Animal(String color, int leg){ this.color = color; this.leg = leg; } //成员方法 public void setColor(String color){ this.color = color; } public String getColor(){ return color; } public void setLeg(int leg){ this.leg = leg; } public int getLeg(){ return leg; } public void eat(){ System.out.println("吃饭"); } } class Cat extends Animal { //构造方法 无参 有参 public Cat(){} public Cat(String color , int leg){ super(color , leg); } //重写成员方法 public void eat(){ System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("抓老鼠"); } } class Dog extends Animal { //构造方法 无参 有参 public Dog(){} public Dog(String color , int leg){ super(color , leg); } //重写成员方法 public void eat(){ System.out.println("狗吃肉"); } public void lookHome(){ System.out.println("看家"); } }
final关键字修饰类 方法及变量的特点
- A:final修饰
- 修饰类 类不能继承
- 修改方法 方法不能被重写
- 修改变量 变量不能被修改
- B:常量命名规范
- 常量名所有字母大写 多个单词用_连接
- 使用final 一般会和pulibc static一起使用
- public static final double PI = 3.14;
final 关键字修饰局部变量
- A:案例演示
- 方法内部或者方法声明上都演示一下
- 基本类型,是值不能被改变
- 引用类型,是地址值不能被改变,属性值可以改变
- final Person p = new Person(“张三”,23);
- p = new Person(“李四”,24);//p是地址值 不可以被改变
- p.setName(“李四”);//可以改变 ,因为属性值可以被改变
- p.setAge(24);
final修饰的变量初始化时机
- A:final修饰变量初始化时机
- 显示初始化
- final int num = 10;
- 在对象构造方法完毕前即可(就是在构造方法中赋值)
- final int num;
- public Demo(){num = 10;}
- 显示初始化