戳我跳到个人主页
本人码云(建议pc端打开,手机可能会出现字体过小问题。)
本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。
本人后续会在这里更新操作系统和计组的笔记,敬请期待!
有赞必回,评论必回,顺着网线回访!
面向对象的三大特征:封装性、继承性、多态性。
继承是多态的前提,如果没有继承,就没有多态。
假如徒弟和师傅是继承的关系:
继承主要解决的问题就是:共性抽取。
在继承的关系中,“子类就是一个父类”,也就是说,子类可以被当作父类看待。 例如父类是员工,子类是讲师,那么 ”讲师就是一个员工“。
关系:is-a。
定义父类的格式:(一个普通的类定义)
public class 父类名称 {
// . . .
}
定义子类的格式:
public class 子类名称 extends 父类名称 {
// . . .
}
父类员工、Employee
package three;
//定义一个父类,员工类
public class Employee
{
public void method()
{
System.out.println("方法执行!");
}
}
子类讲师、Teacher
package three;
//定义一个子类,讲师类
public class Teacher extends Employee
{
}
子类助教、Assistant
package three;
//定义了员工的另一个子类,助教类
public class Assistant extends Employee
{
}
类Demo01Extends
package three;
public class Demo01Extends
{
public static void main(String[] args)
{
//创建了一个子类对象
Teacher t = new Teacher();
t.method();
//Teacher类中虽然什么都没写,但是会继承来自父类的method方法。
//创建另一个子类对象
Assistant a = new Assiatant();
a.method();
//Assistant类也继承了员工类的方法
}
}
父类
package three;
public class Fu
{
//父类的三个成员变量
//分别是numFu、num1 和 num2
int numFu = 10;
int num1 = 100;
int num2 = 20;
public void methodFu()
{
System.out.println(num1);
}
public void methodZi()
{
System.out.println(num1);
}
}
子类
package three;
public class Zi extends Fu
{
//子类的两个成员变量
//是numZi、num1
//不难发现,num1与父类成员变量重名
int numZi = 20;
int num1 = 200;
//这是一个和父类成员方法重名的子类成员
public void methodZi()
{
//本类中有num1,优先用本类的
System.out.println(num1);
}
public void method()
{
//本类中没有num2,用父类的成员变量num2
System.out.println(num2);
}
}
应用类
1、父子类中可以出现重名变量和重名方法
;
2、父子类中均不可出现主方法
;(main)
3、子类可以继承
父类的成员变量和成员方法
;
4、例如:
父类:Fu.java
–成员变量:num1 = 100 ;
num2 = 200 ;
num4 = 90 ;
–成员方法:public void method1 () { out.num1; }
public void method3 () { out.num2; }
public void method4 () { out.num1; }
子类:Zi.java
–成员变量:num1 = 10 ;
num3 = 30 ;
–成员方法:public void method1 () { out.num1; }
public void method2 () { out.num2; }
public void method3() { out.num4; }
public void method5() { out.num3; }
5、当创建一个父类对象时:
Fu f = new Fu() ;
就跟基本的类的使用方法一致。
6、当创建一个子类对象时
:
Zi z = new Zi() ;
z对象可以使用的范畴
:
成员变量区:
z.num1 = 10 ; 重名,用子类的
z.num2 = 200 ; 继承
z.num3 = 30 ; 子类专有的变量
z.num4 = 90 ; 继承
成员方法区:
z.method5() ; //30,子类专有的方法,子类专有的变量 ;
z.method1() ; //10,重名方法包含重名变量,用子类的变量;
z.method2() ; //200,子类方法method2继承父类的num2,再引用给子类对象z;
z.method3() ; //90,重名方法,子类中的方法method3继承父类的变量num4,再引用给子类变量z;
z.method4() ; //100,继承父类的方法,输出父类的num1。
综上所述: 先看方法属于父类还是子类,再看成员变量是否需要继承。
一、重写(覆盖、覆写)
[1]、概念:在继承关系中,父子类中方法的名称一样,参数列表也一样。
[2]、区别
重写:方法名称一样,参数列表【也一样】;
重载:方法名称一样,参数列表【不一样】。
二、方法覆盖重写注意事项!!!
[1]、必须保证父子类中方法名称相同,参数列表也相同;
[2]、@Override:写在【子类方法】前面,用于检测是不是正确有效的覆盖重写;
[3]、【子类方法】返回值 必须【小于等于】父类的返回值类型;
//前提:Object类是所有类的公共最高父类(祖宗类)
//java.lang.String就是Object的子类
[4]、【子类方法】的 权限 必须【大于等于】父类方法的权限修饰符;
小扩展提示:public > protected > (default) > private
备注:(default)不是关键字default,而是什么都不写,留空。
method方法,继承num2变量并且正常覆写;
poly方法,遵循了子类返回值小于等于父类的;
dc方法,Object类是所有类的祖宗类;
mars方法,遵循子类方法权限大于父类。
二、父类老手机
package jicheng02;
public class OldPhone
{
String name;
int telnumber;
String location;
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
public void show(){
System.out.println("来电显示");
}
}
三、子类新手机
package jicheng02;
public class NewPhone extends OldPhone
{
/* String name;
int telnumber;
String location;
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
注释为新旧手机的继承
*/
@Override
public void show()
{
super.show();
//super关键字、可以引用父类方法中相同的部分、后面会详细介绍
System.out.println("姓名:"+name);
System.out.println("电话号码:"+telnumber);
}
}
四、应用类Demo手机
package jicheng02;
public class DemoPhone
{
public static void main(String[] args)
{
NewPhone p1 = new NewPhone();
p1.name = " John Lee ";
p1.telnumber = 1872698;
p1.location = "安徽六安";
p1.show();
}
}
继承关系中,父子类构造方法的访问特点:
1、子类构造方法当中有一个默认的“super()”,先调用父类,后调用子类;
2、可以通过super关键字在子类构造方法中调用【父类重载构造】;
3、super的父类构造调用,必须是子类构造方法中第一条语句,也只能调用一次;
总结:
【1】子类必须调用父类构造方法,不写则赠送super();
, 写了则用写的指定的super调用,例父类的重载构造方法;
【2】子类构造方法中,super只能有一个,而且是第一条语句
。
06:06:33
父类
package jicheng03;
public class Fu
{
public Fu()
{
System.out.println("父类无参构造");
}
public Fu(int num)
{
System.out.println("父类有参重载构造方法");
System.out.println(num);
}
}
子类
package jicheng03;
public class Zi extends Fu
{
public Zi()
{
// super();在调用父类无参构造方法
super(10);//在调用父类重载构造方法
System.out.println("子类构造方法");
}
}
应用类
package jicheng03;
public class Demo
{
public static void main(String[] args)
{
Zi zi = new Zi();
}
}
1、在子类的成员方法中,访问父类的成员变量。
2、在子类的成员方法中,访问父类的成员方法。
3、在子类的构造方法中,访问父类的构造方法。
子类
1、在本类的成员方法中,访问本类的成员变量;
(重名变量时使用)
2、在本类的成员方法中,访问另一个成员方法;
3、在本类的构造方法中,访问本类的另一个构造方法。
(A、也必须是那个方法中的第一条语句)
(B、super和this构造方法的调用,不能在同一个方法中)
父类
package jicheng05;
public class Fu{
int num = 90;
}
子类
package jicheng05;
public class ZI extends Fu
{
int num = 20;
s
//子类两个构造方法
public ZI(){
System.out.println("子类无参构造方法");
}
public ZI(int num){
this();//有参方法、调用无参方法
this.num = num;
System.out.println("子类全参构造方法,参数是+"num);
}
s
//子类show方法
public void show(){
int num = 10;
System.out.println(num);//局部
System.out.println(this.num);//成员
System.out.println(super.num);//父类成员
}
s
//子类,B方法访问A
public void metA(){
System.out.println("AAA");
}
public void metB(){
this.metA();
System.out.println("BBB");
}
}