❤️什么是Java 面向对象《装、继承、多态、抽象》?建议收藏)❤️

系统管理员 2023-10-04 11:26 114阅读 0赞

Java 面向对象(详解)

一、面向对象

(1).面向对象编程(Object-Oriented Programming,OOP)

(2).面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据

(3).面向对象是一种抽象的,具有主要的特征分别是封装、继承、多态、抽象

二、构造器(创建与初始化对象)

(1).使用new关键字创建对象)

(2).使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用

(3).类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

1.必须和类的名字相同

2.没有返回类型,也不能写void

构造器必须掌握!!!在下面的代码示例中我们可以看到构造器的使用!!!


1、封装

是将东西包围起来通过自己想定义的方式获取。把过程和数据包围起来,对数据的访问只能通过已定义的界面。

代码示例:

  1. package oop.Demo01;
  2. //OopDemo01 类
  3. public class OopDemo01 {
  4. //main方法
  5. public static void main(String[] args) {
  6. System.out.println(max(10,50));//50
  7. int max=OopDemo01.max(10, 100);
  8. System.out.println(max);//100
  9. }
  10. /*
  11. 修饰符 返回值类型 方法名(...)
  12. //方法体
  13. //return 返回值
  14. */
  15. public String sayHello(){
  16. return "Hello World";//return 方法 返回一个结果
  17. }
  18. public static int max(int a,int b){
  19. return a>b?a:b;
  20. }
  21. }
2、继承:

是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。使用关键字为extends

代码示例:

  1. //子类:继承了父类,拥有父类的全部方法
  2. package oop.Demo05;
  3. //继承关系
  4. //A extends B 父子关系 A是子类 B是父类
  5. //子类A继承父类B
  6. public class A extends B{
  7. public static void main(String[] args) {
  8. A a=new A();
  9. a.test();//走的是A类的方法 输出A->test()
  10. //父类的引用指向了子类
  11. B b=new A();
  12. b.test();//走的是A类的方法 输出A->test()
  13. B c=new B();
  14. c.test();//走的是B类的方法 输出B->test()
  15. }
  16. //重载是本类
  17. //重写是子父类才有的
  18. //Override重写的意思
  19. @Override //注解:有功能的注解!
  20. public void test() {
  21. System.out.println("A->test()");
  22. }
  23. }
  24. //父类
  25. package oop.Demo05;
  26. public class B {
  27. public void test(){
  28. System.out.println("B->test()");
  29. }
  30. }
注意点:

子类重写了父类的方法,刚才输出A B的时候是静态方法 static,静态方法与非静态方法的区别很大,静态方法;方法的调用只和左边,与定义类型有关,非静态方法:需要进行重写,重写的关键词只能是public 不能是private.若将public修改为private 则super不可调用,私有的不可被继承

  1. super注意点:
  2. 1.super 调用父类的构造方法,必须在构造方法的第一个
  3. 2.super 必须只能出现在子类的方法或者构造方法中
  4. 3.superthis 不能同时调用构造方法
  5. 4.调用了父类的无参构造---super();这段代码时隐藏的
  6. public Student() {
  7. //而且如果要显示super();
  8. //调用父类的构造器,必须要在子类的第一行
  9. //this();也是一样 否则报错
  10. super();
  11. System.out.println("Student无参执行");
  12. }
  13. superthis对比
  14. 一、代表的对象不同:
  15. 1.this 本身调用这个对象
  16. 2.super 代表父类对象的引用
  17. 二、前提:
  18. 1.this 没有继承也可以使用
  19. 2.super 在继承条件下才可以使用
  20. 三、构造方法:
  21. 1.this() 本类的构造
  22. 2.super() 父类的构造
  23. 重写:需要有继承关系,子类重写父类的方法
  24. 1.方法名必须相同
  25. 2.参数列表必须相同
  26. 3.修饰符:范围可以扩大,但不能缩小 public>protected>default>private
  27. 4.抛出的异常:范围可以被缩小,但不能被扩大 ClassNotFoundException--->Exception(大)
  28. 重写;子类的方法和父类的方法必须一致,方法体不同!
  29. 为什么需要重写?
  30. 1.父类的功能 子类不一定需要 或者不一定满足!
  31. 重写快捷方法
  32. 1.alt+insert 选中overring即可重写
3、抽象:

就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一是过程抽象,二是数据抽象。关键字为:sbstract

从认识论角度考虑是先有对象后有类。对象,是具体的事物。类是抽象的,是对对象的抽象

从代码运行角度考虑是先有类后有对象,类是对象的模板

