继承是什么
继承是让类与类之间产生关联,父子的关系
关键字:extends
格式在定义子类时,在子类类名后面加上 extends 父类类名
public static void main(String[] args) {
Student s = new Student();//**********
s.name = "qwe";
s.age = 23;
System.out.println(s.name+"..."+s.age);
s.show();
}
}
class P {
String name;
int age;
public void show() {
System.out.println("61");
}
}
class Student extends P{//student继承p里的成员可以直接拿来使用
}
继承的注意事项
1、私有成员不能被继承
1)父类当中的私有成员,不能在子类中直接使用
2)在子类对象中,任然包含了父类的私有成员变量,只是在子类中,不能直接访问私有成员而已
2、父类中的构造方法不能被继承【构造方法就是满参空参构造类型,用于给创建对象的时候赋值】
原因:从格式上讲,构造方法必须和所在类的名称保持一致,如果父类构造能被继承,那此时,构造方法名称到底和父类保持一致还是和子类保持一致就说不清楚了
1、从原理上讲,创建对象的时候,会调用对应的构造方法,如果父类的构造能被继承,那么子类创建对象的时候,创建的对象到底属于父类还是属于子类也说不清楚
2、解决办法:可以通过子类构造访问父类构造,父类构造再去访问父类私有的成员变量,从而达成间接访问
3、继承的设计思路:子类 is a 父类【子类时父类的一种】
继承的特点
Java支持单继承,不支持多继承,支持多层继承
单继承:一个儿子只有一个亲爹
多继承:一个儿子不能有多个亲爹
多层继承:C继承B,B继承A
关键字this和super
this:指代当前类型的当前对象的引用
super:指代当前对象的父类的引用
都可以访问成员变量【this.变量名】【super.变量名】
都可以访问成员方法【this.方法名】【super.方法名】
都可以访问构造方法【this();访问本类的其他构造】【super();访问父类的指定构造】
public static void main(String[] args) {
Student s = new Student();
s.show();
}
}
class P {
String name = "花红柳绿";
int age = 20;
}
class Student extends P{
String name = "张三";
int age = 80;
public void show() {
System.out.println(name);//张三
System.out.println(age);// 80
System.out.println("--------------");//
System.out.println(super.name);//花红柳绿
System.out.println(this.name);//张三
System.out.println("--------------");//
System.out.println(super.age);// 20
System.out.println(age);//80
}
this和super关键字总结
public static void main(String[] args) {
Apple a = new Apple("红色", "甜的", 100);
System.out.println(a.getColor()+a.getTaste()+a.getWeight());
}
}
class Fruit {
private String color;
private String taste;
private int weight;
public Fruit() {
}
public Fruit(String color, String taste, int weight) {
System.out.println("父类的有参构造执行了");
this.color = color;
this.taste = taste;
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getTaste() {
return taste;
}
public void setTaste(String taste) {
this.taste = taste;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
class Apple extends Fruit {
public Apple() {
System.out.println("子类空参执行了");
}
public Apple(String color, String taste, int weight) {
//this();//不可同时存在
super(color, taste, weight);//获取父类中成员变量
System.out.println("子类的有参构造执行了");
}
重写:Override,覆写,覆盖,在子类中使用新的方法体覆盖父类方法旧的方法体
重写定义:在字符类中,方法名称相同,参数列表相同,与返回值类型有关重载定义:在同一个类中,方法名称相同,参数列表不同,与返回值类型无关【有参无参】
【何为有关:
(1)重写的方法返回值类型可以保持一致
(2)也可以是:子类方法返回值类型是父类方法返回值类型的子类,不能颠倒关系,更不能是无关类
public static void main(String[] args) {
Benz b = new Benz();
b.run();
Benz.test();//奔驰的跑
}
}
class Car {
public Object run() {
System.out.println("汽车类的跑");
return null;
}
public static void test() {
System.out.println("!!!!!!!!!!!!");
}
}
class Benz extends Car {
@Override
public String run() {
System.out.println("奔驰的跑");
return null;
}
**
复习重载:根据对象的参数来决定执行哪个构造方法
**