一、继承
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:父类对象
/**
* this:当前对象
* super:父类对象
* 在子类构造器中,默认第一行添加super()来调用父类构造器
* 无论在有参还是无参,默认的都是调用父类的无参构造器
* 注意: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;
/**
* 父类:father
*/
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 | √ | × | × | × |