java学习记录day7

类与对象

对象数组与管理

对象数组就是数组里的每个元素都是对象:House[] home = new House[10];使用对象数组实现多个House的管理。
拓展:数组的扩充:

  1. 扩充原来数组的一半:
public void add(House[] home){
	int newLen = home.length*3/2+1;
	home = Arrays.copyof(home,newLen);
}
  1. 扩充原来数组的一倍:
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,这是注解,理解成标签,表示修饰的方法是重写的父类的方法。
方法重写有完全重写和部分重写,完全重写就是在子类中,重新定义一个和父类名称一样的函数,并且在该函数中执行的功能和父类完全不同;部分重写是在子类函数中,重新定义一个和父类函数名称意义的函数,在重写函数中调用了父类的函数,先执行了父类中原有的功能,然后在该函数中添加额外功能的代码,这样的话,既保留了父类原有的功能,又扩展了这个函数的新功能。
方法重写的一些特性:

  1. 发生在子类和父类之间,参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致;
  2. 子类抛出的异常不能超过父类对应的方法,简单来说就是不能比父类被重写方法声明更多的异常(里氏代换原则);
  3. 子类方法的方位级别不能低于父类中相应方法的访问级别;
  4. 父类中的方法若是使用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()的作用:

  1. 使用super调用父类的属性,可以从父类实例处获得信息;
  2. 调用父类中的方法,可以委托父类帮助完成某件事情;
  3. 调用父类中的构造方法,必修在子类构造方法中的第一条语句,调用父类中相应的构造方法,若不写默认的调用父类中的无参构造方法;
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():以字符串形式返回对象的描述信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值