------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
继承:extends
将学生和工人的共性描述提取出来单独进行描述
只要让学生和工人单独描述的这个类关系,就可以了。
1,提高了代码的复用性。
2.让类与类之间产生了关系,有了这个关系,才有了多的特性。
注意:
千万不要为了获取其他类的功能,简化代码而继承。
必须是类与类之间有所述关系才可以继承,所述关系is a。
java语言中只支持单继承 不支持多继承。
多继承容易带来安全隐患。当多个父类中定义了相同功能,
当功能内容相同时,子类对象不确定运行哪一个。
但是java保留这种机制,并用另一种体现形式完成--多实现。
java支持多层继承。也就是一个继承体系
如何使用一个继承体系中的功能?
想要使用体系,先查阅父类的描述,因为父类汇总定义的事该体系中的共性功能
通过;了解共性功能,就可以了解该体系的基本功能,那么这个体系已经可以基本使用了。
那么具体调用时,要创建最子类的对象,为什么呢,意识因为有可能父类不能创建对象;
二是因为创建子类对象可以使用更多的功能 ,包括基本的也包括特有的。
简单一句话;查阅父类功能,创建子类对象使用功能。
class Person
{
int age;
String name;
}
public class EXDemo {
public static void main(String[] args) {
}
}
class Student
{
int age;
String name;
static void study()
{
System.out.println("good study");
}
} //和上面一样
class Student extends Person
{
static void study()
{
System.out.println("good study");
}
}
class Worker
{
int age;
String name;
static void work()
{
System.out.println("hard work");
}
}
子父类出现后,类成员的特点
类中成员
1.变量
如果子类中出现非私有的同名变量时,子类要访问本类中的变量用this
子类要访问父类中的同名变量用super。用法与this相同。
2.函数
当子类出现和父类一模一样的函数时,当子类调用该函数时,会运行子类函数内容,
如同父类的函数被覆盖一样
这种情况是函数的另一个特性:重写(覆盖)
当子类沿袭服了你功能,到子类中,但是子类具备该功能,但是功能的内容却和父类不一致,
这时,没有必要定义新功能,二十使用覆盖特殊,保留父类的功能定义,并重写功能内容。
注意事项:
1.子类覆盖父类 必须保证子类权限 大于等于父类权限 才可以覆盖,否则编译失败。
2.静态只能覆盖静态。
记住:
重载:只看同名函数参数列表。
重写:子父类方法要一模一样。
class Fu
{
void show()
{
System.out.prontln(“你好”);
}
}
class Zi Extends Fu
{
void show()
{
System.out.prontln(“wo好”);
}
}
class EXDemo {
public static void main(String[] args) {
Zi z = new Zi;
z.show();//打印子类
}
}
class Fu
{
int num=4;
}
class Zi Extends Fu
{
int num = 5;
void show()
{
System.out.pringln(this.num);//打印子类
System.out.pringln(super.num);//打印父类
}
}
class EXDemo {
public static void main(String[] args) {
Zi z = new Zi;
z.show();
System.out.pringln(z.num"...."z.num);//打印全是子类
}
}
3.构造函数
在对子类对象进行初始化时,父类的构造函数也会运行
那是因为子类的构造函数默认第一行有一条隐式的语句 super();
super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()。
为什么子类一定访问父类中的构造函数:
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先看父类是如何对这些数据
进行初始化的,所以子类对象初始化时,要先访问一下父类的构造函数
如果要访问父类中的指定的构造函数,可以通过手动定义super语句来指定。
super放在构造函数第一行
子类实例化过程
结论:
子类的所有的构造函数,默认都会访问父类中空参数的构造函数
因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的父类中的构造函数
当然:子类中构造函数第一行可以手动指定this语句来哦访问本类中的构造函数,
子类中至少会有一个构造函数会访问父类中的构造函数
this和super不能同时出现构造函数,因为都要写在第一行,为什么要在第一行,初始化动作先做
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
void show(){}
}
class student extends Person
{
student(String name)
{
super(name);//调用构造函数。
}
void method()
{
super.show();//直接调用父类一般函数
}
}
-------------------------------------------------
class Fu
{
Fu()
{
System.out.pringln("fu");
}
}
class Zi extends Fu
{
Zi()
{
//手动方式 super(4)
//super()默认存在。调用父类构造函数。先打印fu在打印zi
System.out.pringln("zi");
}
}
class EXDemo {
public static void main(String[] args) {
Zi z = new Zi;
}
}
final: 最终。作为一个修饰符。
1,可以修饰类,函数,变量。
2,被final 修饰的类不可以被继承。为了避免被继承,被子类复写功能。
3,被final修饰的方法 不能被复写。
4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量
当在描述事物时,一些数据的出现值是固定的,那么为了增强阅读性,都给这些值起个名字,
而这个值不需要改变,所以加上final修饰。
常量的书写规范,多有字幕大写,单词间连接用下划线。MY_PI
System.out.pringln(3.14);
final double PI = 3.14;
修饰class 有2个 public final 目前
final class Demo
{
int x = 6;//x是变量
final x = 3;//x 终身为3,
final void show1()
{}
void show2()
{}
}
class SubDemo extends Demo
{
void show1(){}//不能执行
void show2(){}//不能执行class前有final
}
class FinalDemo {
public static void main(String[] args) {
System.out.pringln("nihao");
}
}
继承这里还是有点复杂的 看的不是太明白,把老师的笔记抄了一遍,慢慢理解吧。
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------