代码示例:

  1. package oop.Demo08;
  2. //抽象类的所有方法 继承了它的子类 都必须要实现它的方法 除非加上abstract
  3. public abstract class A extends Action{
  4. public void doSomething(){
  5. }
  6. }
  7. package oop.Demo08;
  8. //在一个类上面加上abstract即变成抽象类
  9. //java的类是单继承
  10. //但是接口可以是多继承
  11. public abstract class Action {
  12. public abstract void doSomething();
  13. }
注意点:

1.abstract 抽象方法,只有方法名字,没有方法的实现。不能new这个抽象类只能靠子类去实现它!因为具有约束条件!

2.抽象类中可以写普通方法,抽象方法必须存在抽象类中

3.存在的意义:抽象出来,提高开发效率

4、多态

即同一方法可以根据对象的不用而采用多种不用的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。

多态存在的条件:

1.有继承关系

2.子类重写父类的方法

3.父类引用指向子类对象

注意点:多态是方法的多态,属性没有多态。

代码示例:

  1. //第一个java类
  2. package oop.Demo06;
  3. public class Application01 {
  4. public static void main(String[] args) {
  5. //一个对象的实际类型是确定的
  6. //new Student();
  7. //new person();
  8. //当可以指向的引用类型就不确定了
  9. // Student能调用的方法都是自己的或者继承父类的
  10. Student01 s1=new Student01();
  11. // Person父类型,可以指向子类,但是不可以调用子类独有的方法
  12. Person01 s2=new Student01(); //父类的引用指向子类的
  13. // Object s3=new Student01();
  14. s2.run();
  15. //子类重写了父类的方法,执行了子类的方法
  16. s1.run();
  17. //对象能执行哪些方法,主要看对象 左边的类型,和右边关系不大!
  18. //s2.eat(); //子类重写了父类的方法,执行子类的方法
  19. ((Student01)s2).eat();//强转换类型,将s2强制转换位student类型
  20. s1.eat();
  21. }
  22. }
  23. //第二个java类
  24. package oop.Demo06;
  25. public class Person01 {
  26. public void run(){
  27. }
  28. }
  29. //第三个java类
  30. package oop.Demo06;
  31. public class Student01 extends Person01 {
  32. //这里Student01继承了父类Person01的方法
  33. public void run() {
  34. System.out.println("son");
  35. }
  36. public void eat(){
  37. System.out.println("eat");
  38. }
  39. }

三、instanceof(类型转换)引用类型

作用:判断一个对象是什么类型.

代码示例:

  1. //第一个java类
  2. package oop.Demo06;
  3. import oop.Demo05.Person;
  4. public class Application02 {
  5. public static void main(String[] args) {
  6. //1.类型之间的转换: 之前是基本类型转换 满足这个高低 64 32 16 8 低转高则强制
  7. //2.类型之间的转换:父(高) 子(低)
  8. //高--->低 不需要强制转换
  9. // Object>String
  10. // Object>Person>Teacher
  11. // Object>Person>Student
  12. Object object=new Student02();
  13. // System.out.println(X instanceof Y);//能不能编译通过 取决于X与Y之间是否存在父子关系
  14. System.out.println(object instanceof Student02); //true
  15. System.out.println(object instanceof Person02); //true
  16. System.out.println(object instanceof Object); //true
  17. System.out.println(object instanceof Teacher);//false
  18. System.out.println(object instanceof String);//false
  19. System.out.println("==============================================");
  20. Person02 person02=new Student02();
  21. System.out.println(person02 instanceof Student02); //true
  22. System.out.println(person02 instanceof Person02); //true
  23. System.out.println(person02 instanceof Object); //true
  24. System.out.println(person02 instanceof Teacher);//false
  25. //System.out.println(person02 instanceof String);//编译报错
  26. System.out.println("==============================================");
  27. Student02 student02=new Student02();
  28. System.out.println(student02 instanceof Student02); //true
  29. System.out.println(student02 instanceof Person02); //true
  30. System.out.println(student02 instanceof Object); //true
  31. }
  32. }
  33. /*
  34. 父类指向子类的对象
  35. 把子类转换为父类,向上转型 (不用强制转换)
  36. 把父类转换为子类,向下转型 (需要强制转型)
  37. 方便方法的调用 减少重复的代码 简洁
  38. 抽象:编程思想
  39. 抽象 封装 继承 多态 ! 抽象--> 接口
  40. */
  41. //第二个java
  42. package oop.Demo06;
  43. public class Person02 {
  44. }
  45. //第三个java
  46. package oop.Demo06;
  47. public class Student02 extends Person02 {
  48. }
四、三种构造器

匿名构造器、静态构造器、方法构造器

