Java对象与Java类(下)

简介: Java对象与Java类(下)

8.static关键字


概念

static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。

随着类的加载而加载

优先于对象存在

修饰的成员,被所有对象所共享

可不创建对象,直接被类调用


static属性

静态属性是类的所有对象共享的,不管创建了多少个对象,静态属性在内存中只有一个。


static方法

可以使用对象调用,也可以直接用类名调用,建议用类名直接调用

在static方法内部只能访问类的static属性,不能访问类的非static属性,因为static属性先加载。

因为在类加载的时候加载方法,非static属性还没有加载,如果在静态方法中访问非static属性,该属性找不到。


代码块

代码块在类中声明,类似一个没有名称的方法体(代码块),代码分实例块和静态块

//实例块:每次创建对象时自动调用
{
   //任何符合语法的Java代码
}
//静态块:类加载时自动调用,仅一次,与是否创建对象无关。  
static {
    //任何符合语法的Java代码
}


9.类的加载执行


image.png

创建对象时,先执行静态代码块,在执行实例代码块,然后执行构造方法。


10.包


包的概念:

包就相当于一个文件夹


包的作用:

避免类重名

按照不同功能管理类

控制访问权限


包(package)的命名规范:

在包名中,可以使用 . 号来区分包的级别;包名一般情况下是小写

1.第一级 指该项目的类型,如com等,

2.第二级 指项目所开发或者运行的公司名称,如:oracle,sun,huawei等

3.第三级 指项目的名称。

4.第四级 指项目模块的名称。如:filter等表明这个包下类的功能

包可以更好得管理逻辑相关的类,可以控制不同包之间的访问权限

导入外部包的类,关键字import


访问权限修饰符

Java语言有四个权限访问修饰符,权限从大到小依次为:

1.public :公共权限 修饰类、属性、方法。可以被任意类访问

2.protected:受保护的权限 修饰属性、方法。可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。

3.default:同包权限 修饰类、属性、方法。只能被同包的类访问

4.private:私有权限 修饰属性、方法。 只能在本类中访问


11.面向对象语言的三大特征


1.封装

封装:有时称之为数据隐藏,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问


好处:隐藏类的实现细节,方便加入控制语句,方便修改实现

具体表现是

1.属性使用private权限 (私有的)

2.方法使用public权限

例子:

public class Person {    
    private String name;    
    private String age;    
    public String getName() {        
        return name;    
    }    
    public void setName(String name) {        
        this.name = name;   
    }   
    public String getAge() {        
        return age;    
    }    
    public void setAge(String age) {        
        this.age = age;    
    }
}

我们可以发现上述代码用到了this关键字,那么什么是this关键字呢?

this关键字代表自身类的对象


功能:

1.使用this关键字引用成员变量

2.使用this关键字引用成员方法

注意:this关键字必须放在非静态方法里面

在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。


例如上面的:

this.name = name;   //把局部变量赋值给自己类的成员变量


2.多态

多态是同一个行为具有多个不同表现形式或形态的能力


多态的优点

1.消除类型之间的耦合关系

2.可替换性

3.可扩充性

4.接口性

5.灵活性

6.简化性


多态存在的三个必要条件

1.继承

2.重写

3父类引用指向子类对象:Parent p = new Child();(Child类继承了Parent 类)

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。


多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

public class Test {
    public static void main(String[] args) {
        show(new Cat());  
        show(new Dog());  
    }  
    public static void show(Animal a)  {
        a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  
            Cat c = (Cat)a;  //向下转型
            c.work();  
        } else if (a instanceof Dog) { 
            Dog c = (Dog)a;  
            c.work();  
        }  
  }  
}
public abstract class Animal {  
    abstract void eat();  
}  
public class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}
public class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

Test中的main方法输出:

image.png


同一个方法在不同情况下的表现不同,就是多态的体现。


3.继承

继承:继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。

继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力。

1.在JAVA中使用extends关键字来表示继承关系。

2.JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个直接父类。

3.继承之后子类可以调用父类的所有非私有属性和非私有方法。


什么时候使用继承呢?

当你想用一些非本类的方法或属性时,可以使用继承,继承想使用的那个类,就可以将那个类中的属性方法拿过来用,可以让你少写一些代码。所以继承是代码重用的一种方式

public class Animal{
  public static void eat(){
            System.out.println("动物吃");
        }
}
public class Dog  extends Animal{
 public static   void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
    }
}

image.png


专业术语:

Dog类是 Animal类的子类, Animal类是Dog类的父类(或者是) Dog类是 Animal类的派生类, Animal类是Dog类的基类。

继承的传递性

C类从B类继承,B类又从A类继承

那么C类就具有B类和A类的所有非私有的属性和方法

当一个没有继承任何一个类时,jvm(java虚拟机)会默认让类继承Object类

Object是 java为所有类提供的基类


继承中的构造方法

子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法

可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法

如果用super,必须写在方法的第一行

如果子类的构造方法中没有显式地(使用super)调用基类构造方法,则系统默认调用基类无参数的构造方法。

为什么要先创建父类:子类创建后需要调用父类的方法,所以在创建子类对象是父类也需要同时被创建.

我们又提到了一个新的关键字——super


super关键字用途

1.super关键字代表父类的引用,在程序中主要的用途

2.在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。

3.用“super.成员变量名”来引用父类成员变量。

4.用“super.方法名(参数列表)”的方式访问父类的方法。

与this的区别,this通常指代当前对象,super通常指代父类。


方法的重写(OverRide)

在子类中可以根据需要对从基类中继承来的方法进行重写。

方法重写规则

1.方法名相同、参数列表相同;

2.返回值类型相同;

3.访问权限等于或大于父类中方法权限;


只有方法体不同(大括弧内的代码不同)

注意:构造方法不能重写

应用场景:

当父类的方法实现不能满足子类需求时,可以对方法进行重写( override)


12.类于类之间的关系


1.关联关系(has-a)

对象和对象之间的连接。在Java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在。

就是相当于我们在我们的类中定义了一个String类型的属性,那么,我们这个类和String类就是关联关系。

即“有”的关系:”has-a”。


关联关系分为单向关联和双向关联

1.单向关联: A类关联B类。

2.双向关联:A类关联B类,B类关联A类;

public class Phone {
     private  Person per;//手机有主人
}
public  class Person {
     private Phone phone;//人拥有手机
}

关联关系的多重性

一对一关联:一个手机只能有一个主人

一对多关联:一个人,可以拥有多个手机。

解决一对多的关联的方案:集合或者数组

public List<Phone> phoneList;//集合
public Phone[] phones;//数组


2.依赖关系(uses-a)

依赖关系是指一个类A使用到了另一个类B,也就是说一个类的方法使用或者操作另一个类的对象

依赖关系的特性:

这种关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。

依赖具体表现

1.在代码层面,依赖关系表现为类B作为参数被类A在某个方法中使用

例:

public  class Person {
      public void travel(Bus bus){}
}

注意:

应该尽量减少类与类之间有这种关系


3.继承关系(is-a)

这种关系在上文中有过解释,在这就不赘述了,写在这只是表明类与类还有这种关系。

目录
相关文章
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
143 57
|
3天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
52 8
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
73 17
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
133 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
76 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
58 4