Java中面向对象

这里是引用

Java的核心思想OOP

oop是面向对象



一、初始面向对象

1.面向过程&面向对象

 面向过程思想

     步骤清晰简单,做具体的事情

面向对象

     已分类的思想对需要解决的问题进行分类,然后对分类的问题单独进行思考。

总结

     对于复杂的事务,为了从整体把握,需要使用面向对象来分析,具体到实际的操作需要面向过程。面向过程与面向对象不可分割。


2.面向对象

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

    2.1类与对象的关系

    类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
    对象是类的实例化,是具体的,例如 人民群众是类,张三就是其中一个具体的对象,是一个人民,他的特征有属性表示,活动有方法表示。


二、方法的回顾与加深

1.程序从main方法开始执行

1.1所有方法都在类中定义。
    方法定义
    修饰符 返回值类型 方法名(…){
        方法体
        return 返回值;
}


2.返回值类型

    return 代表所在的方法结束;必须还返回值类型相同;当类型为void时 return 不写或只有return;
    命名规则:驼峰命名


3.方法的类型

    静态方法
        public static void main()
        是和类一起加载的

    非静态方法
    public static void main
    (1)实例化这个类 new
            对象类型 对象名 = 对象值;
    (2)在实例化后才能被调用


4.方法的调用

    静态的方法可以直接调用,非静态的方法不可以直接调用。
    静态的方法可以调用静态的方法;非静态的方法也可以调用非静态的方法, 但是静态的方法不可以调用非静态的方法。


5.形式参数与实际参数

     实际参数要与形式参数的类型一致

    调用方法进行传参时,分为值传递和引用传递两种。
    
    如果参数的类型是基本数据类型,那么就是值传递。
    如果参数的类型是引用数据类型,那么就是引用传递。

    值传递是实参把自己变量本身存的简单数值赋值给形参。

    引用传递是实参把自己变量本身存的对象内存地址值赋值给形参.
所以值传递和引用传递本质上是一回事,只不过传递的东西的意义不同而已。(目前不懂 2021.4.22)。
值传递代码如下(示例):

public class vlaueTrans {
		public void static main(String[] args){
		int a = 1;
		System.out.println(a);   // a = 1
		valueTrans.change(a);
		System.out.println(a);  // a = 1 ,a的值并未改变
		} 
public static void change(int a)
		a = 10;
}

引用传递代码如下(示例):

public class Demo03 { 
	public static void main(String[] args){ 
		Student s = new Student(); 
		System.out.println("before: name = "+s.name); //null 
		changeName(s); 
		System.out.println("after: name = "+s.name); //tom 
		} 
	public static void changeName(Student s){ 
		s.name = "tom"; //此时已经将值传递给了Student类中的name属性
		}
	}
	class Student{ 
	String name;
	}

6.判断方法是否一致

    1.方法名称相同
    2参数列表


三、对象的创建与分析

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

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

     类是对象的模板,是对对象的抽象,对象是类的实例化。

2.构造器(无参构造与有参构造)

