一、继承
语法格式:
????????????????????????class? B? extends? ?A {
????????????????????????}
B类继承了A类,A类是B类的唯一的父类或者叫超类或者叫基类,B类是A类的子类
java中是单继承【可以理解为一个儿子只能有亲生父亲】
B类继承了A类, A的东西(除了私有化的)都可以用!!!
java使用关键字: extends进行继承的操作,继承至少得有两个类
//父类
class Father {
//成员变量 公开的
public String name;
public int age;
//成员变量 私有的
private double money;
public Father () {
System.out.println("我是父类的无参构造方法");
}
//成员方法 公开的
public void work() {
System.out.println("开拖拉机");
}
//成员方法 私有的
private void smoking() {
System.out.println("抽旱烟");
}
public void test() {
this.smoking();
}
}
//子类
//Son类继承了Father 就意味着Son可以使用Father公开的成员变量
class Son extends Father{
public boolean isCar;//是否有车
public Son() {
System.out.println("我是子类的无参构造方法");
}
}
public class Demo {
public static void main(String[] args) {
Son son = new Son();
son.name = "小邢";//name属性是继承过来的
son.age = 3;//age属性也是继承过来的
son.isCar = true;
//son.money = 349.90;//由于是私有化的所以不能被继承
son.work();//这个work是父类的
//son.smoking();子类是不能继承父类私有的方法
// Father father = new Father();
// father.isCar; //父类不能使用子类的变量
// father.test();
}
}
?成员属性:
????????????????子类能继承父类公开的成员属性
????????????????子类不能继承父类私有的成员属性
成员方法:
????????????????子类能继承父类公开的成员方法
????????????????子类不能继承父类私有的成员方法
构造方法:
????????对于无参数的构造方法,子类继承了父类,实例化子类后,会把子类的无参构造方法执行,并且也会执行父类的无参构造方法。执行循序为,先执行父类的无参构造,再执行子类的无参数的构造。
????????子类的构造的过程中必须调用其基类的构造方法。子类可以在自己的构造方法中使用super()调用基类的构造方法。如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。如果调用super,必须写在子类构造方法的第一行。如果子类构造方法中既没有显示调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。
package com.qfedu.app1;
class A{
int ageA;
public A(){
System.out.println("我是A的无参构造");
}
public A(int ageA) {
this.ageA = ageA;
System.out.println("我是A的有参构造");
}
public void testA(){
System.out.println("我是A的方法");
}
}
class B extends A{
int ageB;
public B(){
super(3);
}
public void testB(){
System.out.println("我是B的方法");
}
}
public class Demo1 {
public static void main(String[] args) {
A a1 = new A();
B b = new B();
A a = new B();
a.ageA=2;
a.testA();
//运行结果如下:
//我是A的无参构造
//我是A的有参构造
//我是A的有参构造
//我是A的方法
}
}
?
二、super关键字
super关键字,调用父类的成员属性、成员方法、构造方法
成员变量:
????????super.age?= 20;? ? ??//只能写在子类定义的方法中
成员方法:
????????super.eat();? ? ? ? ?//只能在子类定义的方法中调用
构造方法:
????????在子类中的构造方法中去调用父类的构造方法。
【注意事项】:
1.使用super关键字时必须有继承关系。
2.super关键字必须写在子类中。意思是在子类中调用父类的一些东西
3.super.成员属性,只能写在子类的定义的方法中
4.super.方法() 只能写在子类定义的方法中
三、重写【override】
子类通过继承可以使用父类的非私有化的成员方法,但是有的时候父类的方法需求不满足子类的需求了。在不改变父类的方法需求下,可以对父类的方法进行重写
重写条件:
1.必须有继承关系
2.父类的方法必须是公开的
3.子类的方法必须和父类的方法一样(返回值,方法名字,参数)
4.必须在子类中重写
//父类
class Father {
public void eat () {
System.out.println("窝窝头");
}
public void going() {
System.out.println("二八大杠自行车");
}
}
//子类
class Son extends Father{
@Override//注解 开启了严格重写模式,就是告诉你下面的方法是重写的
public void eat() {
System.out.println("大鱼大肉");
}
@Override
public void going() {
System.out.println("共享单车");
}
}
public class Demo1 {
public static void main(String[] args) {
Son son = new Son();
son.eat();//父类与子类都有eat方法但是他们吃的东西不一样,表现出来的是相同的方法,但是有不同的功能
son.going();
}
}
?四、重载【overload】
重载的条件
1.必须在同一个类中
2.方法名字必须一样,返回值可以一样也可以不一样,但是参数一定不一样
package com.boke.app3;
class Person {
//run这三个方法就是方法的重载
//是方法名字一样 返回值一样 参数列表一定不同!!!
//成员方法
public void run () {
System.out.println("在跑步");
}
public void run(String name) {
System.out.println(name + "在跑步");
}
public void run (String name, int age) {
System.out.println(name + ":" + age + "在跑步");
}
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
person.run();
person.run("小明");
person.run("小红", 37);
}
}
五、instanceof关键字
是java中二元运算符,左边是对象,右边是类。返回值是布尔类型。当左边对象是右边的类或者子类所创建的对象时候,返回true.否则返回false
语法格式:
? ? ? ? ? ? ? ? 对象名??instanceof? ?Object;
现在有ABC三个类,A是B的父类,B是C的父类。(即C叫A为爷,C叫B为爹的关系)
package com.boke.app3;
public class Demo2 {
public static void main(String[] args) {
//实例化A,B,C类
A a = new A();
B b = new B();
C c = new C();
boolean result = b instanceof A;//true,B是A的子类
boolean result1 = a instanceof A;//true,a是由A实例化得到的
boolean result2 = c instanceof B;//true,C是B的子类
boolean result3 = c instanceof A;//true,C是A的孙子类
}
}
|