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


    类和对象的定义格式:

     

    /**
        面向过程:以步骤为单位,一步一步完成某一个具体事情
        面向对象:以对象为单位,通过调度组合不同的对象来完成某一个事情
    
    */
    public class Test1{
        public static void main(String[] args){
            
            //int i = 0;
            Horse h = null;  //声明一个类的变量(除了八种基本数据类型以外,都是引用数据类型,包括数组)
            
            //创建一个Horse类型的对象,实例对象
            h = new Horse();
            //有了对象,我们就可以调用对象的属性和方法
            h.name = "赤兔马";
            h.age = 350;
            
            h.run();//调用方法,那么方法就会被执行。
            
            h.eat();
            
            
            //匿名对象:只能使用一次,用完后,该对象就会被释放
            new Horse().eat();
            
            h =  null;//把对象释放
            //h.eat();//当对象不存在时,调用该对象的属性和方法将报错(空指针)
            
            
            //--------------------
            Horse h1 = null;
            Horse h2 = null;
            h1 = new Horse();
            //h2 = new Horse();
            h1.name = "小白";
            h1.age = 4;
            //h2.name="小黑";
            //h2.age=5;
            
            h2 = h1;//对象之间的赋值,相同类型才可以赋值
            h2.name="小黑";
            System.out.println(h1.name);
            
            System.out.println("----------------------");
            
            Horse h3 = null;
            Horse h4 = null;
            h3 = new Horse();
            h4 = new Horse();
            h3.name = "小白";
            h3.age = 4;
            h4.name="小黑";
            h4 = h3;
            h4.name = "嘿嘿";
            System.out.println(h3.name);
            
            
        }
    }
    
    //自定一个类(类型)
    class Horse{
        //在类中定义属性(特征)
        String name;//字符串是引用类型变量,不是基本数据类型变量
        int age;
        public void run(){
            System.out.println("我是"+name+",我"+age+"岁了,我还日行千里");
        }
        public void eat(){
            System.out.println("我吃仙草,还吃得多");
        }
        
    }

     


    对象和类的内存分析:

     

     

     


     




     内存的封装性:

     

    /**
        封装性
        如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
        private关键字:访问权限修饰符,public表示公有的,private表示私有的,私有的属性或方法,只能在本类中访问,
        公有的属性和方法,可以被类外部的其它类访问,想要在类外部访问私有属性,我们需要提供公有的方法来间接访问,
        通常在一个类中,属性都私有化,并对外提供getter and getter方法
    */
    public class Test2{
        public static void main(String[] args){
            
            
            Person p1 = new Person();
            //p1.name = "菲菲";
            //p1.age = 18;
            p1.setName("菲菲");
            p1.setAge(18);
            
            
            p1.run(10);
            
            p1 = null;
            
        }
    }
    
    //没有封装之前
    class Person{
        //属性的封装
        private String name; //成员变量,在类中定义
        private int age;  //成员变量,在类中定义
        
        //getter and setter
        
        //对外提供一个为name属性设值的方法
        public void setName(String name){
            this.name = name;
        }
        //对外提供一个获取name属性的方法
        public String getName(){
            return name;
        }
        
        public void setAge(int age){
            this.age = age;
        }
        public int getAge(){
            return age;
        }
        
        public void run(int len){//参数也是局部变量
            int i;
            int m = len; // m也是局部变量
            System.out.println("我跑了"+m+"米");
            System.out.println(age);
        }
        
    }


    /**
    	构造方法:构造方法是在类中定义的,构造方法的定义格式:方法名称与类名称相同,无返回值类型的声明。
    	1、构造方法就是类构造对象时调用的方法,用于对象的初始化工作
    	2、构造方法是实例化一个类的对象时,也就是new 的时候,最先调用的方法。
    
    
    */
    public class Test3{
    	public static void main(String[] args){
    		//Dog dog = new Dog();
    		
    		Dog dog1 = new Dog("wangwang",5);
    	}
    }
    
    class Dog{
    	//构造方法:构造方法是在类中定义的,构造方法的定义格式:方法名称与类名称相同,无返回值类型的声明。
    	
    	//默认构造方法,通常有其它构造方法时,要保留默认构造方法
    	public Dog(){
    		System.out.println("默认的构造方法,执行了");
    	}
    	//带参数的构造方法:
    	public Dog(String name){
    		this.name = name;
    		System.out.println("带一个参数的构造方法执行了");
    		//注意:如果类中有带参数的构造方法,那么默认的构造方法将不起作用
    	}
    	public Dog(String name,int age){
    		this(name);//调用其它构造方法时,此语句必须在第一句否则报错,在构造方法相互调用时必须要有出口,这就是调用显示println("带一个参数的构造方法执行了")
    		//this.name = name;
    		this.age = age;
    		System.out.println("带两个参数的构造方法执行了");
    		
    	}
    	
    	private String name;
    	private int age;
    	public void setName(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setAge(int age){
    		this.age = age;
    	}
    	public int getAge(){
    		return age;
    	}
    }
    

      


     this关键字:

    表示当前对象:在方法被调用的过程中,哪个对象调用了方法,在方法内的this就表示谁

     

    /**
        this关键字
        调用类中的属性
    ·     调用类中的方法或构造方法
    ·     表示当前对象:在方法被调用的过程中,哪个对象调用了方法,在方法内的this就表示谁
        类名.this
    */
    public class Test4{
        public static void main(String[] args){
            
            Cat cat = new Cat();
            cat.setName("咪咪");
            cat.setAge(3);
            
            cat.eat();
        }
    }
    
    class Cat{
        
        private String name;
        private int age;
        public void setName(String name){ //name=咪咪
            this.name = name; //this代表的是当前对象
        }
        public String getName(){
            return name;
        }
        public void setAge(int age){
            this.age = age;
        }
        public int getAge(){
            return age;
        }
        public void eat(){
            //在方法中使用this调用类中的其它方法或属性,this可以省略,this前面可以使用当前的类名.this
            //在后面的内部类知识点中会涉及到
            System.out.println("我是"+Cat.this.getName()+",我爱吃鱼");
            
            //System.out.println("我是"+this.name+",我爱吃鱼");
        }
    }



    值传递与引用传递

     1 //示例二:引用传递
     2 public class RefDemo1{
     3     public static void main(String[] args){
     4         Duck d  = new Duck();
     5         method(d) ;
     6         System.out.println("Duck age = "+d.age);
     7     }
     8     public static void method(Duck duck){
     9         duck.age = 5;
    10     }
    11 }
    12 class Duck{
    13      int age = 2;   //省略封装
    14 }

     

     

    //示例三:String传递
    //字符串本身就是一个对象
    public class RefDemo2{
        public static void main(String[] args){
            String name = "小飞";
            method(name) ;
            System.out.println("name="+name) ;
        }
        public static void method(String sname){
            sname = "小备";
        }
    }

    //示例四:String传递
    public class RefDemo3{
        public static void main(String[] args){
            Person p  = new Person();
            method(p) ;
            System.out.println("person name= "+p.name) ;
        }
        public static void method(Person per){
            per.name = "备备";
        }
    }
    class Person{
         String name = "飞飞";   //省略封装
    }

    对象的一对一关系:

    /**
        两个对象之间的一对一关系:
        比如:一个英雄(Hero)对一个兵器(Weapon)
        双向一对一
        单向一对一
    */
    public class Test5{
        public static void main(String[] args){
            Hero hero = new Hero("刘备",300);
            Weapon weapon = new Weapon("双股剑",3);
            
            //把两个对象关联起来
            hero.setWeapon(weapon);
            weapon.setHero(hero);
            
            //通过英雄来获取他的信息
            String name = hero.getName();
            int age = hero.getAge();
            Weapon w = hero.getWeapon();
            System.out.println("我是"+name+",我"+age+"岁,我的武器是:"+w.getName()+",排行"+w.getGrade()+"级");
            
        }
    }
    //英雄类
    class Hero{
        private String name;
        private int age;
        private Weapon weapon;//一对一关系
        public void setWeapon(Weapon weapon){
            this.weapon = weapon;
        }
        public Weapon getWeapon(){
            return weapon;
        }
        public Hero(){}
        public Hero(String name,int age){
            this.name = name;
            this.age = age;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;
        }
        public void setAge(int age){
            this.age = age;
        }
        public int getAge(){
            return age;
        }
    }
    //兵器类
    class Weapon{
        
        private String name;
        private int grade;
        private Hero hero;
        public void setHero(Hero hero){
            this.hero = hero;
        }
        public Hero getHero(){
            return hero;
        }
        
        public Weapon(){}
        public Weapon(String name,int grade){
            this.name = name;
            this.grade = grade;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;
        }
        public void setGrade(int grade){
            this.grade = grade;
        }
        public int getGrade(){
            return grade;
        }
    }

     

    /**
        static 关键字
        1、静态变量或方法不属于对象,依赖类
        2、静态变量是全局变量,生命周期从类被加载后一直到程序结束
        3、静态变量只有存一份,在静态方法区中存储
        4、静态变量是本类所有对象共享一份
        5、建议不要使用对象名去调用静态数据,直接使用类名调用
        6、static修饰一个方法,那么该方法属于类,不属于对象,直接用类名调用
        7、静态方法不能访问非静态属性和方法,只能访问静态。
        
        
    */
    public class Test6{
        public static void main(String[] args){
            
            System.out.println(args.length);
            for(String s: args){
                System.out.println(s);
            }
            //Role beibei = new Role("刘备","蜀国");
            //Role yunchang = new Role("云长","蜀国");
            //Role feifei = new Role("张飞","蜀国");
            Role beibei = new Role("刘备");
            Role yunchang = new Role("云长");
            Role feifei = new Role("张飞");
            
            System.out.println(beibei.getInfo());
            System.out.println(yunchang.getInfo());
            System.out.println(feifei.getInfo());
            
            System.out.println(beibei.country);
            System.out.println(yunchang.country);
            System.out.println(feifei.country);
            
            beibei.country = "秦国";
            System.out.println("------------------");
            System.out.println(beibei.country);
            System.out.println(yunchang.country);
            System.out.println(feifei.country);
            
            System.out.println("------------------");
            
            System.out.println(Role.country);//用类名调用静态变量
        }
    }
    
    //角色
    class Role{
        private String name;
        static String country = "蜀国";//静态变量(全局变量)
        public Role(String name,String country){
            this.name = name;
            this.country = country;
        }
        public Role(String name){
            this.name = name;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;
        }
        
        //静态方法不能访问非静态的数据
        public static void setCountry(String country){
            Role.country = country;
        }
        /*
        public void setCountry(String country){
            this.country = country;
        }
        public String getCountry(){
            return country;
        }
        */
        public String getInfo(){
            return "name="+name+",country="+country;
        }
    }


    代码块:

      

    /**
        代码块:
        1、普通代码块,在方法中写的代码块
        2、构造块,是在类中定义的代码块,在创建对象时被调用,优于构造方法执行
        3、在类中使用static声明的代码块称为静态代码块
            在第一次使用的时候被调用(创建对象),只会执行一次,优于构造块执行
            我们在项目开发中,通常会使用静态代码块来初始化只调用一次的数据。比如说:
        小结:重点会使用的顺序是静态代码块,普通代码块,同步代码块,构造代码块
    
    */
    public class Test7{
        public static void main(String[] args){
            
            //Student s = new Student();
            //Student s1 = new Student();
            //Student s = null;
        }
    }
    
    class Student{
        
        static{
            System.out.println("我是静态代码块");
        }
        
        public Student(){
            System.out.println("构造方法");
        }
        {
            System.out.println("我是构造代码块");
        }
        public void study(){
            
            //限制作用域
            {
                int i = 10;
                System.out.println("我是普通代码块");
            }
            
            
        }
    }

    单例模式:

  • 相关阅读:
    1.0-springboot的java配置方式
    关于springboot启动的问题.
    关于Springboot整合mybatis启动的问题
    关于IDEA无法引入包和类的情况
    关于SpringBoot bean无法注入的问题(与文件包位置有关)改变自动扫描的包
    PostgerSQL 解决锁表
    git 合并冲突后回滚到之前版本
    双重检查锁实现单例
    SpringBoot事务
    SQL性能优化
  • 原文地址:https://www.cnblogs.com/juham/p/15575013.html
Copyright © 2011-2022 走看看