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

    一、类与实例

      类的定义:class 类名(一般大写字母开头,命名规则驼峰命名)

      类是抽象概念:例如人类,是不存在的

      
    class Person{
        private String name;
        private int age;
        public void setName(String name){
            if (name==null || name.isEmpty()){
                throw new IllegalArgumentException("invalid name");
            }
            this.name = name;
        }
        public void setNameAndAge(String name,int age){
            this.name = name;
            this.age = age;
        }
        public void setAge(int age){
            this.age = age;
        }
        public String getName(){
            return this.name;
        }
        public int getAge(){
            return this.age;
        }
    }
    View Code

      实例:类的具体化,例如:张三、李四

        创建实例:类 实例名 = new 类();

        访问实例变量:实例名.变量

            Person ming = new Person();//创建实例
            ming.setName("小明");//调用实例方法
            ming.setAge(12);
            String name = ming.getName();
            int age = ming.getAge();

      方法:

        定义方法:

          修饰符 方法返回类型 方法名(方法参数列表) {
            若干方法语句;
            return 方法返回值;
          }

        实例调用方法:实例.方法()

        在方法内部可以使用this(代表实例)来访问类的属性和方法

        // 多个参数
       public void setNameAndAge(String name,int age){
            this.name = name;
            this.age = age;
        }
        
        private String[] names;
        // 可变类型  类型... 参数名  会转变为数组
        public void setNames(String... names){
            this.names = names;
        }

      构造方法:

        修饰符  类名(方法参数){}

        构造方法作用:构造方法用来初始化实例,当类中没有构造方法时,系统中会默认创建一个没有参数没有任何执行语句的构造方法

        构造方法调用:使用new操作符 

        构造方法定义:一个类中可以有多个构造方法,调用时会根据参数个数、位置、类型进行区分,类中构造函数还可以调用其他构造函数,使用this(参数)来调用

        具体代码实现:

          

    public class Main {
    
        public static void main(String[] args) {
            // 调用没有参数的构造方法
            Person ming = new Person();
            String name = ming.getName();
            int age = ming.getAge();
            System.out.println(name+age);
    
        }
    }
    
    class Person{
        private String name;
        private int age;
    
        // 构造方法  没有void修饰 方法名与类名相同  调用构造方法必须使用new操作符
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }
        // 没有参数,没有执行语句的构造方法
        public Person() {
            this("Unnamed");
        }
        public Person(String name){
            // 调用构造方法使用this(参数)
            this(name,18);
        }
        public void setName(String name){
            if (name==null || name.isEmpty()){
                throw new IllegalArgumentException("invalid name");
            }
            this.name = name;
        }
        public void setNameAndAge(String name,int age){
            this.name = name;
            this.age = age;
        }
        public void setAge(int age){
            this.age = age;
        }
        public String getName(){
            return this.name;
        }
        public int getAge(){
            return this.age;
        }
    }
    View Code

       方法重载:

        

    package com.company;
    
    /**
     * @Time :2020/7/17 10:57
     * @Description: <方法重载--方法名相同,但参数不同>
     * @作者 :aiyumo
     */
    public class MethodOverload {
        public static void main(String[] args){
            String s = "Test string";
            int n1 = s.indexOf('t');
            int n2 = s.indexOf("st");
            int n3 = s.indexOf("st", 4);
            System.out.println(n1);
            System.out.println(n2);
            System.out.println(n3);
        }
    }

     类的继承

      class 子类 extends 父类/基类/超类{}

      所有的类默认都继承Object

      子类继承父类的所有非private字段和方法除构造方法外,父类可以使用protected来修饰字段

      子类访问父类的字段:super.fieldname、this.fieldname、fieldname  编译器会自动定位到父类中的字段

      任何类的构造方法,第一行语句必须是调用父类的构造方法,如果没有,编译器会自动添加一个super()。在父类中存在非默认构造函数时,子类中的构造方法必须使用super(参数)来调用父类构造函数。

      具体代码:

      

    /**
     * @Time :2020/7/17 11:23
     * @Description: <类的继承>
     * @作者 :aiyumo
     */
    public class ExtendsTest {
        public static void main(String[] args){
            Student stu = new Student("xiaoming",12,68);
            stu.printParentField();
            System.out.printf("%s,年龄:%d,成绩为%d",stu.name,stu.age,stu.score);
        }
    }
    class Person2{
        protected String name;
        protected int age;
    
        public Person2(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    /*  Student类继承了Person2类的所有字段与方法,
        注意:子类不要定义与父类相同的字段,
        子类不能访问父类的private字段和方法,用protected修饰的字段可以被子类访问
        子类可以通过super.fieldName、this.name、name来访问父类的字段,其中super代表父类
        */
    class Student extends Person2{
        protected int score;
    
        public void printParentField(){
            System.out.println(this.name+this.age);
            System.out.println(name+age);
            System.out.println(super.name+super.age);
        }
        public Student(String name,int age,int score){
            /*
            任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();
            如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
            子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的
            */
            super(name,age);//自动调用父类的构造方法
            this.score = score;
        }
    }
    View Code

       类的强制转换

        1、向上转型:把一个子类类型变为父类类型的赋值  子类>父类>Object

        

    Person2 p = new Student("xiaoming",12,68);  //父类
    Student s = new Student("xiaowang",13,72);  // 子类
    Person2 p1 = s;
    Object o1 = s;
    Object o2 = p;

        2、向下转型:类类型强制转换为子类类型

           向下转型时可以使用instanceof来判断类的实例是否是指定的类型  实例变量  instanceof  类型   return  bool

    Person2 p2 = new Person2("xiaoli",14);
    Student s1 = (Student) p1;
    Student s2 = (Student) p2;  // java.lang.ClassCastException

        

         java14中可以使用  实例变量  instanceof  类型  类型变量     可以直接转换,避免后面强制转换  

    Person2 p3 = new Student("xiaozhang",14,72);
    // instanceof来判断变量指定的实例是否是指定的类型  实例 instanceof 类 返回bool
    System.out.println(p3 instanceof Person2); // true
    System.out.println(p3 instanceof Student); // false
    // java14后可以在判断时,直接转换 if (p3 instanceof Student s3)
    if (p3 instanceof Student){
            Student s3 = (Student) p3;
    }

        

  • 相关阅读:
    6 完全平方数相关
    5 三位数,每个位置不同
    Neo4j Admin Import 导入多个node和relationship
    Rust所有权
    Rust 多态
    Rust 泛型
    Rust trait
    Rust模块化
    Spring Cloud(Dalston.SR1)
    git 速度慢问题解决
  • 原文地址:https://www.cnblogs.com/aiyumo/p/13307049.html
Copyright © 2011-2022 走看看