文章目录
1.继承
继承是面向对象三大基本特征之一,是Java中实现代码重用的重要手段之一。Java中只支持单继承,即每个类只能有一个直接父类。
基本语法:
1:编写父类(或者叫基类、超类)
class pet(){
//公共的属性和方法
}
2:编写子类(SubClass),继承父类(SuperClass)
class Dog extends Pet {
//子类特有的属性和方法
}
深入理解继承
子类可以从父类中继承到哪些“财产”
1:继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
2:继承默认权限修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。
不能被继承的父类成员
1.private成员
2.子类与父类不在同包,使用默认访问权限的成员
3.构造方法
访问修饰符:
子类访问父类成员:
访问父类构造方法
super();
super(name);
访问父类属性
super.name;
访问父类方法
super.print();
注意:
(1)super代表对当前对象的直接父类对象的默认引用
(2)super必须出现在子类(子类的构造方法)中,且必须是第一句
(3)不可以访问父类中定义为private的属性和方法
继承关系中的构造方法
1.如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。
2.如果子类的构造方法中通过super显式调用父类的有参构造,则将执行父类相应的构造方法,而不执行父类的无参构造方法。
3.如果子类的构造方法中通过this显式调用自身的其他构造方法,则在相应构造方法中应用以上两条规则。
2.方法重写
方法重写:在子类中可以根据需求对从父类继承的方法进行重写,称为方法的重写或方法的覆盖。
方法重写的规则:
1.重写方法和被重写方法必须具有相同的方法名
2.重写方法和被重写方法必须具有相同的参数列表
3.重写方法的返回值类型必须和被重写方法的返回值相同或者是其子类
4.重写方法不能缩小被重写方法的访问权限
注意:(面试题)
请描述overloading和overriding有什么区别和联系?
1.overloading是方法重载,重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。
2.overriding是方法重写,重写涉及的是子类和父类的同名方法,要求方法名相同,参数列表不同,返回值类型相同(或是其子类)、访问修饰符不能严于父类。
equals和==的区别
总结:
1、对于基本数据类型,“==”比较的是两者的值是否相等。
2、对于引用数据类型:
(1)“”比较的是引用的地址是否相同(即是否是同一辆汽车(注意,只有一辆汽车));
在Object中的.equals()方法和"’功能一样(2)但是String类中的.equals()方法重写了,比较的是两个引用对象的内容是否想同(即是否是完全相同的汽车(注意,有两辆汽车,且一模一样,完全相同))。
3.final修饰符
在Java中,final修饰符可以用来修饰类、方法和变量(包括成员变量和局部变量)
1.当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
注:使用final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。
2.final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
3.当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
注意:(面试题)
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化。
如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
4.小练习
(可能有瑕疵,不建议照搬😊😊😊)
编写程序实现计算汽车租赁价
汽车类:
package com.bdqn.day06;
public class Car {
/**
* 天数
*/
private int day;
/**
* 类型
*/
private int type;
/**
* 品牌
*/
private int brand;
/**
* 价格
*/
private double money;
/**
* 型号
*/
private String model;
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getBrand() {
return brand;
}
public void setBrand(int brand) {
this.brand = brand;
}
public double getMoney() {
return money;
}
public double setMoney(double money) {
return this.money = money * day ;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
//无参
public Car(){
this.day = day;
this.type = type;
this.brand = brand;
this.model = model;
}
}
这些set,get是使用快捷键生成的,写完后也懒得在删减了,将就着看。
测试类:
package com.bdqn.day06;
import java.util.Scanner;
public class CarTest {
public static void main(String[] args) {
Car car = new Car();
Scanner sc = new Scanner(System.in);
System.out.println("欢迎您来到汽车租赁公司!");
System.out.println("请输入要租赁的天数:");
int day = sc.nextInt();
car.setDay(day);
System.out.println("请输入要租赁的汽车类型(1.轿车/2.客车)");
int choice = sc.nextInt();
switch (choice){
case 1:
System.out.println("请输入要租赁的汽车品牌:(1.宝马/2.别克)");
choice = sc.nextInt();
if (choice == 1){
double money = 500;
System.out.println("顾客你好!您需要支付的租金为" + car.setMoney(money));
}else {
System.out.println("请输入汽车型号:(1/2)");
choice = sc.nextInt();
switch (choice){
case 1:
double money = 600;
System.out.println("顾客你好!您需要支付的租金为" + car.setMoney(money));
break;
case 2:
double money1 = 300;
System.out.println("顾客你好!您需要支付的租金为" + car.setMoney(money1));
break;
}
}
break;
case 2:
System.out.println("请输入汽车的座位号:(1.金杯/2.金龙)");
choice = sc.nextInt();
if (choice <= 16){
double money = 800;
System.out.println("顾客你好!您需要支付的租金为" + car.setMoney(money));
}else {
double money = 1600;
System.out.println("顾客你好!您需要支付的租金为" + car.setMoney(money));
}
break;
}
}
}
运行截图:
总之运行没问题,异常倒是不少,将就一下。😊😊😊😊😊