zoukankan      html  css  js  c++  java
  • java面向对象浅析

    1.(了解) 面向对象 vs 面向过程 例子:人开门;把大象装冰箱

    2.面向对象的编程关注于类的设计!
    1)一个项目或工程,不管多庞大,一定是有一个一个类构成的。
    2)类是抽象的,好比是制造汽车的图纸。
    而具体的一辆一辆的车,是根据图纸制造的,实际上就是类的实例化

    3.完成一个项目(或功能)的思路
    1)所要完成的功能对应的类的对象是否存在。
    2)若存在,则通过对象直接调用对应的类中的属性或方法即可 。 例如 Scanner。
    3)若不存在,需要创建类的对象。甚至说,类都不存在,就需要设计类。

    4.面向对象编程的三条主线:
    1)类及类的构成成分:属性 方法 构造器 代码块 内部类
    2)面向对象编程的特征:封装性 继承性 多态性 (抽象性)
    3)其它的关键字:this super package import static final abstract interface ...

    1.关于于类的设计

    2.类的组成成分:
    1) 属性(成员变量,Field)
    2)方法(成员方法,函数,Method)

    2.1属性:
    * 成员变量 vs 局部变量
    * 相同点:1.遵循变量声明的格式: 数据类型 变量名 = 初始化值
    * 2.都有作用域
    * 不同点:1.声明的位置的不同 :成员变量:声明在类里,方法外
    * 局部变量:声明在方法内,方法的形参部分,代码块内(main方法也是方法,所以main方法里边的变量也是存放在栈空间)
    * 2.成员变量的修饰符有四个:public private protected 缺省
    * 局部变量没有修饰符,与所在的方法修饰符相同。
    * 3.初始化值:一定会有初始化值。
    *    成员变量:如果在声明的时候,不显式的赋值,那么不同数据类型会有不同的默认初始化值。
    * byte short int long ==>0
    * float double ==>0.0
    * char ==>空格
    * boolean ==>false
    * 引用类型变量==>null
    * 局部变量:一定要显式的赋值。(局部变量没有默认初始化值)
    * 4.二者在内存中存放的位置不同:成员变量存在于堆空间中;局部变量:栈空间中
    *
    * 总结:关于变量的分类:1)按照数据类型的不同:基本数据类型(8种) & 引用数据类型
    * 2)按照声明的位置的不同:成员变量 & 局部变量

    2.2 方法:提供某种功能的实现 main方法也是方法,main方法里边的属性也必须要赋值。
    * 1)实例:public void eat(){//方法体}
    * public String getName(){}
    * public void setName(String n){}
    * 格式:权限修饰符 返回值类型(void:无返回值/具体的返回值) 方法名(形参){}
    *
    * 2)关于返回值类型:void:表明此方法不需要返回值
    * 有返回值的方法:在方法的最后一定有return + 返回值类型对应的变量
    * 记忆:void 与return不可以同时出现一个方法内。像一对“冤家”。
    *
    * 3)方法内可以调用本类的其他方法或属性,但是不能在方法内再定义方法!

    public class Zoo {
    	public static void main(String[] args) {
    		//基本数据类型的声明:数据类型 变量名 = 初始化值
    		int i = 10;
    		//类的实例化:如下的a1就是一个实实在在的对象
    		Animal a1 = new Animal();
    		//int[] arr = new int[10];
    		System.out.println("name:" + a1.name + " age:" + a1.age);
    		//通过对象调用属性
    		a1.name = "花花";
    		a1.age = 3;
    		System.out.println("name:" + a1.name + " age:" + a1.age);
    		//通过对象调用方法
    		a1.eat();
    		a1.sleep();
    		
    		//再创建一个类的对象
    		Animal a2 = new Animal();
    		System.out.println("name:" + a2.name + " age:" + a2.age);//null 0
    		a2.name = "小花";
    		System.out.println("name:" + a1.name + " age:" + a1.age);
    		System.out.println("name:" + a2.name + " age:" + a2.age);
    		
    		//a3不意味着相较于a1重新创建的一个对象,而是a1与a3共用一个对象实体
    		Animal a3 = a1;
    		System.out.println("name:" + a3.name + " age:" + a3.age);//与a1一样
    		a3.name = "维尼熊";
    		System.out.println("a1:name:" + a1.name + " age:" + a1.age);
    		
    		System.out.println(a2.getName());//a2.name;
    		System.out.println(a2.desc());
    	}
    }
    
    
    class Animal{
    	//1.属性
    	String name;
    	int age;
    	
    	//2.方法
    	public void eat(){
    		System.out.println("动物进食");
    	}
    	
    	public void sleep(){
    		System.out.println("动物休眠");
    		//return;
    	}
    	
    	public String getName(){
    		return name;
    	}
    	public int getAge(){
    		System.out.println("hello");
    		return age;
    		//其后不可以声明语句
    		//System.out.println("hello");
    	}
    	//当通过对象调用此方法时,会将方法的方法的返回值提供给方法的调用者,也就是当前的对象。
    	public String desc(){
    		if(age > 2){
    			return "恰同学少年";
    		}else{
    			return "还是看动画片的年龄";
    		}
    	}
    	public void setName(String n){//n:局部变量
    		name = n;
    	}
    	public void addAge(){
    		int i = 0;//局部变量
    		age += i;
    	}
    	public void info(){
    //		可以在方法内调用本类的其他方法,但是不可以在方法内定义新的方法
    		eat();
    		sleep();
    //		public void breath(){
    //			System.out.println("呼吸");
    //		}
    	}
    //	System.out.println("hello!");
    

      


    3.面向对象编程的思想的落地法则一:
    1)设计并创建类及类的成分
    2)实例化类的对象  
    3)通过“对象.属性”或"对象.方法"的形式完成某项功能

    4.类的初始化的内存解析
    4.1 内存划分的结构:
    栈(stack):局部变量 、对象的引用名、数组的引用名
    堆(heap):new 出来的“东西”(如:对象的实体,数组的实体),含成员变量
    方法区:含字符串常量
    静态域:声明为static的变量

    4.2 理解的基础上,学会基本的创建的类的对象在内存中的运行。

    * 方法的重载(overload)
    * 要求:1.同一个类中 2.方法名必须相同 3.方法的参数列表不同(①参数的个数不同②参数类型不同)
    * 补充:方法的重载与方法的返回值类型没有关系!

    //如下的四个方法构成重载
    //定义两个int型变量的和
    public int getSum(int i,int j){
    return i + j;
    }
    //定义三个int型变量的和
    public int getSum(int i,int j,int k){
    return i + j + k;
    }
    //定义两个double型数据的和
    public double getSum(double d1,double d2){
    return d1 + d2;
    }

    //定义三个double型数组的和
    public void getSum(double d1,double d2,double d3){
    System.out.println(d1 + d2 + d3);
    }
    //不能与如上的几个方法构成重载
    // public int getSum1(int i,int j,int k){
    // return i + j + k;
    // }
    // public void getSum(int i,int j,int k){
    // System.out.println(i + j + k);
    // }


    //以下的两个方法构成重载。
    public void method1(int i,String str){

    }
    public void method1(String str1,int j){

    }

    * 可变个数的形参的方法:
    * 1.格式:对于方法的形参: 数据类型 ... 形参名
    * 2.可变个数的形参的方法与同名的方法之间构成重载
    * 3.可变个数的形参在调用时,个数从0开始,到无穷多个都可以。
    * 4.使用可变多个形参的方法与方法的形参使用数组是一致的。
    * 5.若方法中存在可变个数的形参,那么一定要声明在方法形参的最后。
    * 6.在一个方法中,最多声明一个可变个数的形参。


    //如下四个方法构成重载
    //在类中一旦定义了重载的可变个数的形参的方法以后,如下的两个方法可以省略
    // public void sayHello(){
    // System.out.println("hello world!");
    // }
    // public void sayHello(String str1){
    // System.out.println("hello " + str1);
    // }
    //可变个数的形参的方法
    public void sayHello(String ... args){
    for(int i = 0;i < args.length;i++){
    System.out.println(args[i] + "$");
    }
    //System.out.println("=====");
    }

    public void sayHello(int i,String ... args){
    //public void sayHello(String ... args,int i){
    System.out.println(i);

    for(int j = 0;j < args.length;j++){
    System.out.println(args[j] + "$");
    }
    }

    public void sayHello1(String[] args){
    for(int i = 0;i < args.length;i++){
    System.out.println(args[i]);
    }
    }

    * 一、类的第三个成员:构造器(constructor 构造方法)
    * constructor:建造者
    * 构造器的作用:①创建对象 ②给创建的对象的属性赋值
    *
    * 1.设计类时,若不显式声明类的构造器的话,程序会默认提供一个空参的构造器.
    * 2.一旦显式的定义类的构造器,那么默认的构造器就不再提供。
    * 3.如何声明类的构造器。格式:权限修饰符 类名(形参){ }
    * 4.类的多个构造器之间构成重载

    package text;
    import java.util.Scanner;
    
    
    public class Circle {
    
    	public static void main(String[] args) {
    	Scanner sc=new Scanner(System.in);
        double g=sc.nextInt();
    	 TestCircle tc=new TestCircle();
    	 tc.setRadius(g);
    	 double m=tc.mianji();
    	 System.out.println(m);
    
    	}
    
    }
    
    
    class TestCircle{
    	private double radius;
    	public double getRadius(){
    		return radius;
    	}
    	public void setRadius(double r){
    		this.radius=r;
    	}
    	public double mianji(){
    		return 3.14*radius*radius;
    	}
    }
    

      


    * 二、类对象的属性赋值的先后顺序:①属性的默认初始化 ②属性的显式初始化③通过构造器给属性初始化
    * ④通过"对象.方法"的方式给属性赋值

    public class lianxixixi{
    	String pinpai;
    	String jixing;
    	double price;
    	double yh;//油耗
    	double lc;//里程
    	double yxrj;//油箱容积
    	double syyl;//剩余油量
    	
    	
    	public lianxixixi(String pinpai,String jixing,double price,double yh,double yxrj,double syyl){
    		  this.pinpai=pinpai;
    		  this.jixing=jixing;
    		  this.price=price;
    		  this.yh=yh;
    		  this.yxrj=yxrj;
    		  this.syyl=syyl;
    		  
    		}
    	
    	public void show(){
    		System.out.println("品牌"+pinpai);
    		System.out.println("车型"+jixing);
    		System.out.println("价格"+price);
    		System.out.println("油耗"+yh);
    		System.out.println("里程"+lc);
    		System.out.println("油箱容积"+yxrj);
    		System.out.println("剩余油量"+syyl);
    	}
    	
    	public void run(double lc){
    		syyl=syyl-(lc/100)*yh;
    		if(syyl<10){
    			System.out.println("再开,一会就得车开你了!");
    		}else{
    		System.out.println(syyl);}
    	}
    }
    
    
    public class lianxixi2 {
    
    	
    	public static void main(String[] args) {
    	
    	lianxixixi li=new lianxixixi("比亚迪","F0",45000.0,7.0,60.0,59.0);
         li.show();
         li.run(1000);
    	}
    
    }
    

      

    1.static:静态的,可以用来修饰属性、方法、*代码块(或初始化块)、*内部类

    2.
    static修饰属性(类变量):
    * 1.由类创建的所有的对象,都共用这一个属性
    * 2.当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。vs 实例变量(非static修饰的属性,各个对象各自拥有一套副本)
    * 3.类变量随着类的加载而加载的,而且独一份
    * 4.静态的变量可以直接通过“类.类变量”的形式来调用
    * 5.类变量的加载是要早于对象。所以当有对象以后,可以“对象.类变量”使用。但是"类.实例变量"是不行的。
    * 6.类变量存在于静态域中。
    *
    * static修饰方法(类方法):
    * 1.随着类的加载而加载,在内存中也是独一份
    * 2.可以直接通过“类.类方法”的方式调用
    * 3.内部可以调用静态的属性或静态的方法,而不能调用非静态的属性或方法。反之,非静态的方法是可以调用静态的属性或静态的方法
    * >静态的方法内是不可以有this或super关键字的!
    * 注:静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收也要晚于非静态的结构

    Eclipse中编辑好了一个类,点击运行时出现如图所示的现象,现在编辑好的这个类并无错误,点击Proceed可正常运行。

    按照字面意思就是,在这个“工程”中存在错误,打开工程列表----找到前边有红色叉叉的某个类,将错误去掉。

    这个弹窗也就不会在出现了。
    成员变量 局部变量 static

  • 相关阅读:
    面试题
    网络编程-1
    excel文件导入数据库--jxl包
    excel文件导入数据库
    1113 Integer Set Partition (25 分)集合分割
    1120 Friend Numbers (20 分)set的使用
    1099 Build A Binary Search Tree (30 分)
    1092 To Buy or Not to Buy (字符串删除)
    1127 ZigZagging on a Tree (30 分)树的层次遍历
    1155 Heap Paths (30 分)判断是否是一个堆
  • 原文地址:https://www.cnblogs.com/gaofangquan/p/7197083.html
Copyright © 2011-2022 走看看