测试类的继承与多态,可以定义一个父类的引用来指向一个子类的对象,测试两种方法,一种是static类型的,一种普通类型的方法。
static类的方法,在编译时就确定了内存地址,只要定义一个该类的引用,就可以直接访问该static方法;
非static类的方法,在程序运行时通过new的方式来创建对象,堆地址,堆属于“随机分配”的内存管理机制,地址由new出来的具体对象类型决定。
1 public class TestClass { 2 public static void main(String[] args) { 3 //狗也是动物的一种 4 Animal a1 = new Dog(); 5 Dog a2 = new Dog(); 6 7 a1.getAppearanceStatic(); 8 a1.getRun(); 9 ((Dog)a1).shout(); 10 11 a2.getAppearanceStatic(); 12 a2.getRun(); 13 } 14 } 15 16 class Animal { 17 public String body = "动物身体"; 18 19 public static void getAppearanceStatic(){ 20 System.out.println("static动物有头和身体..."); 21 } 22 public void getRun(){ 23 System.out.println("动物能动"); 24 } 25 } 26 27 class Dog extends Animal { 28 public static void getAppearanceStatic(){ 29 System.out.println("static小狗有头和身体,还有四条腿"); 30 } 31 public void getRun(){ 32 System.out.println("小狗四腿奔跑"); 33 System.out.println(body); 34 } 35 void shout(){ 36 System.out.println("小狗喊汪汪"); 37 } 38 }
Java中class的前面添加public和不添加public的区别:
需要知道的是修饰类和变量的用来控制这个被修饰的类和变量的适用范围的修饰词有:
1.public:表示公开的类和变量,既所有的类都可以引入使用的。
2.protected:表示受保护的类,只有子孙类和本类可以引入使用。
默认:表示同包中和本类中可以引入使用。
3.private:表示私人的,只有在本类中可以引入使用。
所以显而易见,如果一个class前面如果添加了public修饰则可以被所有类引入使用,如果没有
加任何修饰词,那么就只能够被同包中的类和本类引入使用。
在java中public void与public static void有什么区别 ?
public void 修饰是非静态方法,该类方法属于对象,在对象初始化(new Object())后才能被调用;public static void 修饰是静态方法,属于类,使用类名.方法名直接调用。
非静态方法之间可以互相调用,非静态方法也可以调用静态方法;但是静态方法不可以直接调用(未初始化的)非静态方法。由于 public static void main 作静态方法,所以遵循这个原则。
但是 Java 可以通过对象名调用静态方法(对象名.静态方法)。Java 中不会导致语法错误(syntax error),但是不推荐这样使用,静态方法与非静态方法调用时应当绝对区分;而且其他 OOP 语言如 C#,Swift,Objective-C 都没有这样的语法。