类与对象
对象数组与管理
对象数组就是数组里的每个元素都是对象:House[] home = new House[10];
使用对象数组实现多个House的管理。
拓展:数组的扩充:
- 扩充原来数组的一半:
public void add(House[] home){
int newLen = home.length*3/2+1;
home = Arrays.copyof(home,newLen);
}
- 扩充原来数组的一倍:
public void add(House[] home){
int newLen = home.length*2;
home = Arrays.copyof(home,newLen);
}
类的继承
继承是从已有的类创建新类的过程。
1、继承是面向对象三大特征之一;
2、被继承的类成为父类(超类),继承父类的类的类成为子类(派生类);
3、继承是指一个对象直接使用另一对象的属性和方法;
4、通过继承可以实现代码重用;
继承的限制:
1、子类会拥有父类的属性和方法,构造方法不能被继承,私有的方法不能继承;
2、继承关系是单继承,不能多重继承,子类不能继承多个父类,但父类可以有多个子类,可以通过类的层级关系,间接实现多继承;
3、构造方法不能被继承可以通过super()来调用,但只能在子类构造方法中的第一句;
4、当父类中没有无参构造方法时,子类必须显示调用父类的带参构造方法;
public class Test{
public static void main(String[] args) {
Dog dog = new SingleDog();
dog.Smile();
dog.eat();
}
}
class Dog{
private String sex;//想要获取这个属性,可以写get方法
protected String name;//protected:自身,子类及同一个包中类可以访问。
public void Dog(String name ,String sex){
this.name = name;
this.sex = sex;
System.out.println("父类构造方法");
}
public void eat(){
System.out.println("富婆,饿饿,饭饭");
}
public void getName(String name){
this.name = name;
}
}
class SingleDog extends Dog{
public void SingleDog(){
super("帅哥","男");
System.out.println("子类类构造方法");
}
public static void Smile(){
System.out.println("哈哈,被骗了,我是一个人");
}
}
class HomeDog extends Dog{
public void SingleDog(){
super("大黄","母");
System.out.println("子类类构造方法");
}
public static void Smile(){
System.out.println(name + "汪汪!");
}
}
//代码未测试,可能有错误,有兴趣的可在评论区告诉我,一起学习
方法重写与super
方法重写
子类虽然可以继承父类的方法,但有的时候子类的方法与非类不尽相同,这时候就需要使用方法重写。
重写时一般都会在定义方法的上一行写上:@Override,这是注解,理解成标签,表示修饰的方法是重写的父类的方法。
方法重写有完全重写和部分重写,完全重写就是在子类中,重新定义一个和父类名称一样的函数,并且在该函数中执行的功能和父类完全不同;部分重写是在子类函数中,重新定义一个和父类函数名称意义的函数,在重写函数中调用了父类的函数,先执行了父类中原有的功能,然后在该函数中添加额外功能的代码,这样的话,既保留了父类原有的功能,又扩展了这个函数的新功能。
方法重写的一些特性:
- 发生在子类和父类之间,参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致;
- 子类抛出的异常不能超过父类对应的方法,简单来说就是不能比父类被重写方法声明更多的异常(里氏代换原则);
- 子类方法的方位级别不能低于父类中相应方法的访问级别;
- 父类中的方法若是使用private、static、final任意修饰符修饰,则不能被重写;
public class Test{
public static void main(String[] args) {
SingleDog singledog = new SingleDog();
dog.Smile();
dog.eat();
HomeDog homedog = new HomeDog();
dog.Smile();
dog.eat();
}
}
class Dog{
private String sex;//想要获取这个属性,可以写get方法
protected String name;//protected:自身,子类及同一个包中类可以访问。
public void Dog(String name ,String sex){
this.name = name;
this.sex = sex;
System.out.println("父类构造方法");
}
public void eat(){
System.out.println("吃饭");
}
public void getName(String name){
this.name = name;
}
}
class SingleDog extends Dog{
public void SingleDog(){
super("帅哥","男");
System.out.println("子类类构造方法");
}
public static void Smile(){
System.out.println("哈哈,被骗了,我是一个人");
}
@Override
public void eat(){
System.out.println("富婆,饿饿,饭饭");
}
}
class HomeDog extends Dog{
public void SingleDog(){
super("大黄","母");
System.out.println("子类类构造方法");
}
public static void Smile(){
System.out.println(name + "汪汪!");
}
@Override
public void eat(){
System.out.println("铲屎的,上菜");
}
}
还有一个与方法重写的名字比较像的方法重载,我们之前学习过,他们的区别是什么呢?
面试题:Override与Overlode的区别?
Overlode:方法重载,发生在同一个类中,方法名相同,参数列表不同,返回值无关;
Override:方法重写,发生在子父类中,方法名相同,参数列表相同,返回值相同,子类的访问修饰符要大于等于父类,子类声明的异常不能比父类被重写方法声明更多的异常,父类中的方法若是使用private、static、final任意修饰符修饰,则不能被重写。
super
super()的作用:
- 使用super调用父类的属性,可以从父类实例处获得信息;
- 调用父类中的方法,可以委托父类帮助完成某件事情;
- 调用父类中的构造方法,必修在子类构造方法中的第一条语句,调用父类中相应的构造方法,若不写默认的调用父类中的无参构造方法;
public class Test{
public static void main(String[] args) {
SingleDog singledog = new SingleDog();
dog.Smile();
dog.eat();
HomeDog homedog = new HomeDog();
dog.Smile();
dog.eat();
}
}
class Dog{
private String sex;//想要获取这个属性,可以写get方法
protected String name;//protected:自身,子类及同一个包中类可以访问。
public void Dog(String name ,String sex){
this.name = name;
this.sex = sex;
System.out.println("父类构造方法");
}
public void eat(){
System.out.println("吃饭");
}
}
class SingleDog extends Dog{
public void SingleDog(){
super("帅哥","男");
System.out.println("子类类构造方法");
}
public static void Smile(){
//调用父类的属性,如果是继承过来的,那么super可以省略
System.out.println(super.name + "哈哈,被骗了,我是一个人");
}
@Override
public void eat(){
System.out.println("富婆,饿饿,饭饭");
}
}
class HomeDog extends Dog{
public void SingleDog(){
super("大黄","母");
System.out.println("子类类构造方法");
}
public static void Smile(){
System.out.println(name + "汪汪!");
}
@Override
public void eat(){
super.eat();//调用父类方法(部分重写)
System.out.println("铲屎的,上菜");
}
}
知识补充
Object类
所有的类的最高父类
equals(正则) hashCode(16进制) toString
重写toString():以字符串形式返回对象的描述信息