/*继承*/
1.java只支持单继承不支持多继承
原因:会带来安全隐患,因为当继承多个类中相同功能不同内容时,子类不知道继承哪一个。
2.当有多继承时,应创建最子类的对象,因为最子类对象可以使用最多的功能。
/*子父类中变量的特点*/
三个方面进行思考:
1.变量,
2.函数,
3.构造函数。
/*子父类中变量的特点*/
情况一:
class Fu
{
int num=3;
}
class Zi extends Fu
{
int num=5;
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
System.out.println(z.num); //打印结果为5,表明当子父类出现同名变量时,优先打印子类变量
}
}
情况二:
class Fu
{
private int num3=4;
int num1=3;
}
class Zi extends Fu
{
int num2=5;
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
System.out.println(z.num1+"......"+z.num2+"...."); //表明子类继承父类可以继承父类中未被私有的变量
}
}
情况三:
/*关键字:super*/
class Fu
{
int num=3;
}
class Zi extends Fu
{
int num=5;
public void show()
{
System.out.println(super.num+"....."+num); //当子父类出现同名变量时,super.表示父类对象
}
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
}
}
情况四:
class Fu
{
int num=3;
}
class Zi extends Fu
{
//int num=5;
public void show()
{
System.out.println(this.num); //打印结果为3,这可以看作子类继承父类,子类中含父类变量
}
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
}
}
/*子父类函数的特点*/
情况一:
class Fu
{
void show1()
{
System.out.println("Fu show");
}
}
class Zi extends Fu
{
void show2()
{
System.out.println("Zi show");
}
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show1();
z.show2(); //打印结果为:Fu show
} Zi show
} //表示子类继承父类会继承父类未私有的函数
情况二:
/*重写或覆盖*/
//当子类和父类有相同函数名,但内容不同时,子类会将父类该函数覆盖(重写)掉
class Fu
{
void show()
{
System.out.println("Fu show");
}
}
class Zi extends Fu
{
void show()
{
System.out.println("Zi show");
}
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show(); //打印结果为 Zi show
}
}
情况三:
/*子父类函数中super的利用*/
class Fu
{
void show()
{
System.out.println("Fu show");
}
}
class Zi extends Fu
{
void show()
{
//System.out.println("Fu show");
super.show(); //当子类需要用到父类功能中的内容时,利用super.可以简化代码
System.out.println("Zi show");
}
}
class Q1
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
}
}
注意事项:1.对于覆盖来说,子类的权限必须大于或等于父类 权限大小比较: public > protected > private
2.静态只能覆盖静态。
/*重载和重写的区别*/
/*重载*/
同一个类下的同名函数,例如:
class Q1
{
public int tool(int a,int b)
{
//
}
public void tool(int a,int b,double c)
{
//
}
}
//overload重载只和参数列表有关系,参数个数,参数类型,参数顺序,与返回值类型无关。
/*重写*/
//在子父类中,同名定义(返回值类型相同)相同内容不同的函数,子类会覆盖父类,父类仍然存在,只是没用被调用
/*子父类构造函数的特点*/
this(),super() 使用的前提是必须是构造函数
//this() 用于本类中构造函数1调用构造函数2的内容
//super() 用于子父类中构造函数1调用构造函数2的内容
例一://this()
class Person
{
Person()
{
System.out.println("阿秋");
}
Person(int x)
{
this(); //调用Person()中的内容
System.out.println("阿秋来了") //注意this(),super()必须放在构造函数内容的第一行
}
}
例二://super()
class Fu
{
Fu()
{
System.out.println("阿秋");
}
}
class Zi extends Fu
{
Zi()
{
//super(); //注意,这是一个隐式的调用子类构造函数的代码
System.out.println("阿秋来了");
}
}
/*子父类super的其他作用*/
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
void show()
{
System.out.println(name);
}
}
class Student extends Person
{
Student(String name) //父类已经定义了name的属性,子类省略
{
super(name); //super对于构造函数调用的格式
}
void method()
{
super.show(); //super对于一般函数调用的方式
}
}
class Q1
{
public static void main(String[] args)
{
Student ss=new Student("阿秋");
ss.method();
}
}
/*this(),super()都必须是第一行*/
当this()占据第一行时,隐式的super()会消失,但并不影响调用父类构造函数,因为this()被调用时还是会访问空参的构造函数,而
空参的本类构造函数还是会访问隐式的super().
/*父类的构造函数也有super()*/
所有类的父类是 Object 类。
/*关键字final*/
特点:
1.final 可以修饰类,函数,变量;
2.被 final 修饰的类不能被继承,最终类(用处:为了避免子类继承父类将父类功能覆写);
3.被 final 修饰的方法不能被覆写;(会有一个类中有能被覆写的和不能被覆写的);
4.被 final 修饰的变量是一个常量,既可以是成员变量也可以是局部变量。
a.被修饰的变量确定永久是该值,无法更改;
b.final 修饰的常量名各个字母都大写,如果由多个单词组成,用_(下划线)隔开
public static final 全局常量
/*抽象类*/
1.抽象方法必须放在抽象类中
2.抽象方法和类必须用 abstract 关键字修饰
3.抽象类不允许创建对象,不能new
4.要想调用抽象类其中的方法,必须由子类覆写其全部方法后,创立子类对象调用,如果子类只覆写了抽象类一部分方法
那么该子类仍然是抽象类。
5.抽象类可以强制子类覆写功能。
例如:
例一:
abstract class Student
{
abstract void study(); //抽象类格式
}
例二:
abstract class Student
{
abstract void study();
abstract void study1();
}
abstract class BaseStudent extends Student
{
void study()
{
System.out.println("阿秋");
}
//要想调用父类的方法,子类必须覆写父类全部方法,只调用其中一部分,则子类也是抽象类
}
例三:
abstract class Student
{
abstract void study();
abstract void study1();
void sleep() //抽象类也可以加入常规函数
{
System.out.println("躺着睡");
}
}
class AdvStudent extends Student
{
void study()
{
System.out.println("学习"); //并且子类可以继承
}
void study1(){}
}
class Q1
{
public static void main(String[] args)
{
AdvStudent ss=new AdvStudent();
ss.sleep(); //建立子类对象还可以调用
ss.study();
}
}
|
|