面向对象扩展
记录自己每次学习的成果
文章目录
一. instanceof和类型转换
1. instanceof
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
实例:
import com.mnm.oop.demo01.Person;
import com.mnm.oop.demo01.Student;
public class Application {
public static void main(String[] args) {
Object student = new Student();
System.out.println(student instanceof Student);
System.out.println(student instanceof Person);
System.out.println(student instanceof Object);
}
}
public class Person {
}
public class Student extends Person {
}
//执行结果:
true
true
true
2. 类型转换
实例1:
import com.mnm.oop.demo01.Person;
import com.mnm.oop.demo01.Student;
public class Application {
public static void main(String[] args) {
Person person = new Student();
((Student)person).run();
}
}
public class Person {
public void speak(){
System.out.println("speak");
}
}
public class Student extends Person {
public void run(){
System.out.println("run");
}
}
//执行结果:
run
实例2
import com.mnm.oop.demo01.Person;
import com.mnm.oop.demo01.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
Person person=student;
person.run();
}
}
public class Person {
public void speak(){
System.out.println("speak");
}
}
public class Student extends Person {
public void run(){
System.out.println("run");
}
}
//执行结果:
报错!
//子类转换为父类,可能丢失自己本来的一些方法
- 总结
父类的引用指向子类的对象
把子类转换为父类为 向上转型(不用强制转换)
把父类转化为子类为 向下转型(需要强制转换)
方便方法的调用,减少重复代码,使代码简洁
二. static详解
1. 静态属性
实例
public class Student {
public static int age;//静态变量
public double score;//非静态变量
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);//可直接以类名引用
//System.out.println(Student.score);//不可直接以类名引用
System.out.println(s1.age);
System.out.println(s1.score);
}
}
2. 静态方法
实例:
public class Student {
public static void run(){
System.out.println("run");
}
public void go(){
System.out.println("go");
}
public static void main(String[] args) {
run();
Student.run();//静态方法可直接调用
//Student.go();
Student student = new Student();
student.go();
student.run();
}
}
3. 静态代码块
public class Student {
//第二个执行,每次创建对象,就会执行匿名代码块
//一般用于赋初始值
{
System.out.println("匿名代码块");
}
//第一个执行,只执行一次
static {
System.out.println("静态代码块");
}
//第三个执行
public Student() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Student student = new Student();
}
}
----------结果-----------
静态代码块
匿名代码块
构造方法
4. 静态导入包
//正常使用
import java.lang.Math;
public class Person {
public static void main(String[] args) {
System.out.println(Math.random());
System.out.println(Math.PI);
}
}
//静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Person {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
三. 抽象类
1. 定义
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2. 实例
//abstract 抽象类
public abstract class Person {
//抽象方法,只有方法名字,没有方法的实现
public abstract void mian();
}
//抽象类的所有方法,继承了他的子类,都必须实现他的方法,除非子类也是抽象类
public class Student extends Person{
@Override
public void mian() {
}
}
//------------或者-----------
public abstract class Student extends Person{
}
抽象类的特点:
- 不能new这个抽象类,只能靠子类来实现,只是个约束
- 抽象类可以写普通方法,但抽象方法,只能在抽象类中
四. 接口
1. 接口的定义
关键字:interface / implements
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有!
接口:只有规范!自己无法写方法,约束和现实分离,又称为面向接口编程。
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
面向对象的精髓,是对对象的抽象,最能体现这一点的就是接口。
2. 定义接口:
//接口一般都需要实现类,关键字interface
public interface Person {
//在接口中定义的属性,默认是常量
//public static final int age;==int age;
int age=90;
//接口中的所有定义,其实都是抽象的-public abstract
//void add();==public abstract void add();
void add();
void delete();
void update();
void query();
}
public interface Student {
void speak();
}
3. 实现类
//类,可以实现接口,用关键字implements
//实现类接口的类,就需要重写接口的方法
//侧面实现多继承
public class PersonImpl implements Person,Student{
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void update() {
}
@Override
public void query() {
}
@Override
public void speak() {
}
}
接口总结:
接口就是约束
定义一些方法,让不同的人实现
方法都是 public abstract 定义
常量都是 public static final 定义
接口不能被实例化,接口中没有构造方法
implements可以实现多个接口,但必须要重写接口中的方法
五. 内部类
内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
共分为以下四种:
1.成员内部类
2.静态内部类
3.局部内部类
4.匿名内部类
1. 成员内部类
实例:
import com.mnm.oop.demo04.Outer;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.inner inner = outer.new inner();
inner.in();
inner.getId();
}
}
-----------结果-----------
这是内部类
8792912
这是外部类
public class Outer {
private int id=8792912;
private void out(){
System.out.println("这是外部类");
}
//成员内部类
public class inner{
public void in(){
System.out.println("这是内部类");
}
//可以获得外部类的私有属性和方法
public void getId(){
System.out.println(id);
out();
}
}
}
2. 静态内部类
实例:
public class Outer {
private int id=8792912;
private void out(){
System.out.println("这是外部类");
}
//静态内部类
public static class inner{
public void in(){
System.out.println("这是内部类");
}
}
}
3.局部内部类
实例:
public class Outer {
public void out(){
//局部内部类
class method{
public void in(){
}
}
}
}
4. 匿名内部类
实例:
public class Outer {
public static void main(String[] args) {
//没有名字初始化值,不用将实例保存到变量中
//匿名内部类
new A().a();
//匿名内部类
new UserService(){
@Override
public void hello() {
System.out.println("Hello World");
}
};
}
}
class A{
public void a(){
System.out.println("A");
}
}
interface UserService{
void hello();
}