2.1使用new关键字,必须要有构造器
         构造器:
                1.和类名相同
                2.没有返回值
         作用:
                1.new本质在调用方法
                2.初始化对象的值
         注意点:
                1.定义有参构造后,如果想使用无参构造,显示的定义
              一个无参的构造,无参必须显示。
     Alt + Insert (构造无参

   this. 表示当前类

3.对象内存分析

代码如下(示例):

public class Application{
	public static void main(String[] args){
  		Pet dog = new Pet();
  		dog.name = "旺财";
  		dog.age = 3;
  	}
}
public class Pet{
	//无参构造
	public Pet(){
		 public String name;
		public int age;
	}
	public void shout(){
		System.out.println("叫了一声")}
}

alt


四、面向对象的三大特性

1.封装

1.1封装的含义

     设计程序要求““高内聚”,”低耦合“”。内部的数据操作细节自己完成,外部仅有少量的方法。

     避免直接访问数据,通过接口访问。

    封装:数据的隐藏
       属性私有,get/set

public class Student{
	// 私有 prviate 
	private String name;
	private int id;
	private char sex; 
}

使用公共的方法 get/set获得数据
ALT+Insert 创造get和set。

1.2封装的意义:

     1.提高了程序的安全性,保护数据。

     2.隐藏代码的实现细节

     3.统一接口

     4.系统的可维护性增加了

2.继承

2.1继承的本质

         1.继承的本质是对某一批类的抽象。从而对世界更好的建模。

    2.extends的意思是”扩展“。子类是父类的扩展。

    3.JAVA中只有单继承,没有多继承!一个儿子只有一个爸爸,一个爸爸可以有多个儿子。

    4.继承是类和类之间的关系,除此之外其他的关系还有依赖,组合,聚合等。
    5.子类继承父类使用关键字extends表示。

  //preson 人 : 父类
  public class Person{
  	
  
  }
  public class Student extends Person{   :子类 派生类

}
public class Teacher extends Person{

}

3.Object类

     java中所有的类都直接或间接继承Object。

4.super

     super和this
          super代表父类,this代表当前类

     私有的东西无法被继承

    1.super注意点:
         (1)super调用父类的构造方法,必须在构造方法第一个
         (2)super必须只能出现在子类的方法构造方法中!
         (3)super和this不能同时调用构造方法!
    2.this和super的不同

         (1)代表的对象不同
                this :本身调用者这个对象
                 super:代表父类对象应用

         (2)前提:
                this:没有继承也可以使用
                super:只能在继承中使用

         (3)构方法:
                this():本类的构造
                super():父类的构造

5.方法的重写

重写:需要有继承的关系,子类重写父类的方法!
                1.方法名称必须相同
·
                2.参数列表必须相同

                3修饰符:范围可以扩大但不能缩小:                                      public>protected>default>private

                4.抛出异常:范围,可以被缩小,但不能被扩大:                                ClassNotFoundException–>Exception(大)
重写,子类的方法和父类的方法必须要一致:方法体不同!
父类的非静态方法不能被子类重写为静态方法 ;

为什么要重写:
                1.父类的功能,子类不一定需要,或不一定满足!
静态方法不能重写代码如下(示例):

package com.opp.demo03;

public class Application {
    public static void main(String[] args) {
    //静态static方法的调用只和左边,定义的数据类型有关
        A a = new B();
        a.print();

//父类引用指向了子类
        B b = new B();
        b.print();
    }
}
package com.opp.demo03;

public class B extends A {

    public static void print() {
        System.out.println("b-next");
    }
}
package com.opp.demo03;

public class A {
    public static void print(){
        System.out.println("a-next");
    }
}

非静态方法代码如下(示例):`

package com.opp.demo04;

public class Application {
    public static void main(String[] args) {
        A a =new A();
        a.test();
//非静态方法重写
        //父类的引用指向了子类
        B b =new A();
        b.test();//B

    }

}
package com.opp.demo04;

public class A extends B{
    //重写
    @Override//注解:有功能的注释!
    public void test() {
        System.out.println("这是子类");
    }
}
package com.opp.demo04;
//重写都是方法的重写,和属性无关
public class B {
    public void test(){
        System.out.println("这是父类");
    }
}
//这是子类
//这是子类

6.多态

1.多态的含义

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

2 多态存在的条件

    有继承的关系
    子类重写父类的方法
    父类引用子类的对象

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();
        Person s2 = new Student();
         //Student s3 = new Person();这样的,这不合法的,没有父哪来的孩子
        s1.run();
        s2.runs();//方法名不同,只和对象左边的类型有关

        s1.eat();//方法名相同,方法重写父类的方法,执行子类的方法
        s2.eat();

        //父类可以指向子类,但是不能调用子类独有的方法
        //s2.see();
        s1.see();
package com.opp.demo05;

public class Student extends Person {
    public void run(){
        System.out.println("子类跑起来了");
    }
    public void eat(){
        System.out.println("子类吃");
    }
    public void see(){
        System.out.println("子类看");
    }
}
package com.opp.demo05;

public class Person {
    public void runs(){
        System.out.println("父类跑起来了");
    }
    public void eat(){
        System.out.println("父类吃");
    }
}

     多态注意事项:
     1. 多态是方法的多态,属性没有多态性。
     2.父类和子类,有联系 类型转化异常ClassCastException!
     3.存在条件:继承关系,方法需要重写,父类引用指向子类对象!
                         Father f1 = new Son();
     4.不能重写的方法:
          (1)static方法
          (2)final常量
          (3)private 私有的

  1. 现实中,比如我们按下 F1 键这个动作:
              如果当前在 Flash 界面下弹出的就 是 AS 3 的帮助文档;
              如果当前在 Word 下弹出的就是 Word 帮助;
              在 Windows 下弹出的就是 Windows 帮助和支持。
              同一个事件发生在不同的对象上会产生不同的结果
    6.instanceof 判断有没有继承关系
    A instanceof B
    该代码能否编译通过,主要是看声明变量x的类型和Y是否存在子父类的关系.有"子父类关"系就编译通过, 没有子父类关系就是编译报错.
public class Person{ 
		public void run(){} 
}
		
		public class Student extends Person{ 
}
		
		public class Teacher extends Person{
}
main: 
Object o = new Student(); 
System.out.println(o instanceof Student);//true    判断o与student和object是不是有继承关系
System.out.println(o instanceof Person);//true 
System.out.println(o instanceof Object);//true 
System.out.println(o instanceof Teacher);//false teacher虽然与object有关但是和student无关
System.out.println(o instanceof String);//false

Person o = new Student(); 
System.out.println(o instanceof Student);//true 
System.out.println(o instanceof Person);//true
System.out.println(o instanceof Object);//true
 System.out.println(o instanceof Teacher);//false teacher虽然与person有关但是和student无关
 //编译报错 System.out.println(o instanceof String);



Student o = new Student(); 
System.out.println(o instanceof Student);//true 
System.out.println(o instanceof Person);//true
System.out.println(o instanceof Object);//true 
//编译报错 System.out.println(o instanceof Teacher); 
//编译报错 System.out.println(o instanceof String);

7.总结

父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)
father;
其中father前面的(Son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样
使代码变得简洁。体现了JAVA的抽象编程思想。

8.static关键字详解

静态变量对于类,所有对象(实例)所共享,当直接使用类去调用得到说明这个变量是静态

//static
public class student{
	private static int age;  //静态变量
	private double score;//非静态变量

pubic static void main (String[] args){
	Student s1 = new Student();
	System.out.println(Student.age);
	
}
}

9静态代码块和匿名代码块

public class Person{
 			{
					匿名代码块
				}
				static{
				 			静态代码块
							
					}
	public Person()				
				
}

静态代码块先执行,但执行一次
匿名代码块第二个执行
构造方法最后执行


五、抽象类接口

1.抽象类

//abstract 抽象类 :类 extends  单继承      (接口可以多继承)类似于插座
public abstract class Action {

    //约束 有人帮我们实现方法
    //abstract,抽象方法,只有名字,没有方法实现!
    //有构造器
    public abstract void something();

    //  1.不能new出来,只能靠子类其实现它 是一种约束
    // 2.抽象类可以写抽象方法
    //3.抽象方法只能在抽象类中
}

2.接口

          接口只有规范!自己无法写方法,专业的约束! 约束和实现分离:                               面向接口编程~

          接口的本质是契约,就像法律一样,制定好大家都遵守

          学完java之后看设计模式

          声名接口的关键字是interface

          interface 接口都需要实现类;

          方法 ,接口中的所有定义的方法其实都是抽象的

          接口中所有属性都是常量
类可以实现接口, implements
实现接口的类,就需要重写接口中的方法~
多继承~ 利用接口实现多继承~

package com.opp.demo08;

//类可以实现接口, implements
//实现接口的类,就需要重写接口中的方法~
// 多继承~ 利用接口实现多继承~

public class UserServiceImpl implements UserService,TimeService {
    @Override
    public void run() {

    }

    @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() {

    }
}

2.1总结

作用:
         1.约束
         2.定一些方法,以不同的方式实现
         3.public abstract
         4.public static final
         5.接口不能被实例化,接口中没有构造方法
         6.implements可以实现多个接口
         7.必须要重写接口中的方法
         8.总结博客














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值