1,继承
使用extends实现继承
父类中哪些成员可以被子类继承?
public成员,protected成员
不能被继承:private修饰的,default修饰的,构造方法
2,方法重写(override) 覆盖
概念:子类中重新实现父类中的方法
- 方法名一样,
- 参数列表一样
- 子类方法的返回值类型应该与父类型一样或是其子类
- 子类方法的访问控制修饰符其可见访问不能减小,
- 子类方法声明抛出的异常不能比父类方法声明抛出的异常多
3,Object类
Object类是所有类的父类,有几个方法一般会被重写
toString():输出或记录日志时会使用到该方法返回的结果
equals():在业务逻辑上判断是否是一个对象时重写
hashCode();
补充:
==与equals的区别
==:用于基本数据类型之间的比较,布尔类型不能与其他数值类别比较。比较是值
用于引用类型之间的比较,比较的是地址
equals: 只能使用引用类型调用,默认情况下与==一样,不过在实际开发中会重写该方法
1,声明一个实体类Student,属性;name,age,no(学号),重写equals方法
2,声明一个学生的操作类,有一个方法:
从一个学生数组中,根据姓名和学号判断给定的学生是否存在
3,测试
public class Student { private String name; private int age ; private int no; 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 int getNo() { return no; } public void setNo(int no) { this.no = no; } }
public class Studentmaker { public boolean equals(Student a,Student b){ if(a.getName().equals(b.getName())){ if(a.getNo()==b.getNo()){ return true; }else{return false;} } return false; } }
public class Sudenttest { public static void main(String[] args) { // TODO Auto-generated method stub Studentmaker studentmaker=new Studentmaker(); Student s1=new Student(); Student s2=new Student(); s1.setName("suxiao"); s1.setAge(21); s1.setNo(123); s2.setName("suxiao"); s2.setAge(21); s2.setNo(123); System.out.print(studentmaker.equals(s1, s2)); } }
4,绑定
向上转型与向下转型
向上转型:从子类型向父类型转换,自动的
向下转型:从父类型向子类型转换,使用强制转换的语法 ()
静态(前期):在编译时能决定访问到谁的属性或方法 static,final修饰的成员或方法
动态(后期):在运行时才能决定访问到谁的属性或方法,非static
instanceof关键字
instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
类的实例包含本身的实例,以及所有直接或间接子类的实例
instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误
使用该运算符的场景大部分情况是为了后续的向下转型,或称为保证类型安全
使用建议:
1,声明方法的时候,参数尽可能使用父类型
2,方法的返回值类型上,尽可能使用父类型
5,super
第一种用法:在普通方法(static方法除外)中调用父类中的属性或方法 super.
第二种用法:在子类的构造方法中,显式调用父类的构造方法 super()
6,类的初始化顺序
在子类构造方法调用时会首先调用父类的构造方法
执行的顺序:
父类静态代码块
子类静态代码块
父类代码块
父类的构造方法
子类的代码块
子类的构造方法
目的:了解初始化的顺序
7,final
使用场景及意义:
7.1 修饰变量,表示一个常量,一旦初始化就不可修改
方法中的局部变量:可以声明时赋初始值,可以在使用前赋值
类成员中的属性,可以声明时赋初始值,也可以在代码块或构造方法中赋值
如果是final修饰的引用类型变量,是不能重新赋值,但是其中的非final成员可以修改
final变量的命名一般是所有字母都大写,且使用下划线分隔
7.2 修饰方法,表示方法不能被子类重写
7.3 修饰类,表示该类不可被继承
定义一个汽车类Vehicle,要求如下:
(a)属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型)。
(b)至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。
(c)为属性提供getter/setter方法。注意:汽车品牌一旦初始化之后不能修改。
(d)定义一个方法run(),用打印语句描述汽车奔跑的功能。
定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。
public class Car { private final String brand; private String color; private double speed; public Car(String a,String b){ this.brand=a; this.color=b; this.speed=0; } public String getBrand() { return brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getSpeed() { return speed; } public void setSpeed(double speed) { this.speed = speed; } }
public class Cartest { public static void main(String[] args) { // TODO Auto-generated method stub Car car=new Car("benz", "黑色"); Run run=new Run(); run.run(car); } }
public class Run { public void run(Car c){ System.out.println(c.getColor()+"的"+c.getBrand()+"以"+c.getSpeed()+"速度奔跑"); } }
(2)定义一个Vehicle类的子类轿车类Car,要求如下:
(a)轿车有自己的属性载人数loader(int 类型)。
(b)提供该类初始化属性的构造方法。
(c)重新定义run(),用打印语句描述轿车奔跑的功能。
(d)定义测试类Test,在其main方法中创建一个品牌为“Honda”、颜色为“red”,载人数为2人的轿车
为了和这样的小姐姐共事,我一定会加油写代码的。