1、java基础3Java基础三1、继承: Test9.javapublic class Test9 public static void main(String args) Person teacher = new Teacher(老师1,22,老师); teacher.eat(); /teacher.teaching();因为teacher是Person类型,Person类中看不到子类扩展的方法teaching方法。 Person student = new Student(学生1,23,学生); student.eat(); class Person String name; int age
2、; String job; public Person() public Person(String name,int age,String job) this.name = name; this.age = age; this.job = job; public void eat() System.out.println(this.name+在吃); class Student extends Person public Student(String name,int age,String job) this.name = name; this.age = age; this.job = j
3、ob; public void studing() System.out.println(this.name+在学习); class Teacher extends Person public Teacher(String name,int age,String job) this.name = name; this.age = age; this.job = job; public void teaching() System.out.println(this.name+在讲课); 上面的程序说明:要想让我们的Teacher类和Student类也是Person,必须将Teacher类和Stu
4、dent类通过关键字“extends”继承Person类,此时Teacher类和Student类也是一种Person了。我们子类(导出类)就可以省略父类中已经定义的属性和功能了,子类并且可以扩展父类(基类)。程序中的高亮处表示:Student和Teacher也是Person。但是上面的引用只能访问属性Person中的功能,子类扩展的该引用看不到。2、重写: Test9.javapublic class Test9 public static void main(String args) Person monk = new Monk(释永信,45,花和尚); monk.eat(); class
5、Person String name; int age; String job; public Person() public Person(String name,int age,String job) this.name = name; this.age = age; this.job = job; public void eat() System.out.println(this.name+在吃肉包子。); class Monk extends Person public Monk(String name,int age,String job) this.name = name; thi
6、s.age = age; this.job = job; public void eat() if(花和尚=job) super.eat(); System.out.println(this.name+在吃素包子。); 上面的程序说明:子类继承父类之后,如果对父类中方法的实现不满意,可以重写,即是方法的名称和接收的参数类型都不可以发生变化,唯一可以改变的是:1、访问级别可以大于等于,但是不能小于原有的方法的访问级别;2、方法的实现可以修改。如果修改之后,无论引用的类型是父类还是子类,只要实例化的对象是子类对象,那么调用的方法永远都是调用子类中的方法。这就叫重写。3、继承关系中方法的调用: Te
7、st9.javaclass Monk extends Person public Monk(String name,int age,String job) this.name = name; this.age = age; this.job = job; public void kongfu() System.out.println(this.name+在练功); class Person String name; int age; String job; public Person() public Person(String name,int age,String job) this.na
8、me = name; this.age = age; this.job = job; public void eat() System.out.println(this.name+在吃肉包子。); public class Test9 public static void main(String args) Monk m = new Monk(唐僧,49,和尚); m.eat();/Monk.eat(m); m.kongfu();/Monk.kongfu(m); 上面的程序说明:如果子类的引用访问方法时:先从子类找该方法,如果子类没有该方法,它会去父类找这个方法,如果没有,还要继续往父类的父类
9、找,直到找到Object类,如果都没找到才报错。4、继承中属性的访问 Demo1.javapublic class Demo1 public static void main(String args) Base b = new Base(); System.out.println(访问属于自己的:+b.name); SubClass sc = new SubClass(); System.out.println(子类对象访问:+sc.name); class Base String name = name of base.; class SubClass extends Base 上面的程序说
10、明:当用子类对象访问属性时,如果子类不存在该属性,会进一步去其父类中访问。如果父类有,就用父类的;没有的化,继续去父类的父类找,直到找到Object类。最后到Object都没有的化,就报错了。 Demo1.javapublic class Demo1 public static void main(String args) Base b = new Base(); System.out.println(访问属于自己的:+b.name); SubClass sc = new SubClass(); System.out.println(子类对象访问:+sc.name); class Base S
11、tring name = name of base.; class SubClass extends Base String name = name of SubClass.; 上面的程序说明:如果用子类的对象访问属性,如果子类有,就用子类的。没有才去父类找。 Demo1.javapublic class Demo1 public static void main(String args) Base b = new Base(); System.out.println(访问属于自己的:+b.name); SubClass sc = new SubClass(); System.out.prin
12、tln(子类对象访问:+sc.name); Base b2 = new SubClass(); System.out.println(父类引用指向的是子类对象:+b2.name); class Base String name = name of base.; class SubClass extends Base/SubClass也是Base。 String name = name of SubClass.; 上面的程序说明:属性的访问和对象本质上没有关系,访问属性就看引用的类型,引用是什么类型的,就从那个类中找起,如果找到就用,找不到,去其父类找。 Demo1.java 属性和方法的区别p
13、ublic class Demo1 public static void main(String args) Base b = new Base(); System.out.println(访问属于自己的:+b.name); b.print(); System.out.println(*); SubClass sc = new SubClass(); System.out.println(子类引用访问属性:+sc.name); sc.print(); class Base String name = name of base.; public void print() System.out.p
14、rintln(print method of Base.); class SubClass extends Base/SubClass也是Base。 String name = name of SubClass.; 上面的程序说明:如果用子类对象访问方法时,如果子类没有该方法,会进一步去其父类调用方法,如果还是没有,去其父类的父类找,一直找到Object类。都没找到就报错,在哪个类找到,就调用哪个类中的方法。 Demo1.javapublic class Demo1 public static void main(String args) Base b = new Base(); System
15、.out.println(访问属于自己的:+b.name); b.print(); System.out.println(*); SubClass sc = new SubClass(); System.out.println(子类引用访问属性:+sc.name); sc.print(); System.out.println(*); Base b2 = new SubClass(); System.out.println(父类的引用(指向的是子类对象)调用属性+b2.name); b2.print(); class Base String name = name of base.; publ
16、ic void print() System.out.println(print method of Base.); class SubClass extends Base/SubClass也是Base。 String name = name of SubClass.; public void print() System.out.println(print method of SubClass.); 上面的程序说明:方法的调用和属性的调用是不同的,如果父子类中都有该方法,到底使用的方法是父类的还是子类的,由引用指向的对象决定,如果对象是子类对象,即使引用是父类型的,方法依然调用子类的方法。和
17、属性不同。属性是由引用的类型决定的。原因是子类和父类都有相同方法时,如果我们实例化的是子类对象,那么子类就重写了父类中同名的方法,即方法重写。5、 抽象类 Demo2.javapublic class Demo2 public static void main(String args) new Person(); abstract class Person/要做的事自己不会做、或不愿意做,找别人做。 abstract public void cooking(String caidan); 写Person类的目的:某人想做某种事情,但是自己又不知该如何做。只能靠别人帮助自己来做。我们要通过抽象方
18、法来定义要想做的事情,那么该方法所在的类要声明为抽象类,抽象类不能实例化。 Demo2.javapublic class Demo2 public static void main(String args) Person whz = new Student(范祥); whz.cooking(西红柿炒鸡蛋); abstract class Person/我们想吃东西,但是自己不会做,或不愿意做,等别人做。 abstract public void cooking(String caidan);class Student extends Person String name; Student(St
19、ring name) this.name = name; public void cooking(String name) System.out.println(this.name+为你做了+name); Person类不会cooking或者不愿意cooking,找Student类为他cooking。6、接口:是描述一种能力的类型。和类、抽象类都是有区别的。 Demo3.javapublic class Demo3 public static void main(String args) Person p = new Student(学生A); p.eat(); Student st = ne
20、w Student(学生B); st.eat(); st.study(); Studable sa = new Student(学生C); sa.study(); sa = new Cooker(厨师A); sa.study(); class Person String name; Person(String name) this.name = name; public void eat() System.out.println(this.name+蹲在墙角吃了一顿饭。); interface Cookable public void cooking();interface Studable
21、public void study(); class Student extends Person implements Studable Student(String name) super(name); public void study() System.out.println(学习普通文化知识。); class Cooker extends Person implements Cookable,Studable Cooker(String name) super(name); public void cooking() System.out.println(专业做饭。); public void study() System.out.println(学习厨艺。); 上面的程序说明:1) java不支持多继承,但是支持多实现。意思是:一类事物只能有一种类型,而不能有多种类型。但是一类事物可以具备多种功能。2) 接口描述的是能力。而不是类型。3) 一类事物要想具备多种功能,可以实现接口,因为接口描述的就是功能。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1