Java中的继承:子类继承父类,会继承父类的所有非私有的属性和方法。
如何设计父类?
将子类共有的特点和行为抽离出来定义成父类。
如何设计子类?
将子类特有的特点和行为定义在子类中,其他的特点和行为使用父类的。
父类:
package test;
public class Animal {
String name;//名字
int age;//年龄
double weight;//体重
public void say(){
System.out.println("宠物叫了~~~");
}
public void eat(){
System.out.println("宠物吃东西了~~~");
}
}
子类:
package test;
public class Cat extends Animal {
//子类特有的
String beard;//胡须
public void say(){
System.out.println("喵~~~");
}
}
package test;
public class Dog extends Animal {
public void say(){
System.out.println("汪汪汪~~~");
}
}
测试类:
package test;
public class AnimalTest {
public static void main(String[] args) {
//创建宠物对象
Cat cat1 =new Cat();
//Cat调用父类属性
cat1.name = "小咪";
System.out.println(cat1.name);
//调用自己的属性
System.out.println(cat1.beard);
cat1.say();
//此处调用的是从父类中继承过来的方法
cat1.eat();
Dog dog = new Dog();
//beard是猫特有属性,狗调用不到
// System.out.println(dog.beard);
dog.say();
}
}
运行结果:
子类会继承父类,他们的构造方法的执行顺序?
先执行父类的构造方法,再执行子类的构造方法。
注意:1.Java只支持单继承,一个Java类只能继承一个类
2.Java中可以多继承,继承具有传递性。 爷爷--->爸爸--->儿子
二、this关键字和super关键字this:当前对象 super:父类对象
public class Computer {
String birth;
public Computer() {
System.out.println("1父类的无参构造器");
}
public Computer(String birth) {
this.birth = birth;
System.out.println("3父类的有参构造器");
}
}
public class Pad extends Computer {
public Pad() {
super();//调用父类的构造器,这一行默认添加 即先创建父类对象
System.out.println("2子类的无参构造器");
}
public Pad(String birth) {
super();//调用父类的构造器,这一行默认添加 即先创建父类对象
System.out.println("4子类的有参构造器");
}
}
public class Test {
public static void main(String[] args) {
Pad pad1 = new Pad();//运行结果:13
Pad pad2 = new Pad("22");//运行结果:14
}
}
三、方法的重写与重载
(1)方法的重写override
发生在子类和父类的关系上,当子类含有和父类方法名相同、参数列表也相同的方法时,就不会再调用父类的方法,而是直接调用子类的方法,父类的方法就会被子类的方法覆盖掉,这种现象被称为方法的重写。
遵循两同两小一大 :
两同:方法名相同,参数列表相同;
两小:子类的返回值类型应该比父类的返回值类型小或者相等,子类抛出的异常要比父类的抛出的异常小或者相等;
一大:子类的访问修饰符要比父类的大或者相等。
(2)方法的重载overload
方法名相同,但参数列表不同(指的是类型、顺序不同,与参数名无关)
方法的重载与方法的访问修饰符以及返回值类型无关。
package test;
public class Father {
String name;
int age;
public void say(){
System.out.println(name+"您好~~~");
}
public void eat(){
System.out.println("吃小龙虾~~");
}
}
package test;
public class Son extends Father {
//方法的重写
public void eat(){
System.out.println("吃烤鱼~~");
}
public void hello(){
System.out.println("helloworld~~");
}
//与类型有关
public void hello(String name){
System.out.println("hello"+name);
}
//与参数名无关
// public void hello(String usname){
// System.out.println("hello"+name);
// }
//与返回值无关
// public String hello(String name){
// System.out.println("hello"+name);
// }
//与访问修饰符无关
// void hello(String name){
// System.out.println("hello"+name);
// }
public void hello(String name , int age){
System.out.println("hello"+name+",你的年龄:"+age);
}
//与参数顺序有关
public void hello(int age , String name){
System.out.println("hello"+name+",你的年龄:"+age);
}
}
四、访问修饰符
| 同类 | 同包不同类 | 不同包子类 | 不同包非子类 | |
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| default | √ | √ | × | × |
| prvivate | √ | × | × | × |



