Java基础
Java 面向对象
三大特性
多态
-
即同一个方法可以根据发送对象的不同采用多种不同的行为方式
-
一个对象的实际类型是确定的,但是指向对象的引用类型可以是很多
-
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
-
多态是方法的多态,属性没有多态
public class Person { public void run(){ System.out.println("peron run"); } public void speak(){ System.out.println("person speak"); } } public class Student extends Person{ @Override public void run() { System.out.println("student run"); } public void learn(){ System.out.println("student learn"); } } public class Applicatioon { public static void main(String[] args) { Student stu1 = new Student(); /* student类是person的子类 换句话说 student也是person的一种 所以说Student对象的引用可以指向Person 虽然指向了父类但是 调用方法还是stu1调用Student类和继承父类的方法,重写的只能调用子类重写方法 stu2也是如此 只能调用自己person类的方法 以run方法为例 虽然执行的结果是重写后的子类run方法,但是指向的是父类的run 因为被重写了 指向会从person run跳到student run,同时无法调用student类独有的方法 */ Person stu2 = new Student(); stu1.run(); stu2.run(); stu2.speak(); stu1.learn(); // stu2.learn(); } }
-
instanceof 类型转换
public class Applicatioon { public static void main(String[] args) { /* instanceof 是判断 左侧的对象是不是右边类的实例 instanceof的运行有两步: 1、先编译判断左侧对象与右侧类是不是父、子类的关系 没有关系则编译失败 2、判断左侧的对象的的实际类型(new后面) 是否是右侧类或者子类的实例 如下: stu 是student 类型 与object、person、student 有直接关联 编译通过 stu实际类型也是student 属于object爷爷类 person父类 多看下面几个例子 就能理解了 */ Student stu = new Student(); System.out.println(stu instanceof Object); //true System.out.println(stu instanceof Person); //true System.out.println(stu instanceof Student); //true Object obj = new Student(); System.out.println(obj instanceof Object); //true System.out.println(obj instanceof Person); //true System.out.println(obj instanceof Student); //true Person p = new Student(); System.out.println(p instanceof Object); //true System.out.println(p instanceof Person); //true System.out.println(p instanceof Student); //true Person p2 = new Person(); System.out.println(p2 instanceof Object); //true System.out.println(p2 instanceof Person); //true System.out.println(p2 instanceof Student); //false Object obj2 = new Person(); System.out.println(obj2 instanceof Object); //true System.out.println(obj2 instanceof Person); //true System.out.println(obj2 instanceof Student); //false } }
-
总结
-
多态的前提在父类引用指向子类的对象 Person p = new Student();
-
把子类转换为父类叫向上转型 这样可能会丢失自己本来的一些方法
Person p3 = stu //子转父 向上转型
-
把父类转换为子类叫向下转型,需要强制转换
Student stu1 = (Student) p2 // 父转子 向下转型
这样有利于方法的调用,减少重复的代码
-
-
知识点
static
1、类加载的顺序是 static代码块>匿名代码块>构造方法
public class Student {
public Student() {
System.out.println("构造方法");
}
{
System.out.println("匿名代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("================");
Student s2 = new Student();
}
}
执行结果
静态代码块
匿名代码块
构造方法
================
匿名代码块
构造方法
2、静态代码块在第二对象开始便不会执行了,只执行一次
3、匿名代码块和对象同时产生,会和不同的对象一起执行适合赋初始值
final
1、被final修饰的类不能被继承
2、被final修饰的方法可以被继承但不能被重写
import
可以在类名的上面导入有些需要用的工具类和具有静态方法的类
这样的话可以直接调用静态方法如random() 而不用 Math.random()
抽象类
-
abstract修饰符用来修饰方法或者类,叫做抽象方法或者抽象类
-
抽象类中可以写普通方法,可以没有抽象方法
-
抽象方法只能存在抽象类中
-
抽象类无法被new来创建对象,只能用来子类继承
-
抽象方法 只有方法的声明没有方法的实现,也是让子类继承实现的
-
子类继承抽象类,那么必须要实现抽象类没有实现的抽象方法,否则子类也只能声明为抽象类
//抽象类 public abstract class Action { //abstract抽象方法 只有方法名字,没有方法的实现 //相当于一个约束,谁继承了这个类必须要为这个类的抽象方法实现 public abstract void doSomething(); /* 抽象类不能被new,只能依靠子类继承实现它,就是一个约束 抽象类中可以写普通方法 只用抽象类才可以写抽象方法 */ } public class Appli extends Action{ //继承了Action 就要重写实现这个抽象方法 @Override public void doSomething() { } } public class Application { public static void main(String[] args) { Appli appli = new Appli(); } }
-
通过断电调式以及查看抽象类class文件,抽象类也是存在默认构造方法的
-
抽象类相当于一种约束,用来提高开发效率
接口
-
接口与其他类的区别
- 普通类:只有具体实现
- 抽象类:具体实现和抽象方法(规范)都有
- 接口:只有抽象方法/规范!!
-
接口其实是一种规范,定义了一组规则,比如红灯停,绿灯行,黄灯停一停
-
接口的本质是契约,是一种行为规范,大家都必须遵守
-
OO的精髓,是对对象的抽象,而接口就体现了这一点,如何合理的去抽象这就是设计模式的核心
-
声明接口的关键字是interface
public interface UserService { //定义的所有属性默认都是常量 public static final public static final int AGE = 18; //接口中定义的多有方法都是抽象方法 默认 public abstract //有参无参都可以 public abstract void addUser(String name); void delUser(String name); } public interface TimeService { String timer(); } //类 实现接口使用implements关键字 //实现接口的类必须要重写接口中的方法 //通过实现多个接口可以实现伪多继承的方式 public class UserServiceImpl implements UserService, TimeService{ @Override public void addUser(String name) { } @Override public void delUser(String name) { } @Override public String timer() { return null; } }
接口小结:
- 声明接口的关键字不是class 而是interface
- 接口是一种约束和规范,不同的人在接口下有不同的实现
- 接口中的方法默认是public abstract的通常直接void run(); 也可有返回值类型 String run();
- 在接口中定义的变量默认是 public static final的常量
- 接口不能被直接实例化只能通过接口实现类,因为接口本身没有构造方法
- 使用implements实现接口,可以实现多个接口,从而实现了伪多继承的现象
- 实现接口的类必须要重写接口中的方法
内部类
-
就是在一个类的内部定义了一个类。有以下几种:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类