继承(核心)
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
-
extends的意思是“扩展”.子类是父类的扩展
-
Java中类只有单继承,没有多继承(一个儿子只能有一个爸爸,但是一个爸爸可以有多个儿子)
-
继承是类和类之间的一种关系。除此之外,类与类之间的关系还有依赖,组合,聚合等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类使用extends来表示。
-
子类和父类之间从意义上讲应该具有“is a"的关系
-
-
package fatherson; //Person 人 public class Person { }
package fatherson; //学生 is 人 public class Student extends Person{ }
package fatherson; //Teacher is 人 public class Teacher extends Person { }
-
意思
示例代码
-
package fatherson; //Person 人//现实中儿子可以继承父亲的所有东西 //而这:子类可以继承父类的所有方法 public class Person { public int money=10_0000_0000; public void say(){ System.out.println("说话"); } }
package fatherson;
//学生 is 人
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person{
}
-
ackage fatherson; public class Application { public static void main(String[] args) { Student student=new Student(); student.say(); //由于继承的关系子类也能”说话了“ System.out.println(student.money); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpfruX0s-1632919359402)(D:\JAVA学习图片\java面向对象\22.png)]
当修饰符不是public时
-
public
-
protected(受保护的)
-
default(默认)
-
private
-
当修饰符为private时(更改上述代码的money)
-
package fatherson; //Person 人//现实中儿子可以继承父亲的所有东西 //而这:子类可以继承父类的所有方法 public class Person { private int money=10_0000_0000; public void say(){ System.out.println("说话"); } }
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OShFSY3T-1632919359404)(D:\JAVA学习图片\java面向对象\23.png)]
-
父亲私有的东西儿子不能继承!
-
但是父亲可以留一些方法(封装)让儿子调用
-
package fatherson; //Person 人//现实中儿子可以继承父亲的所有东西 //而这:子类可以继承父类的所有方法 public class Person { private int money=10_0000_0000; public void say(){ System.out.println("说话"); } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } }
package fatherson;public class Application { public static void main(String[] args) { Student student=new Student(); student.say(); //由于继承的关系子类也能”说话了“ System.out.println(student.getMoney()); }}
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXnHR7lE-1632919359404)(D:\JAVA学习图片\java面向对象\24.png)]
-
快捷键
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37lvJ4Ls-1632919359405)(D:\JAVA学习图片\java面向对象\25.png)]
super详解
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或者构造方法中
-
super和this不能同时调用构造方法
-
示例代码
-
package fatherson;public class Application { public static void main(String[] args) { Student student=new Student(); student.test(("鲁邦")); }}
package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person { protected String name="amy aining";}
package fatherson;//学生 is 人public class Student extends Person{ private String name="阿米"; public void test(String name){ System.out.println(name);//指代的是ublic void test(String name) System.out.println(this.name);//指代的是private String name="阿米"; System.out.println(super.name);//调用的是父类的name }}
-
-
还能继承父类的方法
-
-
package fatherson;public class Application { public static void main(String[] args) { Student student=new Student(); //student.test(("鲁邦")); student.test1(); }}
package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person { protected String name="amy aining"; public void print(){ System.out.println("person"); }}
package fatherson;//学生 is 人public class Student extends Person{ private String name="阿米"; public void print(){ System.out.println("Student"); } public void test(String name){ System.out.println(name);//指代的是ublic void test(String name) System.out.println(this.name);//指代的是private String name="阿米"; System.out.println(super.name);//调用的是父类的name } public void test1(){ print(); this.print(); super.print(); }}
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-niyI6yAu-1632919359407)(D:\JAVA学习图片\java面向对象\27.png)]
-
-
注意
-
将Person(父类)中的关键词从public变成private
-
会发现
-
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JFwIiTcv-1632919359408)(D:\JAVA学习图片\java面向对象\28.png)]
-
所以私有的不会被继承
构造器的相关问题
-
类中有默认的构造器
-
调用一个对象会先走无参构造器
-
package fatherson;public class Application { public static void main(String[] args) { Student student=new Student(); //student.test(("鲁邦")); // student.test1(); }}
package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person { public Person() {System.out.println("Person无参执行了"); } protected String name="amy aining"; public void print(){ System.out.println("person"); }}
-
package fatherson;import com.company.Hello;//学生 is 人public class Student extends Person{ public Student() { //隐藏代码:调用了父类的无参构造 super();//调用父类的构造器,必须要在子类构造器的第一行 System.out.println("Student无参执行了"); } private String name="阿米"; public void print(){ System.out.println("Student"); } public void test(String name){ System.out.println(name);//指代的是ublic void test(String name) System.out.println(this.name);//指代的是private String name="阿米"; System.out.println(super.name);//调用的是父类的name } public void test1(){ print();//Student this.print();//Student super.print();//Person }}
-
注意这里有一行隐藏代码
-
在Student时调用了父类的无参构造super();
-
而且调用父类的构造器必须在子类构造器的第一行;
-
this也是同理
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qycBrjS6-1632919359410)(D:\JAVA学习图片\java面向对象\30.png)]
-
无参构造必须存在否则不能运行。
super与this的区别
-
代表对象不同:
this:本身调用者这个对象
super:代表父类的对象的应用
-
前提
this:没有继承也可以使用
super:只能在继承条件下才能使用
-
构造方法
this():本类的构造
super():父类的构造
重写
-
先重新定义两个类
-
-
package Fatherandson1;public class A extends B{ public static void test(){ System.out.println("A>=test"); }}
package Fatherandson1;//重写都是方法的重写,和属性无关public class B { public static void test(){ System.out.println("B>=test"); }}
-
-
-
package Fatherandson1;public class Application { public static void main(String[] args) { A a=new A(); a.test();//调用的是A的test //之后的蜜汁操作 B b=new A();//new的都是A但是结果却不同 b.test();//B //他们之间有继承关系。 //父类的引用指向子类。理解:儿子有困难爸爸给以给予帮助 //B>=test //B>=test }}
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0grpzkS-1632919359411)(D:\JAVA学习图片\java面向对象\31.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmCJrrjG-1632919359412)(D:\JAVA学习图片\java面向对象\32.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yb9YIy2-1632919359413)(D:\JAVA学习图片\java面向对象\33.png)]
-
这就是方法的重载
-
package Fatherandson1;//重写都是方法的重写,和属性无关public class B { public void test(){ System.out.println("B>=test"); }}
-
package Fatherandson1;public class A extends B { //Override 重写 @Override //注解:有功能的注释 public void test() { System.out.println("A>=test"); }}
package Fatherandson1;public class Application { public static void main(String[] args) { A a=new A(); a.test();//调用的是A的test //父类的引用指向了子类 B b=new A();//子类重写了父类的方法 b.test();//B //A>=test //A>=test }}
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtCP7YPx-1632919359414)(D:\JAVA学习图片\java面向对象\35.png)]
-
-
发现静态的方法和非静态的方法区别很大