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;
}

 

    

posted @ 2020-07-15 17:59  爱语默  阅读(192)  评论(0编辑  收藏  举报