public void show() { System.out.println(num); System.out.println(num2); } }
class Son extends Father { public void function() { //num可以在Father中访问private //System.out.println(num); //子类不能继承父类的私有成员变量 System.out.println(num2); } }
class ExtendsDemo3 { public static void main(String[] args) { // 创建对象 Son s = new Son(); //s.method(); //子类不能继承父类的私有成员方法 s.show(); s.function(); } }
1.3、继承中成员变量和成员方法的调用
继承中成员变量的调用规则
/*
继承中成员变量的关系: 在子类方法中访问一个变量的查找顺序: a:在子类方法的局部范围找,有就使用 b:在子类的成员范围找,有就使用 c:在父类的成员范围找,有就使用 d:如果还找不到,就报错。 */ class Father { public int num = 10;
public void method() { int num = 50; } }
class Son extends Father { public int num2 = 20; public int num = 30;
public void show() { int num = 40; System.out.println(num); System.out.println(num2); // 找不到符号,报错 //System.out.println(num3); } }
class ExtendsDemo4 { public static void main(String[] args) { //创建对象 Son s = new Son(); s.show(); } }
继承中成员方法的调用规则:
/* 继承中成员方法的关系: 通过子类对象调用方法: a:先找子类中,看有没有这个方法,有就使用 b:再看父类中,有没有这个方法,有就使用 c:如果没有就报错。 */ class Father { public void show() { System.out.println("show Father"); } }
class Son extends Father { public void method() { System.out.println("method Son"); }
public void show() { System.out.println("show Son"); } }
class ExtendsDemo8 { public static void main(String[] args) { //创建对象 Son s = new Son(); s.show(); s.method(); //s.fucntion(); //找不到符号 } }
public Father() { System.out.println("Father的无参构造方法"); }
public Father(String name) { System.out.println("Father的带参构造方法"); } }
class Son extends Father { public Son() { //super(); System.out.println("Son的无参构造方法"); }
public Son(String name) { //super(); System.out.println("Son的带参构造方法"); } }
class ExtendsDemo6 { public static void main(String[] args) { //创建对象 Son s = new Son(); System.out.println("------------"); Son s2 = new Son("林青霞"); } }
class ExtendsTest4 { public static void main(String[] args) { //创建学生对象并测试 //方式1 Student s1 = new Student(); s1.setName("林青霞"); s1.setAge(27); System.out.println(s1.getName()+"---"+s1.getAge());
//方式2 Student s2 = new Student("林青霞",27); System.out.println(s2.getName()+"---"+s2.getAge());
//补齐老师类中的代码并进行测试。 } }
继承面试题:案例3
//看程序写结果
class X { { System.out.print("Father"); } Y b = new Y(); X() { System.out.print("X"); } }
class Y { Y() { System.out.print("Y"); } }
public class test extends X { { System.out.print("Son"); } Y y = new Y(); test() { //super System.out.print("Z"); } public static void main(String[] args) { new test(); } }
class ExtendsDemo9 { public static void main(String[] args) { NewPhone np = new NewPhone(); np.call("苏炳添"); } }
public class test { public static void main(String[] args){ System.out.println(sum('a','b')); System.out.println(sum(3,3,3)); System.out.println(sum(3,3,3,3)); }
//two char public static char sum(char a,char b) { return (char) (a+b); } //three number public static int sum(int a, int b, int c) { return a + b + c ; } //four number public static int sum(int a, int b, int c,int d) { return a + b + c + d; } }
class Student { int age = 10; } class FinalTest { public static void main(String[] args) { //局部变量是基本数据类型 int x = 10; x = 100; System.out.println(x); final int y = 10; //无法为最终变量y分配值 //y = 100; System.out.println(y); System.out.println("--------------");
//局部变量是引用数据类型 Student s = new Student(); System.out.println(s.age); s.age = 100; System.out.println(s.age); System.out.println("--------------");
final Student ss = new Student(); System.out.println(ss.age); ss.age = 100; System.out.println(ss.age);
public void show() { System.out.println("show Fu"); }
public static void function() { System.out.println("function Fu"); } }
class Zi extends Fu { public int num = 1000; public int num2 = 200;
public void show() { System.out.println("show Zi"); }
public void method() { System.out.println("method zi"); }
public static void function() { System.out.println("function Zi"); } }
class DuoTaiDemo { public static void main(String[] args) { //要有父类引用指向子类对象。 //父 f = new 子(); Fu f = new Zi(); System.out.println(f.num); //找不到符号 //System.out.println(f.num2);
对象间的转型问题: 向上转型: Fu f = new Zi(); 向下转型: Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
//案例代码如下:
class Fu { public void show() { System.out.println("show fu"); } }
class Zi extends Fu { public void show() { System.out.println("show zi"); }
public void method() { System.out.println("method zi"); }
}
class DuoTaiDemo4 { public static void main(String[] args) { //测试 Fu f = new Zi(); f.show(); //f.method();
//创建子类对象 //Zi z = new Zi(); //z.show(); //z.method();
//你能够把子的对象赋值给父亲,那么我能不能把父的引用赋值给子的引用呢? //如果可以,但是如下 Zi z = (Zi)f; z.show(); z.method(); } }
4.4、多态的内存图
多态的内存图:
//内存图1
//内存图2
4.5、多态的经典案例
多态的经典案例:
/* 看程序写结果:先判断有没有问题,如果没有,写出结果
多态的成员访问特点: 方法:编译看左边,运行看右边。
继承的时候: 子类中有和父类中一样的方法,叫重写。 子类中没有父亲中出现过的方法,方法就被继承过来了。 */ class A { public void show() { show2(); } public void show2() { System.out.println("我"); } } class B extends A { /* public void show() { show2(); } */
public void show2() { System.out.println("爱"); } } class C extends B { public void show() { super.show(); } public void show2() { System.out.println("你"); } } public class DuoTaiTest4 { public static void main(String[] args) { A a = new B(); a.show();
//abstract class Animal //抽象类的声明格式 abstract class Animal { //抽象方法 //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体 public abstract void eat();
public Animal(){} }
//子类是抽象类 abstract class Dog extends Animal {}
//子类是具体类,重写抽象方法 class Cat extends Animal { public void eat() { System.out.println("猫吃鱼"); } }
class AbstractDemo { public static void main(String[] args) { //创建对象 //Animal是抽象的; 无法实例化 //Animal a = new Animal(); //通过多态的方式 Animal a = new Cat(); a.eat(); } }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
//定义一个抽象方法 public abstract void eat(); }
//定义具体的狗类 class Dog extends Animal { public Dog() {}
public Dog(String name,int age) { super(name,age); }
public void eat() { System.out.println("狗吃肉"); } }
//定义具体的猫类 class Cat extends Animal { public Cat() {}
public Cat(String name,int age) { super(name,age); }
public void eat() { System.out.println("猫吃鱼"); } }
//测试类 class AbstractTest { public static void main(String[] args) { //测试狗类 //具体类用法 //方式1: Dog d = new Dog(); d.setName("旺财"); d.setAge(3); System.out.println(d.getName()+"---"+d.getAge()); d.eat(); //方式2: Dog d2 = new Dog("旺财",3); System.out.println(d2.getName()+"---"+d2.getAge()); d2.eat(); System.out.println("---------------------------");
Animal a = new Dog(); a.setName("旺财"); a.setAge(3); System.out.println(a.getName()+"---"+a.getAge()); a.eat();
Animal a2 = new Dog("旺财",3); System.out.println(a2.getName()+"---"+a2.getAge()); a2.eat();
1、继承 在java中,所有的类都直接或间接继承Object类,Object类称为所有Java类的祖先。java中的继承是通过extends关键字操作的。通常说被继承的类叫作父类,派生的类叫做子类,通过继承后,子类可以使用父类的成员变量和成员方法。由此特点,通常在生产中把父类设计为拥有所有子类的共同属性和行为的类,即多个类中相同的内容给提取出来定义到一个类。比如人会吃饭和睡觉,那么学生和老师也会吃饭和睡觉,如下 class Person { public void s...