Java基础学习日志day5
面向对象&面向过程
- 对于所描述复杂的事物,为了从宏观的把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是具体到微观的操作,仍然需要面向过程的思路去处理
面向对象
-
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
-
抽象
-
三大特性:
- 封装
- 继承
- 多态
-
从认识的论角度考虑是先有对象后有类,对象,是具体的事物。类,是抽象的
-
从代码运行角度是先有类后有对象,类是对象的模板
-
调用方法
//静态调用方法 //类名.方法 Stuent.say(); //非静态类调用 //实例化这个类 new //对象类型 对象名 = 对象值; Student student = new Student(); student.say();
构造器
-
和类名相同
-
没有返回值
作用:
1. new 本质是在调用构造方法
2. 初始化对象的值
注意点:
1. 定义有参构造后,如果想使用无参构造,显示的定义一个无参的构造
Alt + Insert IEDA 快速构造参数 加上shift选择多个
this .
package oop.Demo01;
public class Application {
public static void main(String[] args) {
//new 实例化了一个对象
Student student = new Student("呆呆哥",22);
System.out.println(student.age);
}
}
package oop.Demo01;
public class Student {
String name;
int age;
//实例化初始值
//1.使用new关键字,本质是在调用构造器
public Student() {
}
//有参构造:一旦定义了有参构造,无参构造必须显示定义
public Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
封装
-
该露的露,该藏的藏
- 我们的程序设计要求"高内聚,低耦合",高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
-
封装(数据的隐藏)
-
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为数据隐藏
-
记住这句话就够了: 属性私有, get/set
-
封装的作用
-
提高程序的安全性
-
隐藏代码的实现细节
-
统一接口
-
系统可维护增加了
-
package oop.Demo02;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
String name = s1.getName();
s1.setName("呆呆哥");
System.out.println(s1.getName());
}
}
package oop.Demo02;
public class Student {
//属性私有
private String name;//名字
private int id;//学号
private char sex;//性别
//提供一些可以操作这个属性的方法
//提供一些public的get,set,方法
//get 获取这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name = name;
}
//alt + insert
}
继承
-
继承的本质就是对某一批类的抽象,从而实现对现实世界更好的建模
-
extends的意思是“扩展”。子类是父类的扩展
-
JAVA只有单继承,没有多继承
-
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类),子类继承父类使用关键字extends来表示
-
子类和父类之间,从意义上讲具有“is a"的关系
-
object类 (在java中,object是所以类的爹
-
super
-
方法重写
super
-
super注意点:
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或者构造方法中
-
super和this 不能同时调用构造方法
-
-
this:
代表的对象不同
-
this: 本身调用这这个对象
-
super: 代表父类对象的应用
前提
-
this: 没有继承也可以使用
-
super: 只能在继承条件才可以使用
构造方法
- this() ;本地的构造
- super() ;父类的构造!
-
方法重写
-
重写都是方法的重写,和属性无关
-
需要有继承关系,子类重写父类的方法;
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但是不能缩小: public>protected>default>private
- 抛出的异常:范围,可以可以缩小,但不能扩大 ClassNotFoundException–>Exception
-
重写,子类的方法和父类必要一致,方法体不同
-
为什么要需要重写:
- 父类的功能,子类不一定需要,或者不一定满足!
- alt + Insert: override
多态
-
动态编译:类型:
-
即同一方法可以根据发送对象的不同而采取多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向的引用的类型有很多
-
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
-
注意:多态是方法的多态,属性没有多态
-
instanceof (类型转换) 引用类型 关系
多态的注意事项
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常: ClassCastException
- 存在条件,继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son();
- 不能重写
- static
- final
- private
- 不能重写
package oop.Demo04;
public class Application {
public static void main(String[] args) {
//一个对象的实现类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了:父类的引用指向子类
//Student 能调用的方法都是自己的或者继承父类的
Student s1 = new Student();
//Person 父类型可以指向子类,但是不能调用子类独有的方法
Preson s2 = new Student();
//对象能执行的哪些方法,主要看对象左边的类型,和右边关系不大
s2.run();//子类重写了父类的方法,执行了子类的方法
s1.run();
s1.eat();
}
}
package oop.Demo04;
public class Preson {
public void run(){
System.out.println("run");
}
}
package oop.Demo04;
public class Student extends Preson {
public void run(){
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
-
类型之间的转换: 父 子
Person obj = new Student(); Student student = (Student) obj; student.go(); //简介版 ((Student) obj).go();
- 父类引用指向子类的对象
- 把子类转换成父类,向上转型
- 把父类转换成子类,向下转型 ,强制转换
- 方便方法的使用,减少重复的代码,简洁
Static
package oop.Demo05;
public class Person {
//1 只执行一次
static {
System.out.println("静态代码块");
}
//2 赋值
{
System.out.println("匿名代码块");
}
//3
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person = new Person();
}
}
Abstract
- 抽象方法 只要方法名字,没有方法的实现!
- 抽象类的所以方法,继承了它的子类,都必须要实现的它抽象方法
- 抽象类不能new 这个抽象类,只能考子类去实现它,约束
- 抽象类可以写普通类的方法
- 抽象方法必须在抽象类中
接口
-
普通类:只有具体实现
-
抽象类:具体实现和规范(抽象方法)都有
-
接口:只有规范!自己无法写方法~~专业的约束!约束和实现分离:面向接口编程
-
接口就是规范
-
接口的1本质是契约
-
关键字: interface
-
接口的作用
-
约束
-
定义一些方法,让不同的人来实现
-
public abstract
-
public static final
-
接口不能被实例化,接口中没有构造方法
-
implements可以实现多个接口
-
必须要重写接口中的方法
-
package oop.Demo06;
//interface 定义的关键字,接口都需要有实现类
public interface UserService {
//接口中的所有定义其实都是抽象的 public abstract
void add(String naem);
void delete(String name);
void update(String name);
void query(String name);
}
package oop.Demo06;
public interface TimeService {
void timer();
}
package oop.Demo06;
//抽象类:extends
//类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中de的方法 ctrl +o
public class UserServicepl implements UserService,TimeService {
@Override
public void add(String naem){
}
@Override
public void delete(String name){
}
@Override
public void update(String name){
}
@Override
public void query(String name){
}
@Override
public void timer(){
}
}
内部类
- 内部类就是在一个类的内部在定义一个类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
package oop.Demo7;
public class Outer {
private int id=10;
public void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
}
public void getID(){
System.out.println(id);
}
}
package oop.Demo7;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过这个外部类来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();
}
}
总结
今天感觉自己好累啊,脑瓜哎嗡嗡的,后面java基础就只有四个视频了。原本今天有机会全部看完的,结果自己浪费了一个早上去搞那个上传图片失败的问题,结果呢自己还是失败了。导致自己心态爆炸!!还有就是今天蓝桥结果出来了,没想到得了个第三。挺意外的,室友有了两个第一更意外了。木有想到他们居然这么牛,都是认真努力学习过的。下次我也要拿第一,拿国一哈哈哈。今天学习视屏挺久的,自己呢也收获到了很多以前没有学过的知识。自己对Java基础的知识更牢固了,对后面学习要打好良好的基础,一步一步来吧。不要一口气吃一个大胖胖。加油坚持住!!!!
生活不易,实在熬不下去的时候不妨先学着低下头。学会低头才能有机会仰头。低头不算认输,放弃才是懦夫。
2020/7/14 22:40
图书馆四楼