面向过程&面向对象
什么是面向对象
回顾方法及加深
方法定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.oop.demo01;public class Demo01 { public static void main (String[] args) { } public String sayhello () { return "hello,world" ; } public void hello () { return ; } public int max (int a,int b) { return a>b ? a : b; } }
方法调用
静态方法和非静态方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.oop.demo01;public abstract class Demo02 { Student.say(); Student student = new Student (); student.say(); public static void a () { b(); } public void b () { } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.oop.demo01;public class Student { public static void say () { System.out.println("学生说话了" ); } public void say () { System.out.println("学生说话了" ); } }
形参和实参
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.oop.demo01;public class Demo03 { public static void main (String[] args) { int add = Demo03.add(1 , 2 ); System.out.println(add); } public static int add (int a,int b) { return a+b; } }
值传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.oop.demo01;public class Demo04 { public static void main (String[] args) { int a = 1 ; System.out.println(a); Demo04.change(a); System.out.println(a); } public static void change (int a) { a =10 ; } }
引用传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.oop.demo01;public class Demo05 { public static void main (String[] args) { Person person = new Person (); System.out.println(person.name); Demo05.change(person); System.out.println(person.name); } public static void change (Person person) { person.name = "王同学" ; } } class Person { String name; }
类与对象的关系
创建与初始化对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package com.oop.demo02;public class Student { String name; int age; public void study () { System.out.println(this .name+"在学习" ); } }
构造器
和类名相同
没有返回值
作用:
new本质在调用构造方法
初始化对象的值
注意点:
定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package com.oop.demo02;public class Person { String name; public Person () { } public Person (String name) { this .name = name; } }
IDEA生成构造器快捷键:Alt+Insert
或者 Code—Generate
OK—生成有参构造 Select None—生成无参构造
创建对象内存分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package com.oop.demo03;public class Pet { public String name; public int age; public void shout () { System.out.println("叫了一声" ); } }
简单小结
类与对象
类是一个模板:抽象,对象是一个具体的实例
方法
定义、调用!
对应的引用
引用类型: 基本类型(8)
对象是通过引用来操作的:栈–>堆
属性:字段Field 成员数量
默认初始化:
数字: 0 0.0
cahr: u0000
boolean: false
引用: null
修饰符 属性类型 属性名 = 属性值!
对象的创建和使用
必须使用new 关键字创造对象,构造器 Person xx = new Person();
对象的属性 xx.name
对象的方法 xx.sleep()
类:
静态的属性 属性
动态的行为 方法
封装
封装的作用:
提高程序的安全性,保护数据
隐藏代码的实现细节
统一接口
系统可维护性增加了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 package com.oop.demo04;import javax.print.DocFlavor;public class Student { private String name; private int id;; private char sex; private int age; public String getName () { return this .name; } public void setName (String name) { this .name = name; } public int getId () { return id; } public void setId (int id) { this .id = id; } public char getSex () { return sex; } public void setSex (char sex) { this .sex = sex; } public int getAge () { return age; } public void setAge (int age) { if (age>120 || age<0 ){ this .age = 3 ; }else { this .age = age; } } }
继承
在Java中,所有的类,都默认直接或者间接继承Object
IDEA中,ctrl+H,(打开继承明细)
super
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 package com.oop;import com.oop.demo05.Student;public abstract class Application { public static void main (String[] args) { Student student = new Student (); student.say(); System.out.println(student.money); Student s = new Student (); s.test("王" ); s.test1(); } }
super注意点:
super调用父类的构造方法,必须在构造方法的第一个
super必须只能出现在子类的方法或者构造方法中!
super和this不能同时调用构造方法!
VS
this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提:
this:没有继承也可以使用
super:只能在继承条件才可以使用
构造方法:
this():本类的构造
super():父类的构造!
方法的重写
重写都是方法的重写,和属性无关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 package com.oop;import com.oop.demo05.A;import com.oop.demo05.B;public class Application { public static void main (String[] args) { A a = new A (); a.test(); B b = new A (); b.test(); } }
重写:需要有继承关系,子类重写父类的方法!
方法名必须相同
参数列表必须相同
修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
抛出的异常:范围,可以被缩小,但不能扩大;ClassNotFoundException --> Exception(大)
重写,子类的方法和父类必须一致;方法体不同!
为什么需要重写:
父类的功能,子类不一定需要,或者不一定满足!
Alt+Insert : override;
多态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package com.oop;import com.oop.demo06.Person;import com.oop.demo06.Student;public class Application { public static void main (String[] args) { Student s1 = new Student (); Person s2 = new Student (); Object s3 = new Student (); s2.run(); s1.run(); } }
多态注意事项:
多态是方法的多态,属性没有多态
父类和子类,有联系 类型转换异常!ClassCastException!
存在条件: 继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son();
以下不能重写:
static 方法,属于类,它不属于实例
final 常量
private 方法;
instanceof
判断一个对象是什么类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package com.oop;import com.oop.demo06.Person;import com.oop.demo06.Student;import com.oop.demo06.Teacher;public class Application { public static void main (String[] args) { Object object = new Student (); System.out.println(object instanceof Student); System.out.println(object instanceof Person); System.out.println(object instanceof Object); System.out.println(object instanceof Teacher); System.out.println(object instanceof String); System.out.println("====================================" ); Person person = new Student (); System.out.println(person instanceof Student); System.out.println(person instanceof Person); System.out.println(person instanceof Object); System.out.println(person instanceof Teacher); System.out.println("====================================" ); Student student = new Student (); System.out.println(student instanceof Student); System.out.println(student instanceof Person); System.out.println(student instanceof Object); } }
类型之间的转换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package com.oop;import com.oop.demo06.Person;import com.oop.demo06.Student;import com.oop.demo06.Teacher;public class Application { public static void main (String[] args) { Person obj = new Student (); Student student = (Student) obj; student.go(); Student stu = new Student (); stu.go(); Person person = stu; } }
多态小结
父类引用指向子类的对象
把子类转换为父类,向上转型;
把父类转换为子类,向下转型;强制转换
方便方法的调用,减少重复的代码!简洁
static关键字详解
静态变量只能引用静态成员,不能引用非静态的
非静态方法可以调用静态方法,静态方法不能调用非静态方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.oop.demo07;public class Student { private static int age; private double score; public void run () { go(); } public static void go () { } public static void main (String[] args) { Student s1 = new Student (); System.out.println(Student.age); System.out.println(s1.age); System.out.println(s1.score); go(); } }
先执行静态代码块(只执行一次),再执行匿名代码块,最后执行构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.oop.demo07;public class Person { { System.out.println("匿名代码块" ); } static { System.out.println("静态代码块" ); } public Person () { System.out.println("构造方法" ); } public static void main (String[] args) { Person person1 = new Person (); System.out.println("=================" ); Person person2 = new Person (); } }
静态导入包
1 2 3 4 5 6 7 8 9 10 11 12 package com.oop.demo07;import static java.lang.Math.random;import static java.lang.Math.PI;public class Test { public static void main (String[] args) { System.out.println(random()); System.out.println(PI); } }
如果一个类被final定义,则这个类不能被继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package com.oop.demo07;public class Student extends Person { private static int age; private double score; public void run () { go(); } public static void go () { } public static void main (String[] args) { Student s1 = new Student (); System.out.println(Student.age); System.out.println(s1.age); System.out.println(s1.score); go(); } }
抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.oop.demo08;public class A extends Action { @Override public void doSomething () { super .doSomething(); } }
Java的类是单继承,但是接口可以多继承
抽象类的特点:
不能new这个抽象类,只能靠子类去实现它:约束!
抽象类中可以写普通的方法
抽象方法必须在抽象类中
思考题?
抽象类中存在构造器吗?
抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package ahu; abstract class Base { int a=7 ; public Base () { a=8 ; } public Base (int i) { a=i; } } public class Demo01 extends Base { public Demo01 () { super (); } public Demo01 (int i) { super (i); } public static void main (String[] args) { Demo01 demo=new Demo01 (); System.out.println(demo.a); Demo01 demo1=new Demo01 (9 ); System.out.println(demo1.a); } }
抽象类存在的意义?
抽象的意义:对代码的维护 和重用 。
抽象类 往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。具体分析如下:
1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。
比如本科和研究生可以抽象成学生,他们有相同的属性和方法。这样当你对其中某个类进行修改时会受到父类的限制,这样就会提醒开发人员有些东西不能进行随意修改,这样可以对比较重要的东西进行统一的限制,也算是一种保护,对维护会有很大的帮助。
2.当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。
比如学校又新产生了专科生这类学生,那么专科生直接继承学生,然后对自己特有的属性和方法进行补充即可。这样对于代码的重用也是很好的体现。
所以,Java中抽象类对于代码的维护和重用有很好的帮助,也是Java面向对象的一个重要体现。
接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package com.oop.demo09;public class UserServiceImpl implements UserService ,TimeService{ @Override public void add (String name) { } @Override public void delete (String name) { } @Override public void update (String name) { } @Override public void query (String name) { } @Override public void timer () { } }
接口的作用:
约束
定义一些方法,让不同的人实现
public abstract
public static final
接口不能被实例化,接口中没有构造方法
implements可以实现多个接口
必须要重写接口中的方法
内部类
成员内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package com.oop;import com.oop.demo10.Outer;public class Application { public static void main (String[] args) { Outer outer = new Outer (); Outer.Inner inner = outer.new Inner (); inner.in(); inner.getID(); } }
静态内部类
1 2 3 4 5 6 7 8 9 10 11 12 package com.oop.demo10;public class Outer {} class A { public static void main (String[] args) { } }
局部内部类
1 2 3 4 5 6 7 8 9 10 11 package com.oop.demo10;public class Outer { public void method () { class Inner { public void in () { } } } }
匿名内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.oop.demo10;public class Test { public static void main (String[] args) { new Apple .eat(); new UserService () { @Override public void hello () { } }; } } class Apple { public void eat () { System.out.println("1" ); } } interface UserService { void hello () ; }