目录
重写
对于父类当中的方法不满意,想要在子类自己实现一个类似的方法。
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(name+"吃饭");
}
}
class Dog extends Animal{
public boolean loyal;
//Dog类 继承 Animal类 后,想要对父类的 eat()方法改造一下
//这时就要用到 重写
@Override
//这是注解 如果重写的方法名或者返回值有问题,它就会报错
public void eat() {
System.out.println(name+"吃骨头!");
}
public void gradHouse(){
System.out.println(name+"守护房子!");
}
}
class Cat extends Animal{
public boolean lazy;
//同样再Cat类里面也重写一下eat()
@Override
public void eat() {
System.out.println(name+"吃鱼");
}
public void catchMouse(){
System.out.println(name+"抓老鼠!");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "旺财";
dog.eat();
Cat cat = new Cat();
cat.name = "咪咪";
cat.eat();
}
}
注:
1.重写的方法返回值和参数都不能变,只有内部具体的功能可以改变。
返回类型(返回类型为类)若是不同,二者必须具有父子类关系。
2.重写的方法不能被static、final修饰符限定,且构造方法不能重写。
3.重写的方法限定符的范围必须大于等于原来的方法。
向上转型
简单的理解为 创建一个子类对象,其把它的类型当成父类来使用。
语法格式 父类类型 变量名 = new 子类类型()
通过上面格式,这种赋值的形式,我们可以通过直接赋值、方法传参和方法返回来使用。
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(name+"吃饭");
}
}
class Dog extends Animal{
public boolean loyal;
//Dog类 继承 Animal类 后,想要对父类的 eat()方法改造一下
//这时就要用到 重写
@Override
//这是注解 如果重写的方法名或者返回值有问题,它就会报错
public void eat() {
System.out.println(name+"吃骨头!");
}
public void gradHouse(){
System.out.println(name+"守护房子!");
}
}
class Cat extends Animal {
public boolean lazy;
//同样再Cat类里面也重写一下eat()
@Override
public void eat() {
System.out.println(name + "吃鱼");
}
public void catchMouse() {
System.out.println(name + "抓老鼠!");
}
}
class _Test{
public static void func1(Animal b){
b = new Dog();
}
public static Animal func2(){
return new Dog();
}
}
public class Test {
public static void main(String[] args) {
//直接赋值
Animal a = new Dog();
a.name = "旺财";
a.eat();
System.out.println("------------");
//参数赋值
_Test.func1(a);
a.name = "大黄";
a.eat();
System.out.println("------------");
//返回值赋值
Animal c = _Test.func2();
c.name = "汪汪";
c.eat();
}
}
多态
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(name+"吃饭");
}
}
class Dog extends Animal{
public boolean loyal;
@Override
public void eat() {
System.out.println(name+"吃骨头!");
}
public void gradHouse(){
System.out.println(name+"守护房子!");
}
}
class Cat extends Animal {
public boolean lazy;
@Override
public void eat() {
System.out.println(name + "吃鱼");
}
public void catchMouse() {
System.out.println(name + "抓老鼠!");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
Animal b = new Cat();
a.name = "旺财";
b.name = "咪咪";
a.eat();
b.eat();
}
}
最后在main方法中,用了一个Animal类实例化了两个对象,这两个对象做了相同的事情(调用了相同的方法),产生了不同的效果。这就是多态。
希望有什么错误评论区指出。