文章目录
初识面向对象
面向过程&面向对象
回顾方法及加深
- static方法是和类一起加载的,下面没有加static的方法需要实例化之后才存在
- 值传递
- 引用传递
对象的创建分析
创建与初始化对象
- 一个项目应该只存在一个main方法
Student类
package oop;
//学生类
public class Student {
//属性:字段
String name;
int age;
//方法
public void study() {
System.out.println(this.name + "在学习");
}
}
Application类-main方法
调用Student类
package oop;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//类:抽象的,实例化
//类实例化后会返回一个自己的对象
//student对象就是一个Student类的具体实例
Student student = new Student();
Student xiaoming = new Student();
Student xh = new Student();
xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
}
}
构造器详解
构造器-无参(默认)
- Person类啥方法都没有都能被实例化出来(一个类即使什么都没写,它也会存在一个方法即构造器)
- 构造器必须和类的名字相同
- 必须没有返回值类型
package oop;
public class Person {
//一个类即使什么都不写,他也会存在一个方法
//显示的定义构造器
public Person(){
}
}
- 实例化构造器初始值
Alt+insert 快捷方式创建构造器
构造器-有参
- 一旦定义了有参构造,无参就必须显示定义
创建对象内存分析(简易)
面向对象的三大特征
封装
封装的作用
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护性增加了
封装演示
- 示例代码
Student类
package oop;
//学生类
public class Student {
private String name; //private属性私有,外部对象new了这个对象没法去用这个属性
private int id;
private char sex;
private int age;
//提供一些可以操作这个属性的方法
//提供一些public的 get、set方法
//get获得这个数据
public String getName() {
return name;
}
//set给这个数据设置值
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age > 120 || age < 0) {
System.out.println("输入的年龄不合法");
} else {
this.age = age;
}
}
//alt+insert 自动生成get set方法
}
Application类-main方法
package oop;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student s1=new Student();
s1.setName("purvis");
System.out.println(s1.getName());
}
}
继承
- Ctrl+h 查看继承树
- Java中,所有的类,都默认继承Object类
继承示例
- 父类-Person
package oop;
//Person类:父类
public class Person {
//public
//protected
//default
//private
public int money = 10_0000_0000;
public void say(){
System.out.println("说了一句话");
}
}
- 子类Student
package oop;
//Student类继承Person类:子类
//子类继承了父类就会拥有父类的全部方法
public class Student extends Person {
}
- 子类Teacher
package oop;
//Teacher类继承Person类:子类
public class Teacher extends Person{
}
- Application-main方法
package oop;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.say();
int m = student.money;
System.out.println("继承父类的money:"+m);
}
}
Super
-
当子类与父类有同名的属性时,可以通过super.属性的方式调用父类中的属性。
-
当子类重写父类的方法后,在子类中若想调用父类中被重写的方法时,需用super.的方法
-
super修饰构造器,通过在子类中使用super列表参数的形式调用父类中制定的构造器
a、在构造器内部,super(参数列表)必须声明在首行 b、在构造器内部,this(参数列表)或super(参数列表)只能出现一个 c、当构造器中不显示的调用this(参数列表)或super(参数列表)默认调用父类中的空参构造器
- 隐藏代码,子类的无参构造会先调用父类的无参构造
- 调用父类的构造器,必须在子类构造器的第一行
Super注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的放法或构造方法中
- super和this不能同时调用构造方法
super VS this
-
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用 -
前提:
this:没有继承情况下也可以使用
super:只能在继承条件下才可以使用 -
构造方法
this();本类的构造
super();父类的构造
方法重写
- 重写都是方法的重写(子类重写父类的方法)
- 参数列表必须相同
- 重写跟静态方法无关,只跟非静态方法有关
- 修饰符:范围可以扩大但不能缩小:public>protected>default>private
- 抛出的异常:范围可以缩小。但不能扩大
-
父类的引用指向了子类(静态方法)
-
方法重写示例
重写的关键词必须是public不能是private
-
静态方法和非静态区别很大
- 静态方法:方法的调用只和左边定义的对象有关(上上图)
- 非静态方法:可以重写
多态
多态注意事项
类型转换- instanceof
package oop;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//Object->String
//Object->Person->Teacher
//Object->Person->Student
//Object为Student的爸爸的爸爸类
Object object = new Student();
//System.out.println(X instanceof Y);//能不能编译通过!
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
System.out.println("=====================================");
Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//false
System.out.println(person instanceof String);//编译就报错
}
}
类型转换示例
- Person类-父类
package oop;
public class Person {
public void run(){
System.out.println("run");
}
}
- Student类-子类
package oop;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
- Application主类-main方法
package oop;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//类型之间的转换;基本类型转换 高转低 强转
//高 //低
Person obj = new Student();
obj.go(); //会报错,因为Person类没有go方法
//obj 将这个对象转换成Student类型,我们就可以使用Student类型的方法了!(高转低)
Student student = (Student) obj; //强制转换成Student类型 或者 ((Student)obj).go;
}
}
- 子类转换为父类,可能会丢失自己本来的一些方法
static关键字详解
package oop;
public class Student {
private static int age; //静态的变量,在类中会被共享,可以直接类名.属性调用
private double score;//非静态的变量
public void run() {
}
public static void go() {
}
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);
System.out.println("=========================");
Student.go();//可以直接调
go(); //可以直接调
Student.run();//没法直接调用,原因是静态的方法static会跟类一起加载,run()方法为非静态方法,要实例化后才会存在
}
}
- 静态导入包
-
抽象类和接口
抽象类
- 演示
Action类-抽象类
package oop;
//抽象类 abstract
public abstract class Action {
//约束~有人帮我们实现~
//abstract ,抽象的方法,只有方法名字,没有方法的实现!
public abstract void doSomething();
// 1.不能new抽象类,只能靠子类去实现它:约束!
// 2.抽象类中可以写普通的方法~
// 3.抽象方法必须在抽象类中
}
A类-继承抽象类(要重写父类的方法才行)
package oop;
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法~ 除非~
public class A extends Action {
@Override
public void doSomething() {
}
}
接口
作用:
1.约束
2.定义一些方法,让不同的人实现
3.接口不能被实例化~接口中没有构造方法
4.implements可以实现多接口
5.必须要重写接口中的方法
- UserService接口
package oop;
//interface 定义的关键字
//接口都需要实现类
public interface UserService {
//变量一般都是常量
public static final int AGE = 99;
//接口中的所有定义其实都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
- TimeService接口
package oop;
public interface TimeService {
}
- 接口的实现类-UserServiceImpl
package oop;
//接口的实现类
//类 可以实现接口 implements接口
//实现了接口的类,就需要重写接口的方法
//利用接口实现多继承,如下 继承 UserService,TimeService 两接口
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) {
}
}
内部类及OOP实战
内部类
- Outer类
package oop;
//Outer为外部类
public class Outer {
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
//Inner为内部类
class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性~
public void getId(){
System.out.println(id);
}
}
public void method(){
//局部内部类
class Ineer{
}
}
}
- Application类-main
package oop;
public class Application {
public static void main(String[] args) {
//new
Outer outer = new Outer();
//通过这个外部类来实例化内部类~
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getId();
}
}