zoukankan      html  css  js  c++  java
  • 6.面向对象 -类.md



    1. static:

    很多时候将static直接翻译为静态,但是这个描述不够准确,static是用来定义类变量,也就是说被static定义的变量不属于这个类的某个实例。所以被static定义的成为类变量、类方法;反之为实例变量
    
    
    需要注意的是,在静态方法中不能直接通过对象去调用,需要通过类去调用
    

    123456789101112131415 public class NewClassTest {
    public void jump(){
    System.out.println("This is NewClassTest");
    }

    public void run(){
        System.out.println("This is run");
        jump();
    }
     
    //static 
    public static void sFun(){
        new NewClassTest().run();   //correct
        run();                      //error
    }
    

    }

    2. 类在内存中,每一个类在创建在栈内存中,当创建一个对象的时候,将非类变量再堆内存中创建,而类变量是不会因为创建对象而在堆中重新创建

    并且访问类变量不能用对象的方式,必须用类的方式!

    3. 对象、引用和指针:

        Java中的变量都是引用,指针被封装了。当对象没有被引用时候就会被垃圾回收机制回收。也可以将对象赋值null,标记回收此对象。
    

    4. 类名和文件名的关系

    5. Java的set和get方法

    5. 包的概念:

    包的命名:

    父## 包和子包之间的类关系:

    import包:

    特殊情况的引用

    Java文件结构



    6.构造器

    Java可以自定义构造,可以简单理解为C++的构造,如果定义了私有的构造,即不使用默认的无参构造,那么在创建对象的时候,默认的构造是非法的,如果需要多个构造,那么需要定义多个构造,形成构造的重载:

    
    
    package aaa;
     
    public class Study {
     
        private int num;
        private String name;
         
        //这里既可以为public也可以为private,具体区别待理解
        private Study(String name){
            this.name = name;
        }
         
         
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Study s = new Study("aaa");   //这里合法!
            Study ss = new Study();       //这里会报错!
            System.out.print(s.name);
        }
     
    }
    

    关于构造在的初始化过程:

    在构造中调用构造:

    package aaa;
     
    public class Study {
     
        private int num;
        private String name;
         
        //无参构造
        public Study(){};
         
        //一个参数的构造
        private Study(String name){
            this.name = name;
        }
         
        //两个参数的构造
        public Study(String name, int num){
            this(name);   //调用了一个参数的构造,用this
            this.num = num;
        }
         
         
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Study s = new Study("aaa");     //没有被其他构造再调用,只初始化自己,num默认初始化为0
            System.out.println(s.name);
            System.out.println(s.num);
             
            Study ss = new Study("bbb", 2); //在构造中调用了一个参数的构造
            System.out.println(ss.name);
            System.out.println(ss.num);
        }
     
    } 
    
    
    
    

    7.继承

    注意:Java是单继承,不同于C++,每个子类只有一个直接父类。关键字extends

    修饰符 class SubClass extends SuperClass{
        //类定义部分
    }
    
          子类继承后获得父类的全部变量和方法,构造除外。
          **但是可以间接继承多个父类**
    

    方法的覆盖(Override):

    super关键字

    子类需要调用父类中被覆盖的实例方法,可以用Super关键字来调用,需要注意的是和this不能出现在static关键字修饰的方法中一样,super也不可以调用类方法

    //在两个文件中定义类
    
    //父类
    public class Bird{
        public int num = 1;
         
        public void fly(){
            System.out.println("Bird can fly!");
        }
    }
     
    //子类
    public class Drck extends Bird{
        public int num = 2;
         
        public void fly(){
            System.out.println("Drck can not fly!");
        }
         
        public void accessBirdNum(){
            System.out.println(super.num);  //调用父类变量
        }
         
        public void accessDrckNum(){
            System.out.println(num);
        }
    }
    

    需要注意的是有隐藏的情况,在父类和子类同名的情况下:

    //父类
    public class Bird{
        public String fly = "Bird can fly";
    }
    //子类
    public class Drck extends Bird{
            //实际上父类的fly被这里隐藏了
        private String fly = "Drck can not fly";
    }
    //打印
    public class Study {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Drck dc = new Drck();
                    System.out.println(dc.fly);            //这里编译不过,  
            System.out.println(((Bird)dc).fly);  //向上转为父类
        }
    }
    

    8.多态

    //父类
    public class Bird{
        public String name = "Bird";
        //父类独有的方法
        public void birdTest(){
            System.out.println("Bird fly");
        }
        //会被子类方法覆盖
        public void test(){
            System.out.println("父类的test");
        }
    }
     
    //子类
    public class Drck extends Bird{
        public String name = "Drck";
        //子类独有的方法
        public void drckTest(){
            System.out.println("drck fly");
        } 
        //覆盖了子类
        public void test(){
            System.out.println("子类的test");
        }
    }
     
    public class Study {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Bird bd = new Drck();
            System.out.println(bd);
            bd.birdTest();    //父类的方法
            bd.test();        //子类的方法
            //bd.drckTest();  //编译的类型是Bird,没有drckTest方法,编译报错
        }
    }
    

    引用变量的强转

    强转的规则:
    1. 基本的数值类型
    2. 有继承关系的两个类型之间
    是否可以强制转换可以用instanceof来判断

    子类和父类的封装

    使用继承的前提:

    9.类的初始化

    10.Java增强的包装类

    •自动装箱(AutoBoxing)和自动拆箱(AutoUnboxing)
    Java中除了基本数据类型外,所有引用类型的变量都继承自Object,都可当做Object类型变量使用。基本数据类型在Java中通过特定的包装类实现:

    public class Study {
        public static void main(String[] args) {
            Integer inObj = 2;
            Float flObj = 2f;
            Double dbObj = 2.0;
            Byte byObj = 1;
            Character chObj = 'c';
            Boolean bObj = false;
            Short shObj = 1;
            //Object
            Object ob = true;
             
            if (ob instanceof Boolean) {
                bObj = (Boolean)ob;
            }              
        }
    }
    
    
    

    自动装箱和拆箱的过程由Java完成,利用了向上转型的特性。不需要我们认为干预,但是要注意的是不能将错误的类型装箱和拆箱:将int和Float混用

    String和其他类型的互转

    ### 基本类型转String用praseXXX(String s)或者构造XXX(String s)
    ### String转基本类型用s.valueOf()方法或者 + ""的方式
    

    ``Java
    public class Study {
    public static void main(String[] args) {
    int num = 2;
    float numf = 2.2f;
    String snum = "123";
    //String转换为基本类型,使用praseXXX(String s)
    int num1 = Integer.parseInt(snum);
    System.out.println("int num:" + num1);
    //String转换为基本类型,使用构造XXX(String s)
    float num2 = new Float(numf);
    System.out.println("float num:" + num2);
    //基本类型转换为String,使用String的方法s.valueOf()
    String s = String.valueOf(numf);
    System.out.println("String num:" + s);
    //基本类型转换为String,使用+符号
    String s1 = num + "";
    System.out.println("String plus num:" + s1);
    }//main
    }

    
    
    ## toString方法
     
    
    ```Java
    package aaa;
     
    //定义个类,并重写toString方法
    public class Bird{
        private int wing;
        private int eye;
         
        //无参构造
        public Bird(){
        }
         
        //有参构造
        public Bird(int wing, int eye){
            this.wing = wing;
            this.eye = eye;
        }
         
        //省略getter和setter方法
         
        //Override toString
        public String toString(){
            return "一只鸟有" + wing + "双翅膀" + eye + "双眼睛";
        }
     
    }
    
    //调用
    
    public class Study {
        public static void main(String[] args) {
            Bird bd = new Bird(2,2);
            System.out.print(bd);
        }//main
    }
    

    equals方法

    单例类

    public class Singleton {
        private static Singleton instance;
        //将默认构造私有,方式重复创建对象
        private Singleton(){
        }
        //通过开放的方法获取唯一的实例
        public static Singleton getInstance(){
            if (null != instance){
                instance = new Singleton();
            }
            return instance;
        }
    }
    
  • 相关阅读:
    <转>CSS3 Media Queries 实现响应式设计
    css3的display:box研究
    CSS3制作渐变文字
    (转)apple-touch-icon-precomposed 和 apple-touch-icon属性区别
    (转)移动平台的meta标签
    day 57 jQuery插件
    day56 文件 文档处理,事件
    day 55 jQuery-part2
    day 54 jQuery, part-1
    day 52 dom 事件
  • 原文地址:https://www.cnblogs.com/bugstar/p/8492450.html
Copyright © 2011-2022 走看看