java面向对象---继承

1.继承

  • 概述
    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
  • 继承格式
    通过extends关键字可以实现类与类的继承
    class 子类名 extends 父类名 {}
    单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。

2.继承案例演示

案例:父类和子类

public class Fu {
    String name="张三";
    int age=23;
    public void show() {
        System.out.println("我是show方法");
    }
}
public class Zi extends Fu{
}
public class MyTest {
    public static void main(String[] args) {
        //让类和类之间产生父子关系 extends 来实现继承关系
        Zi zi = new Zi();
        String name = zi.name;
        int age = zi.age;
        System.out.println(name);
        System.out.println(age);
        zi.show();
    }
}

  • 继承的好处
    a:提高了代码的复用性
    b:提高了代码的维护性
    c:让类与类之间产生了关系,是多态的前提

  • 继承的弊端
    类的耦合性增强了。

    开发的原则:高内聚,低耦合。
    耦合:类与类的关系
    内聚:就是自己完成某件事情的能力

3.Java中类的继承特点

  • a:Java只支持单继承,不支持多继承。
    有些语言是支持多继承,格式:extends 类1,类2,…
  • b:Java支持多层继承(继承体系)

4.继承的注意事项和什么时候使用继承

  • A:继承的注意事项
    • a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
    • b:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
    • c:不要为了部分功能而去继承
  • B:什么时候使用继承
    继承其实体现的是一种关系:“is a” .
    采用假设法。
    如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

5.继承中成员变量的关系

  • A:子类中的成员变量和父类中的成员变量名称不一样
  • B:子类中的成员变量和父类中的成员变量名称一样
    在子类中访问一个变量的查找顺序(“就近原则”)
    • a: 在子类的方法的局部范围找,有就使用
    • b: 在子类的成员范围找,有就使用
    • c: 在父类的成员范围找,有就使用
    • d:如果还找不到,就报错

6.this和super的区别和应用

  • A:通过问题引出super
    子类局部范围访问父类成员变量
  • B:说说this和super的区别
    this 代表的是本类对象的引用
    super代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
  • C:this和super的使用
    • a:调用成员变量
      this.成员变量 调用本类的成员变量
      super.成员变量 调用父类的成员变量
    • b:调用构造方法
      this(…) 调用本类的构造方法
      super(…) 调用父类的构造方法
    • c:调用成员方法
      this.成员方法 调用本类的成员方法
      super.成员方法 调用父类的成员方法

7.继承中构造方法的关系

A:案例演示
子类中所有的构造方法默认都会访问父类中空参数的构造方法
B:为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。

其实:
每一个构造方法的第一条语句默认都是:super()
在这里简单的提一句,Object类。否则有人就会针对父类的构造方法有疑问。Object在没有父类了。

8.继承中构造方法的注意事项

  • 父类没有无参构造方法,子类怎么办?
    • a: 在父类中添加一个无参的构造方法
    • b:子类通过super去显示调用父类其他的带参的构造方法
    • c:子类通过this去调用本类的其他构造方法
      本类其他构造也必须首先访问了父类构造
  • 注意事项
    super(…)或者this(….)必须出现在第一条语句上

9.继承中的面试题

  • A:看程序写结果
class Fu{
		public int num = 10;
		public Fu(){
			System.out.println("fu"); //fu
		}
	}
	class Zi extends Fu{
		public int num = 20;
		public Zi(){
			System.out.println("zi"); //zi
		}
		public void show(){
			int num = 30;
			System.out.println(num);//30
			System.out.println(this.num);//20
			System.out.println(super.num);//10
		}
	}
	class Test {
		public static void main(String[] args) {
			Zi z = new Zi();
			z.show();
		}
	}
  • B:看程序写结果
	class Fu {
		static {
			System.out.println("静态代码块Fu"); //3  1
		}


{
			System.out.println("构造代码块Fu"); //4 3
		}

public Fu() {
			System.out.println("构造方法Fu"); //5 4
		}
	}

class Zi extends Fu {
		static {
			System.out.println("静态代码块Zi"); //1  2
		}

		{
			System.out.println("构造代码块Zi"); //2 5
		}

		public Zi() {
			System.out.println("构造方法Zi"); //6    6
		}
	}
	
	class Test{
		public static void main(String[] args){
			Zi z = new Zi(); //请执行结果。
		}
	}
	/*
结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi*/
	

10.继承中成员方法关系

  • a:当子类的方法名和父类的方法名不一样的时候
  • b:当子类的方法名和父类的方法名一样的时候
    通过子类调用方法:
    • a: 先查找子类中有没有该方法,如果有就使用
    • b:在看父类中有没有该方法,有就使用
    • c: 如果没有就报错

11.方法重写概述及其应用

  • A:什么是方法重写
    子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
  • B: Override和Overload的区别?Overload能改变返回值类型吗?
  • C:方法重写的应用:
    当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
    这样,即沿袭了父类的功能,又定义了子类特有的内容。

12.方法重写的注意事项

  • a:父类中私有方法不能被重写
    因为父类私有方法子类根本就无法继承
  • b:子类重写父类方法时,访问权限不能更低
    最好就一致
  • c:父类静态方法,子类也必须通过静态方法进行重写

子类重写父类方法的时候,最好声明一模一样。

13.猫狗案例分析

父类的由来: 首先我们需要分析具体的事物,分析完毕以后将共性的内容提取出来放在一个独立的类中(父类)。

public class Animal {
    String name;
    String age;

    public void eat() {
        System.out.println("吃饭222222222222");
    }

    public void sleep() {
        System.out.println("睡觉2222222222222222222");
    }

}
public class Cat extends Animal{

    public void catchMouse(){
        System.out.println("抓老鼠");
    }
}
public class Dog extends Animal{

    public void lookDoor(){
        System.out.println("看门");
    }
}
public class MyTest {
    public static void main(String[] args) {
        //继承的思想:将多个子类的共性,向上抽取到父类当中,以实现代码的复用性和维护性
        Cat cat = new Cat();
        cat.name="汤姆";
        cat.age="10";
        System.out.println(cat.name);
        System.out.println(cat.age);
        cat.sleep();
        cat.eat();
        cat.catchMouse();

        System.out.println("-----------------------");

        Dog dog = new Dog();
        dog.name="旺财";
        dog.age="2";
        System.out.println(dog.name);
        System.out.println(dog.age);
        dog.eat();
        dog.sleep();
        dog.lookDoor();
    }
}

14.代码块

  • A:代码块概述
    在Java中,使用{}括起来的代码被称为代码块。
  • B:代码块分类
    根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)
  • C:常见代码块的应用
    • a:局部代码块
      方法中出现;限定变量生命周期,及早释放,提高内存利用率
    • b:构造代码块
      类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
    • c:静态代码块
      类中方法外出现,加了static修饰
      在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。

15.代码块的面试题

看程序写结果

class Student {
		static {
			System.out.println("Student 静态代码块"); //3
		}
		
		{
			System.out.println("Student 构造代码块"); //4 6
		}
		
		public Student() {
			System.out.println("Student 构造方法"); //5 7
		}
	}

	class StudentDemo {
		static {
			System.out.println("StudentDemo的静态代码块");  //1
		}
		
		public static void main(String[] args) {
			System.out.println("我是main方法"); //2 
			
			Student s1 = new Student();
			Student s2 = new Student();
			/*
			结果:
			StudentDemo的静态代码块
			我是main方法
			Student 静态代码块
			Student 构造代码块
			Student 构造方法
			Student 构造代码块
			Student 构造方法*/
		}
	}

你可能感兴趣的