以下为代码示例:

  1. package oop.Demo07;
  2. //Person被final定义了 则不能被继承 public final class Person
  3. public class Person {
  4. //匿名构造器
  5. {
  6. System.out.println("匿名代码块");}
  7. //静态构造器 只执行一次
  8. static{
  9. System.out.println("静态代码块"); }
  10. public Person(){
  11. System.out.println("构造器方法");}
  12. public static void main(String[] args) {
  13. Person person1=new Person();
  14. //输出结果:静态代码块 静态代码块 静态代码块
  15. System.out.println("=========================");
  16. Person person2=new Person();
  17. //静态构造器 只执行一次
  18. //输出结果:匿名代码块 构造器方法
  19. }
  20. }

注意点:在java中是值传递的,代码示例:

  1. package oop.Demo01;
  2. public class OopDemo04 {
  3. public static void main(String[] args) {
  4. int a=1;
  5. System.out.println(a);//1
  6. OopDemo04.change(a);//无输出结果
  7. System.out.println(a);//1
  8. }
  9. //这里的返回值为空 回到主函数
  10. public static void change(int a){
  11. a=10;
  12. }
  13. }

五、接口

普通类:只有具体实现

抽象类:具体实现和规范(抽象方法)都有!

接口:只有规范!(自己无法写方法~专业的约束!)

代码示例:

  1. //第一个java类
  2. package oop.Demo09;
  3. public interface TimeService {
  4. void timer();
  5. }
  6. //第二个java类
  7. package oop.Demo09;
  8. //interface 定义的关键字 接口都需要实现类
  9. public interface UserService {
  10. //定义常量---public static final
  11. int age=99;
  12. //接口中的所有定义都是抽象的
  13. // 而且都是piblic abstract 若是不写默认都是piblic abstract
  14. // public abstract void run();
  15. void add(String name);
  16. void delete(String name);
  17. void update(String name);
  18. void query(String name);
  19. }
  20. //第三个java类
  21. package oop.Demo09;
  22. //抽象类:extends只能单继承
  23. //类可以实现接口 implements 接口 可以多继承
  24. //实现了接口中的类 就需要重写接口中的方法
  25. // UserService,TimeService实现了多继承
  26. //利用接口实现多继承
  27. //接口里边只有方法的定义没有方法的使用
  28. public class UserServiceImpl implements UserService,TimeService{
  29. @Override
  30. public void add(String name) {
  31. }
  32. @Override
  33. public void delete(String name) {
  34. }
  35. @Override
  36. public void update(String name) {
  37. }
  38. @Override
  39. public void query(String name) {
  40. }
  41. @Override
  42. public void timer() {
  43. }
  44. }

六、内部类

内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类

类别:

1.成员内部类

2.静态内部类

3.局部内部类

4.匿名内部类

  1. //第一个java类
  2. package oop.Demo10;
  3. public class Application {
  4. public static void main(String[] args) {
  5. Outer outer=new Outer();
  6. //使用内部类
  7. //通过这个外部类来实例化内部类
  8. Outer.Inner01 inner01=outer.new Inner01();
  9. inner01.in();//输出这是内部类的方法
  10. inner01.getID();//输出99
  11. }
  12. }
  13. //第二个java类
  14. package oop.Demo10;
  15. public class Test {
  16. public static void main(String[] args) {
  17. //匿名类
  18. //没有名字初始化类 ,不用将实例保存到变量中
  19. new Apple().eat();
  20. //Apple apple=new Apple(); new一个实例化对象
  21. UserService userservice=new UserService(){
  22. //没有名字初始化 需要重写
  23. @Override
  24. public void Hello() {
  25. }
  26. };
  27. }
  28. }
  29. class Apple{
  30. public void eat(){
  31. System.out.println("Apple");
  32. }
  33. }
  34. interface UserService{
  35. void Hello();
  36. }
  37. //第三个java类
  38. package oop.Demo10;
  39. public class Outer {
  40. private int id=99;
  41. public void out(){
  42. System.out.println("这是外部类的方法"); }
  43. public class Inner01{
  44. public void in(){
  45. System.out.println("这是内部类的方法");
  46. }
  47. //获得外部类的私有属性
  48. //加上static( public static class Inner)之后 这个id就拿不到了 若想要拿到 则 private static int id=99;即可
  49. public void getID(){
  50. System.out.println(id);
  51. }
  52. //局部内部类
  53. public void method(){
  54. class Inner02{
  55. public void in(){
  56. }
  57. }
  58. }
  59. }
  60. }
  61. //一个java类中 可以有多个class类
  62. //但是只能有一个public class类
  63. class A{
  64. public static void main(String[] args) {
  65. System.out.println("你好");
  66. }
  67. }

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读