标签:this 存储空间 eth fat err [] 静态成员 不同 打电话
多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
class 子类名 extends 父类名{}
创建一个Person类,定义两个功能吃饭、睡觉,再创建学生类、教师类,继承Person类,再定义两个自己独有的功能
创建Persen类
public class Person {
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
//创建子类学生类继承Person类
public class Student extends Person {
public void play(){
System.out.println("打游戏");
}
}
//创建Teacher类继承Person类
public class Teacher extends Person {
public void teach(){
System.out.println("教书");
}
}
//创建测试类,对继承进行测试
public class PersonExtends {
public static void main(String[] args) {
Student st = new Student();
st.eat(); //用学生类调用继承方法
st.play(); //调用自己的方法
Teacher t =new Teacher();
t.sleep();
t.teach();
}
}
提高了代码的复用性:多个类的相同成员可以放到一个类中
提高了代码的维护性:如果功能的代码需要修改,修改一处即可,继承的类中自动都被修改了
让类与类之间产生了关系,是多态的前提
即一个类只能有一个直接父类,不可以有多个直接父类
正确写法:class Sub extends Demo{}
错误写法:class Sub extends Demo1,Demo2{}
class A{}
class B extends A{}
class C extends B{}
例
//
public class Grandfather {
public void show(){
System.out.println("grandfather");
}
}
public class Father extends Grandfather {
public void method(){
System.out.println("father");
}
}
public class Son extends Father {
public void function(){
System.out.println("son");
}
}
//测试类
public class GrandfatherTest {
public static void main(String[] args) {
Son s = new Son();
s.function();
s.method();
s.show();
}
}
案列演示:
//创建父类定义成员变量
public class Field {
int num = 10;
public void method(){
System.out.println(num);
}
}
//创建子类继承父类,并定义与父类同名成员变量
public class FieldExtends extends Field {
int num = 15;
public void show(){
System.out.println(num);
}
//在子类中定义新的方法,在方法内再定义与父类成员变量同名变量
public void function(){
int num = 5;
System.out.println(num);
}
}
//测试类
public class FieldTest {
public static void main(String[] args) {
FieldExtends fe = new FieldExtends();
fe.show(); // 15
fe.function(); // 5
fe.method(); //10
}
}
用法与this关键字类似
访问成员变量
this.成员变量
super.成员变量(访问父类的成员变量,不能访问父类的private变量)
访问静态成员时,也可以用 父类名.静态成员
访问构造方法
this(...) super(...)
访问成员方法
this.成员方法() super.成员方法()
//创建父类
public class FatherSuper {
int num = 10;
public FatherSuper(){
System.out.println("父类构造方法");
}
public void show(){
System.out.println("父类成员方法");
}
}
public class SonSuper extends FatherSuper {
int num = 15 ;
public SonSuper(){
System.out.println("子类构造方法");
}
public void method(){
System.out.println("子类成员方法");
}
public void function(){
int num = 5;
System.out.println(num); //打印方法内局部变量
System.out.println(super.num); //打印父类成员变量
System.out.println(this.num); //打印本类成员变量
super.show(); //调用父类成员方法
this.method(); //调用本类成员方法
}
}
测试类
public class SuperTest {
public static void main(String[] args) {
SonSuper ss = new SonSuper();
ss.function();
}
}
class A {
public A(int i){
this(1 ,2);
}
public A(int a ,int b){
this(2);
}
}
//创建父类
public class A {
public A(){
System.out.println("父类空参构造");
}
public A(String name){
System.out.println("父类有参构造");
}
}
//创建子类继承父类
public class B extends A {
public B(){ //这一步默认执行了 super();调用了父类空参
System.out.println("子类空参构造");
}
public B(String name){
super(name); //调用父类有参构造方法
System.out.println("子类有参构造");
}
}
测试类
public class C {
public static void main(String[] args) {
B b = new B();
B b1 = new B("tom");
}
}
子类中出现和父类中一摸一样的方法声明,称为方法覆盖(Override)或重写(OverWrite)
方法重写是多态实现的条件
//首先创建 一个手机父类
public class PhoneF {
public void call(String name){ //定义一个方法
System.out.println("给"+name+"打电话");
}
}
//在创建一个手机子类继承父类
public class PhoneS extends PhoneF {
public void call(String name){ //同名同修饰词 对父类中的方法进行重写
super.call(name);
System.out.println("听天气预报"); //在继承父类之后在身再加的打印语句
}
}
//创建测试类
public class PhoneTest {
public static void main(String[] args) {
PhoneS ps = new PhoneS();
ps.call("Tom");
}
}
final关键字是最终的意思,可以修饰类,成员变量,成员方法 - 修饰类,类不能被继承(不能放在extends后面) - 修饰变量,变量将变成常量只能被赋值一次,不论是在子类还是本类中,都不能被修改(常量一般是大写字母表示 final int ONE = 1) - 修饰方法,方法不能被重写(子类只用使用权,没有修改权)
类中非static的final变量(实例final变量)可以在生命的时候赋值,如果声明的时候没有赋值的话,就必须在以下两个地方赋值,一个是构造代码块一个是构造方法中,如果这两个地方没有赋值,编译报错。
如果是static修饰的final变量的话,则只能在两个地方赋值,声明的时候,或者在静态代码块中。
在Java中,对一个事物的引用可以分成两种类型,一种是编译时的类型,一种是运行时的类型。 编译时的类型指的是声明这个变量时指定的类型;运行时类型指的是实际赋给这个变量的对象的类型。
若Student类继承自Person类,则下面的写法是正确的
Person p = new Student();
父类引用不能调用子类特有的方法,因为使用了父类的引用,就代表站在父类角度来看待当前子类对象,只能看到从父类继承而来的特性,或者是子类重写的父类的方法。成员变量没有多态性,只能看到父类的成员变量。
成员变量和静态方法没有多态性 只有被子类重写的成员方法才有多态性
标签:this 存储空间 eth fat err [] 静态成员 不同 打电话
原文地址:http://www.cnblogs.com/740810wt/p/6618034.html