4. 面向对象三个特性——多态
多态
-
同一方法可以根据发送对象的不同而采用多种不同的行为方式。
-
一个对象的实际类型是确定的,但指向对象的引用类型就有很多。
public static void main(String[] args) {
//一个对象的实例类型是确定的
//new Student();
//new Person();
//可以指向引用的类型就不确定了;父类指向子类。
//子类重写了父类的方法,执行的是子类中的方法。
//父类不可以调用子类独有的方法
//父类能执行那些方法,主要看左边的类型
//Student 能调用的方法都是自己的 或者 是继承的父类的
Student s1 = new Student();
//Person 父类型:可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
s1.run();
s1.eat();
s2.run();//子类重写了父类的方法,执行子类的方法
}
-----------
son
eat
son
public class Person {
public void run(){
System.out.println("run");
}
}
public class Student extends Person {
public void run(){
System.out.println("son");
}
//子类独有方法
public void eat(){
System.out.println("eat");
}
}
-
多态存在的条件
-
有继承关系
-
子类重写父类方法
-
父类引用指向子类对象
-
-
注意:多态是方法的多态,属性没有多态
-
instanceof(类型转换)引用类型
System.out.println(X instanceof Y);
判断 X 和 Y 之间是否存在继承关系(父子关系),
如果存在,则为 true,否则为false
类的类型转换:低转高——>直接转换;
高转低——>强制转换:可能会丢失一些父类中的方法
static关键字
private static String name;//静态属性
private int age;//非静态属性
public static void main(String[] args) {
System.out.println(Person.name);
Person person = new Person();
System.out.println(person.age);
}
静态属性:可以在方法中直接调用,或使用(类名.属性名)的方式直接调用;
非静态属性:不可以直接调用,需要创建实例对象,然后使用(对象名.属性名)的方式调用。
//非静态方法
public void test1(){
test2();
}
//静态方法
public static void test2(){
}
public static void main(String[] args) {
test2();
}
非静态方法可以调用静态方法,而静态方法却不可以调用非静态方法,因为静态方法是随着类加载而加载的。
package com.demo05;
public class Person {
//动态代码块 —— 2:次之
{
System.out.println("非静态代码块");
}
//静态代码块 —— 1:最先执行,切只执行一次
static {
System.out.println("静态代码块");
}
//构造方法 —— 最后
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person = new Person();
System.out.println("-----------");
Person person1 = new Person();
}
}
静态代码块
非静态代码块
构造方法
-----------
非静态代码块
构造方法
静态导包
package com.demo05;
//静态导包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Student {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}

浙公网安备 33010602011771号