代码块分类
代码块分类:
1.局部代码块: 限制变量作用域(生命周期)
书写位置: 在方法中
2.构造代码块(在开发中 很少使用)
书写位置: 在类中 方法外
调用时机: 如果你有构造代码块 系统会帮你调用
帮你在创建对象之前调用 每次创建对象都会调用
3.静态代码块(一定是被static修饰)
静态代码块 依赖类 随着类加载而加载
注意:只加载一次(系统调用 只调用一次 不管你创建多少对象)
应用场景:加载驱动(数据库驱动 JDBC)
4.同步代码块(多线程)
实例:
public class Demo01 {
public static void main(String[] args) {
Person person = new Person();
person.setName("sxm");
person.setAge(20);
person.sayHi();
Person person2 = new Person("yy", 20);
person2.sayHi();
}
}
class Person{
private String name;
private int age;
static {
System.out.println("我是静态代码块");
}
{
sleep();
System.out.println("我是构造代码块");
}
public Person() {
System.out.println("我是无参的构造方法");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是有参的构造方法");
}
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 void sayHi() {
System.out.println(name + " " + age);
}
public void sleep() {
System.out.println("睡觉");
}
}
继承
继承的特点:
1.减少你的代码量
2.让类与类之间 产生关联(产生 父子关系)
继承使用的关键字 extends
注意:
1.继承时可把多个类中 相同的功能或方法 抽取出来,重新构造一个类出来 把这些类 建立继承关系
2.建立继承关系的同时 一定要符合逻辑(切记不要为了继承而继承)
继承的写法:
class 子类 extends 父类{
}
继承实例:
public class Demo02 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "汤姆";
cat.kind = "灰猫";
cat.catchMice();
cat.sleep();
}
}
class Animal{
String name;
String color;
String kind;
public void sleep() {
System.out.println("睡觉");
}
}
class Cat extends Animal{
public void catchMice() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public void eatBone() {
System.out.println("啃骨头");
}
}
java中的继承
注意:
1.Java 只允许 单继承(多继承可以使用接口来间接实现)
2.Java中 允许 多层继承(例如:爷爷 父亲 儿子 孙子...)
Java中 最顶层的父类(最基础的类) Object类
如果一个类 没有写继承哪个父类 默认就是继承Object类
1.如何 使用这些类中 共有方法/属性
创建 当前继承中 最顶端类 去使用
2.如何 使用这些类中 特有方法/属性
创建 当前继承中 最末端类 去使用
多层继承实例:
class A{
String name;
}
class B extends A{
}
class C extends B{
public void speak() {
System.out.println("会叫爷爷");
}
}
构造方法不能被继承
为了保证继承的完整性,在你创建子类对象的时候,如果你不调用 父类的构造方法,那么系统会默认帮你调用 父类的无参构造方法
代码示例:
public class Demo04 {
public static void main(String[] args) {
Son son = new Son();
son.name = "儿子";
son.sayHi();
System.out.println("------------");
Son son2 = new Son("小明");
son2.sayHi();
}
}
class Father{
String name;
public Father() {
System.out.println("我是爸爸类无参构造方法");
}
public Father(String name) {
this.name = name;
System.out.println("我是爸爸类有参构造方法");
}
public void sayHi() {
System.out.println(name);
}
}
class Son extends Father{
public Son() {
super();
System.out.println("我是儿子类无参的构造方法");
}
public Son(String name) {
super();
this.name = name;
System.out.println("我是儿子类有参的构造方法");
}
}
如果父类没有无参构造方法 如何解决?
解决方法如下:
class Phone{
String name;
public Phone(String name) {
this.name = name;
}
}
class Mi extends Phone{
public Mi() {
super("note");
}
public Mi(String name) {
super(name);
this.name = name;
}
}
建议: 不管父类 还是子类 构造方法 一定写全 避免出现问题
super和this 关键字
super代表的是父类的对象
super 调用对象 super点对象
调用方法 super点方法
this代表的是本类的对象
super(); 调用的是父类的构造方法
this(); 调用的是本类的构造方法
例如:
public class Demo05 {
public static void main(String[] args) {
TestB b = new TestB();
b.fun();
}
}
class TestA{
int num1 = 10;
int num2 = 20;
}
class TestB extends TestA{
int num1 = 30;
public void fun() {
System.out.println(this.num1);
System.out.println(this.num2);
System.out.println(super.num1);
}
}
方法的重写
方法的重写
注意:
1.方法声明完全一致的时候 叫方法重写
2.方法的重写 建立在 类与类 之间有继承关系 (子类重写父类的方法)
Override(重写) 和 Overload(重载) 的区别
1.重写: 前提 需要继承关系
重载: 在同一个类里
2.重写: 需要方法的声明 完全一致
重载: 只跟参数有关
方法的重写代码示例:
public class Demo07 {
public static void main(String[] args) {
IOS8 ios8 = new IOS8();
ios8.siri();
System.out.println(ios8);
}
}
class IOS7 {
public void call() {
System.out.println("打电话");
}
public void siri() {
System.out.println("说英文");
}
}
class IOS8 extends IOS7{
@Override
public void siri() {
super.siri();
}
@Override
public String toString() {
return "哈哈哈哈";
}
}
重写方法练习
需求:
老师类 学生类
无参 有参构造 set/get方法 成员变量私有化 介绍自己的方法
属性:姓名,年龄
行为:吃饭
老师有特有的方法:讲课
学生有特有的方法:学习
public class Demo08 {
public static void main(String[] args) {
Student student = new Student("yyy",18,5);
System.out.println(student);
}
}
class People{
private String name;
private int age;
public People() {
}
public People(String name, int age) {
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;
}
@Override
public String toString() {
return "姓名:" + name + " 年龄:" + age;
}
}
class Teacher extends People{
public Teacher() {
super();
}
public Teacher(String name, int age) {
super(name, age);
}
public void teach() {
System.out.println("讲课");
}
}
class Student extends People {
private int num;
public Student() {
super();
}
public Student(String name, int age, int num) {
super(name, age);
this.num = num;
}
@Override
public String toString() {
return super.toString() + " 学号:" + num;
}
public void learn() {
System.out.println("学习");
}
}